0% found this document useful (0 votes)
1K views41 pages

Practical No.1: Aim: Write A Program For 2D Line Drawing As Raster Graphics Display. Code

The document contains 5 practical programs related to computer graphics and raster graphics display: 1. A program to draw a line between two points using raster graphics. 2. A program to draw a circle by calculating circle points using raster graphics. 3. A program to fill a polygon by checking each pixel and applying a fill color. 4. A program for line clipping that clips a line segment if it lies outside the clipping window boundaries. 5. A program for polygon clipping that clips a polygon by dividing edge segments at the clipping boundaries.

Uploaded by

Ashish Sharma
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
1K views41 pages

Practical No.1: Aim: Write A Program For 2D Line Drawing As Raster Graphics Display. Code

The document contains 5 practical programs related to computer graphics and raster graphics display: 1. A program to draw a line between two points using raster graphics. 2. A program to draw a circle by calculating circle points using raster graphics. 3. A program to fill a polygon by checking each pixel and applying a fill color. 4. A program for line clipping that clips a line segment if it lies outside the clipping window boundaries. 5. A program for polygon clipping that clips a polygon by dividing edge segments at the clipping boundaries.

Uploaded by

Ashish Sharma
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 41

Practical No.

1
Aim: Write a program for 2D line drawing as Raster Graphics Display.
Code:

#include<stdio.h>
#include<conio.h>
#include<graphics.h>

void main()
{
int input;
int x,y,x1,y1,x2,y2,p,dx,dy;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"C:\\TURBOC3\\BGI");
printf("\nEnter the x-coordinate of the first point :: ");
scanf("%d",&x1);
printf("\nEnter the y-coordinate of the first point :: ");
scanf("%d",&y1);
printf("\nEnter the x-coordinate of the second point :: ");
scanf("%d",&x2);
printf("\nEnter the y-coordinate of the second point :: ");
scanf("%d",&y2);
x=x1; y=y1; dx=x2-x1; dy=y2-y1;
putpixel(x,y,2);
p=((2*dy)-dx);
while(x<=x2)
{
if(p<0)
{
x=x+1; p=2*x-dx;
}
else
{
x=x+1; y=y+1; p=p+2*dy;
}
putpixel(x,y,7);
}
getch();
closegraph();
}

1
Output:

2
Practical No.2
Aim: Write a program for circle drawing as Raster Graphics Display.
Code:

#include<stdio.h>
#include<conio.h>
#include<graphics.h>

void circlepoints(int,int);

void main()
{
int x,y,p,r;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"C:\\TURBOC3\\BGI");
clrscr();
printf("Enter the radius for the required circle : ");
scanf("%d",&r);
x=0; y=r; p=1-r;
while(x<y)
{
x++;
if(p>0)
{
p=p+2*(x-y)+1; y--;
}
else
p=p+2*x+1;
circlepoints(x,y);
}
getch();
closegraph();
}

void circlepoints(int x,int y)


{
putpixel( x+300, y+300,8);
putpixel( x+300,-y+300,8);
putpixel(-x+300, y+300,8);
putpixel(-x+300,-y+300,8);
putpixel( y+300, x+300,8);
putpixel( y+300,-x+300,8);
putpixel(-y+300, x+300,8);
putpixel(-y+300,-x+300,8);
}

3
Output:

4
Practical No.3
Aim: Write a program for polygon filling as Raster Graphics Display.
Code:

#include<conio.h>
#include<iostream.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
#include<process.h>

void main()
{
int graphdriver=DETECT,graphmode;
initgraph(&graphdriver,&graphmode,"C:\\TURBOC3\\BGI");
int p=1,x;
int a[12]={100,100,150,150,200,100,200,200,100,200,100,100};
cout<<" Filling the Polygon drawn below\n";
delay(1000);
drawpoly(6,a);
delay(2000);
delay(500);
for(int i=100;i<200;i++)
{
p=1;
for(int j=100;j<=200;j++)
{
x=getpixel(j,i);
for(int d=0;d<11;d++)
{
if(j==a[d]&&i==a[d+1] )
break;
else
{
if(x>0&&d==10)
p++;
if(p%2==0)
putpixel(j,i,4);
}
}
}
}
getch();
closegraph();
}

5
Output:

6
Practical No.4
Aim: Write a program for line clipping.
Code:

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<dos.h>

void storepoints(int,int,int,int,int,int,int[]);

void main()
{
int gdriver=DETECT,gmode;
int x1,x2,y1,y2,xmax,ymax,xmin,ymin,a[10],b[10],xi1,xi2,yi1,yi2,flag=0;
float m;
int i;
clrscr();
printf("output");
printf("\n");
printf("Enter the value of x1,y1,x2,y2: >");
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("Enter the value of xmax,ymax,xmin,ymin:>");
scanf("%d%d%d%d",&xmax,&ymax,&xmin,&ymin);
storepoints(x2,y2,ymin,ymax,xmax,xmin,b);
for(i=1;i<=4;i++)
{
if(a[i]*b[i]==0)
flag=1;
else
flag=0;
}
if(flag==1)
{
m=(y2-y1)/(x2-x1);
xi1=x1;
yi1=y1;
}
if(a[1]==1)
{
yi1=ymax;
xi1=x1+((1/m)*(yi1-y1));
}
else
{
if(a[2]==1)
{
7
yi1=ymin;
xi1=x1+((1/m)*(yi1-y1));
}
}
if(a[3]==1)
{
xi1=xmax;
yi1=y1+(m*(xi1-x1));
}
if(a[4]==1)
{
xi1=xmin;
yi1=y1+(m*(xi1-x1));
}
else if(b[1]==1)
{
yi2=ymax;
xi2=x2+((1/m)*(yi2-y2));
}
else if(b[2]==1)
{
yi2=ymin;
xi2=x2+((1/m)*(yi2-y2));
}
else if(b[3]==1)
{
xi2=xmax;
yi2=y2+((1/m)*(xi2-x2));
}
else if(b[4]==1)
{
xi2=xmin;
yi2=y2+(m*(xi2-x2));
}
clrscr();
initgraph(&gdriver,&gmode,"C:\\TURBOC3\\BGI");
rectangle(xmin,ymin,xmax,ymax);
line(x1,y1,x2,y2);
delay(1700);
closegraph();
clrscr();
initgraph(&gdriver,&gmode,"C:\\TURBOC3\\BGI");
line(xi1,yi1,xi2,yi2);
rectangle(xmin,ymin,xmax,ymax);
if(flag==0)
{
printf("\n no clipping is required");

8
}
getch();
closegraph();
}

void storepoints(int x1,int y1,int ymax,int xmax,int xmin,int ymin,int c[10])


{
if((y1-ymax)>0)
c[1]=1;
else
c[1]=0;

if((ymin-y1)>0)
c[2]=1;
else
c[2]=0;

if((x1-xmax)>0)
c[3]=1;
else
c[3]=0;

if((xmin-x1)>0)
c[4]=1;
else
c[4]=0;
}

9
Output:

10
11
Practical No.5
Aim: Write a program for polygon clipping.
Code:

#include<iostream.h>
#include<conio.h>
#include<graphics.h>
#define round(a) ((int)(a+0.5))

int k;
float xmin,ymin,xmax,ymax,arr[20],m;

void clipl(float x1,float y1,float x2,float y2)


{
if(x2-x1)
m=(y2-y1)/(x2-x1);
else
m=100000;
if(x1 >= xmin && x2 >= xmin)
{
arr[k]=x2;
arr[k+1]=y2;
k+=2;
}
if(x1 < xmin && x2 >= xmin)
{
arr[k]=xmin;
arr[k+1]=y1+m*(xmin-x1);
arr[k+2]=x2;
arr[k+3]=y2;
k+=4;
}
if(x1 >= xmin && x2 < xmin)
{
arr[k]=xmin;
arr[k+1]=y1+m*(xmin-x1);
k+=2;
}
}

void clipt(float x1,float y1,float x2,float y2)


{
if(y2-y1)
m=(x2-x1)/(y2-y1);
else
m=100000;
if(y1 <= ymax && y2 <= ymax)
12
{
arr[k]=x2;
arr[k+1]=y2;
k+=2;
}
if(y1 > ymax && y2 <= ymax)
{
arr[k]=x1+m*(ymax-y1);
arr[k+1]=ymax;
arr[k+2]=x2;
arr[k+3]=y2;
k+=4;
}
if(y1 <= ymax && y2 > ymax)
{
arr[k]=x1+m*(ymax-y1);
arr[k+1]=ymax;
k+=2;
}
}

void clipr(float x1,float y1,float x2,float y2)


{
if(x2-x1)
m=(y2-y1)/(x2-x1);
else
m=100000;
if(x1 <= xmax && x2 <= xmax)
{
arr[k]=x2;
arr[k+1]=y2;
k+=2;
}
if(x1 > xmax && x2 <= xmax)
{
arr[k]=xmax;
arr[k+1]=y1+m*(xmax-x1);
arr[k+2]=x2;
arr[k+3]=y2;
k+=4;
}
if(x1 <= xmax && x2 > xmax)
{
arr[k]=xmax;
arr[k+1]=y1+m*(xmax-x1);
k+=2;
}

13
}

void clipb(float x1,float y1,float x2,float y2)


{
if(y2-y1)
m=(x2-x1)/(y2-y1);
else
m=100000;
if(y1 >= ymin && y2 >= ymin)
{
arr[k]=x2;
arr[k+1]=y2;
k+=2;
}
if(y1 < ymin && y2 >= ymin)
{
arr[k]=x1+m*(ymin-y1);
arr[k+1]=ymin;
arr[k+2]=x2;
arr[k+3]=y2;
k+=4;
}
if(y1 >= ymin && y2 < ymin)
{
arr[k]=x1+m*(ymin-y1);
arr[k+1]=ymin;
k+=2;
}
}

void main()
{
int gdriver=DETECT,gmode,n,poly[20];
float xi,yi,xf,yf,polyy[20];
clrscr();
cout<<"Coordinates of rectangular clip window :\nxmin,ymin :";
cin>>xmin>>ymin;
cout<<"xmax,ymax :";
cin>>xmax>>ymax;
cout<<"\n\nPolygon to be clipped :\nNumber of sides :";
cin>>n;
cout<<"Enter the coordinates :";
for(int i=0;i < 2*n;i++)
cin>>polyy[i];
polyy[i]=polyy[0];
polyy[i+1]=polyy[1];
for(i=0;i < 2*n+2;i++)

14
poly[i]=round(polyy[i]);
initgraph(&gdriver,&gmode,"C:\\TURBOC3\\BGI");
setcolor(RED);
rectangle(xmin,ymax,xmax,ymin);
cout<<"\t\tUNCLIPPED POLYGON";
setcolor(WHITE);
fillpoly(n,poly);
getch();
cleardevice();
k=0;
for(i=0;i < 2*n;i+=2)
clipl(polyy[i],polyy[i+1],polyy[i+2],polyy[i+3]);
n=k/2;
for(i=0;i < k;i++)
polyy[i]=arr[i];
polyy[i]=polyy[0];
polyy[i+1]=polyy[1];
k=0;
for(i=0;i < 2*n;i+=2)
clipt(polyy[i],polyy[i+1],polyy[i+2],polyy[i+3]);
n=k/2;
for(i=0;i < k;i++)
polyy[i]=arr[i];
polyy[i]=polyy[0];
polyy[i+1]=polyy[1];
k=0;
for(i=0;i < 2*n;i+=2)
clipr(polyy[i],polyy[i+1],polyy[i+2],polyy[i+3]);
n=k/2;
for(i=0;i < k;i++)
polyy[i]=arr[i];
polyy[i]=polyy[0];
polyy[i+1]=polyy[1];
k=0;
for(i=0;i < 2*n;i+=2)
clipb(polyy[i],polyy[i+1],polyy[i+2],polyy[i+3]);
for(i=0;i < k;i++)
poly[i]=round(arr[i]);
if(k)
fillpoly(k/2,poly);
setcolor(RED);
rectangle(xmin,ymax,xmax,ymin);
cout<<"\tCLIPPED POLYGON";
getch();
closegraph();
}

15
Output:

16
17
Practical No.6
Aim: Write a program for displaying 3D objects as 2D display using perspective transformation.
Code:

#include<stdio.h>
#include<math.h>
#include<graphics.h>

main()
{
int x1,y1,x2,y2,gd,gm;
int ymax,a[4][8];
float par[4][4],b[4][8];
int i,j,k,m,n,p;
int xp, yp, zp, x, y, z;

a[0][0] = 100; a[1][0] = 100; a[2][0] = -100;


a[0][1] = 200; a[1][1] = 100; a[2][1] = -100;

a[0][2] = 200; a[1][2] = 200; a[2][2] = -100;


a[0][3] = 100; a[1][3] = 200; a[2][3] = -100;

a[0][4] = 100; a[1][4] = 100; a[2][4] = -200;


a[0][5] = 200; a[1][5] = 100; a[2][5] = -200;

a[0][6] = 200; a[1][6] = 200; a[2][6] = -200;


a[0][7] = 100; a[1][7] = 200; a[2][7] = -200;

detectgraph(&gd,&gm);
initgraph(&gd,&gm, "c:\\TURBOC3\\BGI");

ymax = getmaxy();
xp = 300; yp = 320; zp = 100;

for(j=0; j<8; j++)


{
x = a[0][j]; y = a[1][j]; z = a[2][j];
b[0][j] = xp - ( (float)( x - xp )/(z - zp)) * (zp);
b[1][j] = yp - ( (float)( y - yp )/(z - zp)) * (zp);
}

/*- front plane display -*/

for(j=0;j<3;j++)
{
x1=(int) b[0][j]; y1=(int) b[1][j];
18
x2=(int) b[0][j+1]; y2=(int) b[1][j+1];
line( x1,ymax-y1,x2,ymax-y2);
}
x1=(int) b[0][3]; y1=(int) b[1][3];
x2=(int) b[0][0]; y2=(int) b[1][0];
line( x1, ymax-y1, x2, ymax-y2);

/*- back plane display -*/


setcolor(11);
for(j=4;j<7;j++)
{
x1=(int) b[0][j]; y1=(int) b[1][j];
x2=(int) b[0][j+1]; y2=(int) b[1][j+1];
line( x1, ymax-y1, x2, ymax-y2);
}
x1=(int) b[0][7]; y1=(int) b[1][7];
x2=(int) b[0][4]; y2=(int) b[1][4];
line( x1, ymax-y1, x2, ymax-y2);

setcolor(7);
for(i=0;i<4;i++)
{
x1=(int) b[0][i]; y1=(int) b[1][i];
x2=(int) b[0][4+i]; y2=(int) b[1][4+i];
line( x1, ymax-y1, x2, ymax-y2);
}
getch(); getch();
}

19
Output:

20
Practical No.7
Aim: Write a program for rotation of 3D object about arbitrary axis.
Code:

#include <stdio.h>
#include <graphics.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>

#define ORG -50

double face1[5][2] = {
{ 250, 125 },
{ 350, 125 },
{ 350, 225 },
{ 250, 225 },
{ 250, 125 }
};

double face2[5][2] = {
{ 250+ORG, 125-ORG },
{ 350+ORG, 125-ORG },
{ 350+ORG, 225-ORG },
{ 250+ORG, 225-ORG },
{ 250+ORG, 125-ORG }
};

double angle = 5.0 * M_PI / 180;


double midx1, midy1, midx2, midy2;

void rotate (void)


{
int i;
for (i=0; i<5; i++)
{
double xnew, ynew;

xnew = midx1 + (face1[i][0] - midx1) * cos (angle) - (face1[i][1] - midy1) * sin (angle);
ynew = midy1 + (face1[i][0] - midx1) * sin (angle) + (face1[i][1] - midy1) * cos (angle);

face1[i][0] = xnew;
face1[i][1] = ynew;

xnew = midx2 + (face2[i][0] - midx2) * cos (angle) - (face2[i][1] - midy2) * sin (angle);
ynew = midy2 + (face2[i][0] - midx2) * sin (angle) + (face2[i][1] - midy2) * cos (angle);
21
face2[i][0] = xnew;
face2[i][1] = ynew;
}

cleardevice();

for (i=0; i<4; i++)


{
setcolor(7);
line (face1[i][0], face1[i][1], face1[i+1][0], face1[i+1][1]);
setcolor(8);
line (face2[i][0], face2[i][1], face2[i+1][0], face2[i+1][1]);
setcolor(9);
line (face1[i][0], face1[i][1], face2[i][0], face2[i][1]);
}

delay (125);
}

void main()
{
int gd = DETECT, gm;

midx1 = (face1[0][0] + face1[1][0]) / 2.0;


midy1 = (face1[1][1] + face1[2][1]) / 2.0;
midx2 = (face2[0][0] + face2[1][0]) / 2.0;
midy2 = (face2[1][1] + face2[2][1]) / 2.0;

initgraph (&gd, &gm, "C:\\TURBOC3\\BGI");

while (!kbhit())
rotate();

closegraph();
}

22
Output:

23
Practical No.8
Aim: Write a program to rotate a triangle about origin.
Code:

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<process.h>
#include<math.h>

void triangle(int x1,int y1,int x2,int y2,int x3,int y3);


void Rotate(int x1,int y1,int x2,int y2,int x3,int y3);

void main()
{
int gd=DETECT,gm;
int x1,y1,x2,y2,x3,y3;
initgraph(&gd,&gm,"C:\\TURBOC3\\BGI");
printf("Enter the 1st point for the triangle:");
scanf("%d%d",&x1,&y1);
printf("Enter the 2nd point for the triangle:");
scanf("%d%d",&x2,&y2);
printf("Enter the 3rd point for the triangle:");
scanf("%d%d",&x3,&y3);
triangle(x1,y1,x2,y2,x3,y3);
getch();
cleardevice();
Rotate(x1,y1,x2,y2,x3,y3);
setcolor(1);
triangle(x1,y1,x2,y2,x3,y3);
getch();
}

void triangle(int x1,int y1,int x2,int y2,int x3,int y3)


{
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x1,y1);
}

void Rotate(int x1,int y1,int x2,int y2,int x3,int y3)


{
int x,y,a1,b1,a2,b2,a3,b3,p=x2,q=y2;
float Angle;
printf("Enter the angle for rotation:");
scanf("%f",&Angle);
cleardevice();
24
Angle=(Angle*3.14)/180;
a1=p+(x1-p)*cos(Angle)-(y1-q)*sin(Angle);
b1=q+(x1-p)*sin(Angle)+(y1-q)*cos(Angle);
a2=p+(x2-p)*cos(Angle)-(y2-q)*sin(Angle);
b2=q+(x2-p)*sin(Angle)+(y2-q)*cos(Angle);
a3=p+(x3-p)*cos(Angle)-(y3-q)*sin(Angle);
b3=q+(x3-p)*sin(Angle)+(y3-q)*cos(Angle);
printf("Rotate");
triangle(a1,b1,a2,b2,a3,b3);
}

25
Output:

26
Practical No.9
Aim: Write a program to implement Bezier curves for a given set of control points..
Code:

#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <math.h>

void bezier (int x[4], int y[4])


{
int gd = DETECT, gm;
int i;
double t;

initgraph (&gd, &gm, "C:\\TURBOC3\\BGI");

for (t = 0.0; t < 1.0; t += 0.0005)


{
double xt = pow (1-t, 3) * x[0] + 3 * t * pow (1-t, 2) * x[1] +
3 * pow (t, 2) * (1-t) * x[2] + pow (t, 3) * x[3];

double yt = pow (1-t, 3) * y[0] + 3 * t * pow (1-t, 2) * y[1] +


3 * pow (t, 2) * (1-t) * y[2] + pow (t, 3) * y[3];

putpixel (xt, yt, WHITE);


}

for (i=0; i<4; i++)


putpixel (x[i], y[i], YELLOW);

getch();
closegraph();
}

void main()
{
int x[4], y[4];
int i;

printf ("Enter the x- and y-coordinates of the four control points.\n");


for (i=0; i<4; i++)
scanf ("%d%d", &x[i], &y[i]);

bezier (x, y);


}

27
Output:

28
Practical No.10
Aim: Write a program for Z-Buffer Algorithm.
Code:

_2Dpoint.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Graphics3Dto2D
{
class Screen
{
public _2Dpoint center;
public _2Dpoint size;
public Screen()
{
center = new _2Dpoint(720, 420);
size = new _2Dpoint(800, 800);
}
}
}

_3Dpoint.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Graphics3Dto2D
{
class _3Dpoint
{
public double x, y, z;
public _3Dpoint(double xx, double yy, double zz)
{
x = xx;
y = yy;
z = zz;
}
public _3Dpoint()
{

29
x = 0;
y = 0;
z = 0;
}
public _3Dpoint(_3Dpoint Object)
{
this.x = Object.x;
this.y = Object.y;
this.z = Object.z;
}
}
}

Camera.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Graphics3Dto2D
{
class Camera
{
public _3Dpoint from;
public _3Dpoint to;
public _3Dpoint up;
public double angleh, anglev;
public double zoom;
public double front, back;
public short projection;
public Camera()
{
from = new _3Dpoint(0, -50, 0);
to = new _3Dpoint(0, 50, 0);
up = new _3Dpoint(0, 0, 1);
angleh = 45.0;
anglev = 45.0;
zoom = 1.0;
front = 1.0;
back = 200.0;
projection = 0;

}
}
}

30
Coefficient_Of_Plane.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Graphics3Dto2D
{
class Coefficient_Of_Plane
{
public double A, B, C, D;
public Coefficient_Of_Plane()
{
A = B = C = D = 0;
}
}
}

DepthBuffer.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;

namespace Graphics3Dto2D
{
class DepthBuffer
{

public Coefficient_Of_Plane COPLANE;


public DepthBuffer()
{
COPLANE = new Coefficient_Of_Plane();
}
public Coefficient_Of_Plane Coefficient_Value(_3Dpoint pt1, _3Dpoint pt2, _3Dpoint pt3)
{
// double Y = 0;
Coefficient_Of_Plane pt;
pt = new Coefficient_Of_Plane();
pt.A = (pt2.z - pt3.z) * (pt1.y - pt2.y) - (pt1.z - pt2.z) * (pt2.y - pt3.y);
pt.B = (pt2.x - pt3.x) * (pt1.z - pt2.z) - (pt1.x - pt2.x) * (pt2.z - pt3.z);
pt.C = (pt2.y - pt3.y) * (pt1.x - pt2.x) - (pt1.y - pt2.y) * (pt2.x - pt3.x);
pt.D = - pt1.x * (pt2.y * pt3.z - pt2.z * pt3.y) + pt1.y * (pt2.x * pt3.z - pt2.z * pt3.x) - pt1.z * (pt2.x *
pt3.y - pt2.y * pt3.x);

31
return pt;
}
public double DepthValue(Coefficient_Of_Plane surface,int x,int y)
{
double z = 200;
if (surface.B != 0)
z = (-surface.A * x - surface.C * y - surface.D) / surface.B;
return z;
}
public bool CheckInside(Point point1, Point point2, Point point3, int x, int y)
{
float fxyC, fxy;
fxyC = point3.Y * (point2.X - point1.X) - point3.X * (point2.Y - point1.Y) + point1.X * (point2.Y -
point1.Y) - point1.Y * (point2.X - point1.X);
fxy = y * (point2.X - point1.X) - x * (point2.Y - point1.Y) + point1.X * (point2.Y - point1.Y) - point1.Y *
(point2.X - point1.X);
if (((fxyC <= 0) && (fxy <= 0)) || ((fxyC >= 0) && (fxy >= 0)))
return true;
else
return false;
}
//Subroutine to check any point(x,y) inside the triangle
public bool inside_triangle_check(Point pt1, Point pt2, Point pt3, int x, int y)
{
bool check = CheckInside(pt1, pt2, pt3, x, y) && CheckInside(pt2, pt3, pt1, x, y) && CheckInside(pt3,
pt1, pt2, x, y);
if (check == true) return true;
else return false;
}
}
}

32
Projection.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Graphics3Dto2D
{
class Projection
{
private _3Dpoint origin;
private _3Dpoint e1, e2, n1, n2;
private Camera camera;
private Screen screen;
private double tanthetah, tanthetav;
private _3Dpoint basisa, basisb, basisc;
private double EPSILON;
private double DTOR;// 0.01745329252
public _2Dpoint p1;
public _2Dpoint p2;
public Projection()
{
EPSILON = 0.001;
DTOR = 0.01745329252;
camera = new Camera();
screen = new Screen();
origin = new _3Dpoint();
basisa = new _3Dpoint();
basisb = new _3Dpoint();
basisc = new _3Dpoint();
p1 = new _2Dpoint();
p2 = new _2Dpoint();
e1 = new _3Dpoint();
e2 = new _3Dpoint();
n1 = new _3Dpoint();
n2 = new _3Dpoint();
if (Trans_Initialise() != true)
{
MessageBox.Show("Error in initializing variable");
}
}

public bool Trans_Initialise()


{
/* Is the camera position and view vector coincident ? */

33
if (EqualVertex(camera.to, camera.from))
{
return (false);
}
/* Is there a legal camera up vector ? */
if (EqualVertex(camera.up, origin))
{
return (false);
}
basisb.x = camera.to.x - camera.from.x;
basisb.y = camera.to.y - camera.from.y;
basisb.z = camera.to.z - camera.from.z;
Normalise(basisb);
basisa = CrossProduct(camera.up, basisb);
Normalise(basisa);
/* Are the up vector and view direction colinear */
if (EqualVertex(basisa, origin))
{
return (false);
}
basisc = CrossProduct(basisb, basisa);
/* Do we have legal camera apertures ? */
if (camera.angleh < EPSILON || camera.anglev < EPSILON)
{
return (false);
}
/* Calculate camera aperture statics, note: angles in degrees */
tanthetah = Math.Tan(camera.angleh * DTOR / 2);
tanthetav = Math.Tan(camera.anglev * DTOR / 2);
/* Do we have a legal camera zoom ? */
if (camera.zoom < EPSILON)
{
return (false);
}
/* Are the clipping planes legal ? */
if (camera.front < 0 || camera.back < 0 || camera.back <= camera.front)
{
return (false);
}
return true;
}
public void Trans_World2Eye(_3Dpoint w, _3Dpoint e)
{
/* Translate world so that the camera is at the origin */
w.x -= camera.from.x;
w.y -= camera.from.y;
w.z -= camera.from.z;

34
/* Convert to eye coordinates using basis vectors */
e.x = w.x * basisa.x + w.y * basisa.y + w.z * basisa.z;
e.y = w.x * basisb.x + w.y * basisb.y + w.z * basisb.z;
e.z = w.x * basisc.x + w.y * basisc.y + w.z * basisc.z;
}
public bool Trans_ClipEye(_3Dpoint e1, _3Dpoint e2)
{
double mu;
/* Is the vector totally in front of the front cutting plane ? */
if (e1.y <= camera.front && e2.y <= camera.front)
{
return (false);
}
/* Is the vector totally behind the back cutting plane ? */
if (e1.y >= camera.back && e2.y >= camera.back)
{
return (false);
}
/* Is the vector partly in front of the front cutting plane ? */
if ((e1.y < camera.front && e2.y > camera.front) ||
(e1.y > camera.front && e2.y < camera.front))
{
mu = (camera.front - e1.y) / (e2.y - e1.y);
if (e1.y < camera.front)
{
e1.x = e1.x + mu * (e2.x - e1.x);
e1.z = e1.z + mu * (e2.z - e1.z);
e1.y = camera.front;
}
else
{
e2.x = e1.x + mu * (e2.x - e1.x);
e2.z = e1.z + mu * (e2.z - e1.z);
e2.y = camera.front;
}
}
/* Is the vector partly behind the back cutting plane ? */
if ((e1.y < camera.back && e2.y > camera.back) ||
(e1.y > camera.back && e2.y < camera.back))
{
mu = (camera.back - e1.y) / (e2.y - e1.y);
if (e1.y < camera.back)
{
e2.x = e1.x + mu * (e2.x - e1.x);
e2.z = e1.z + mu * (e2.z - e1.z);
e2.y = camera.back;
}

35
else
{
e1.x = e1.x + mu * (e2.x - e1.x);
e1.z = e1.z + mu * (e2.z - e1.z);
e1.y = camera.back;
}
}
return (true);
}
public void Trans_Eye2Norm(_3Dpoint e, _3Dpoint n)
{
double d;

if (camera.projection == 0)
{
d = camera.zoom / e.y;
n.x = d * e.x / tanthetah;
n.y = e.y;
n.z = d * e.z / tanthetav;
}
else
{
n.x = camera.zoom * e.x / tanthetah;
n.y = e.y;
n.z = camera.zoom * e.z / tanthetav;
}
}
public bool Trans_ClipNorm(_3Dpoint n1, _3Dpoint n2)
{
double mu;
/* Is the line segment totally right of x = 1 ? */
if (n1.x >= 1 && n2.x >= 1)
return (false);
/* Is the line segment totally left of x = -1 ? */
if (n1.x <= -1 && n2.x <= -1)
return (false);
/* Does the vector cross x = 1 ? */
if ((n1.x > 1 && n2.x < 1) || (n1.x < 1 && n2.x > 1))
{
mu = (1 - n1.x) / (n2.x - n1.x);
if (n1.x < 1)
{
n2.z = n1.z + mu * (n2.z - n1.z);
n2.x = 1;
}
else
{

36
n1.z = n1.z + mu * (n2.z - n1.z);
n1.x = 1;
}
}
/* Does the vector cross x = -1 ? */
if ((n1.x < -1 && n2.x > -1) || (n1.x > -1 && n2.x < -1))
{
mu = (-1 - n1.x) / (n2.x - n1.x);
if (n1.x > -1)
{
n2.z = n1.z + mu * (n2.z - n1.z);
n2.x = -1;
}
else
{
n1.z = n1.z + mu * (n2.z - n1.z);
n1.x = -1;
}
}
/* Is the line segment totally above z = 1 ? */
if (n1.z >= 1 && n2.z >= 1)
return (false);
/* Is the line segment totally below z = -1 ? */
if (n1.z <= -1 && n2.z <= -1)
return (false);
/* Does the vector cross z = 1 ? */
if ((n1.z > 1 && n2.z < 1) || (n1.z < 1 && n2.z > 1))
{
mu = (1 - n1.z) / (n2.z - n1.z);
if (n1.z < 1)
{
n2.x = n1.x + mu * (n2.x - n1.x);
n2.z = 1;
}
else
{
n1.x = n1.x + mu * (n2.x - n1.x);
n1.z = 1;
}
}
/* Does the vector cross z = -1 ? */
if ((n1.z < -1 && n2.z > -1) || (n1.z > -1 && n2.z < -1))
{
mu = (-1 - n1.z) / (n2.z - n1.z);
if (n1.z > -1)
{
n2.x = n1.x + mu * (n2.x - n1.x);

37
n2.z = -1;
}
else
{
n1.x = n1.x + mu * (n2.x - n1.x);
n1.z = -1;
}
}
return (true);
}
public void Trans_Norm2Screen(_3Dpoint norm, _2Dpoint projected)
{
//MessageBox.Show("the value of are");
projected.h = Convert.ToInt32(screen.center.h - screen.size.h * norm.x / 2);
projected.v = Convert.ToInt32(screen.center.v - screen.size.v * norm.z / 2);
}
//public bool Trans_Point();
public bool Trans_Line(_3Dpoint w1, _3Dpoint w2)
{
Trans_World2Eye(w1, e1);
Trans_World2Eye(w2, e2);
if (Trans_ClipEye(e1, e2))
{
Trans_Eye2Norm(e1, n1);
Trans_Eye2Norm(e2, n2);
if (Trans_ClipNorm(n1, n2))
{
Trans_Norm2Screen(n1, p1);
Trans_Norm2Screen(n2, p2);
return (true);
}
}
return (true);
}
public bool Trans_Point(_3Dpoint w1)
{
Trans_World2Eye(w1, e1);
if (e1.y >= camera.front && e1.y <= camera.back)
{
Trans_Eye2Norm(e1, n1);
if (n1.x >= -1 && n1.x <= 1 && n1.z >= -1 && n1.z <= 1)
{
Trans_Norm2Screen(n1, p1);
return true;
}
}
return false;

38
}
public void Normalise(_3Dpoint v)
{
double length;
length = Math.Sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
v.x /= length;
v.y /= length;
v.z /= length;
}
public _3Dpoint CrossProduct(_3Dpoint p1, _3Dpoint p2)
{
_3Dpoint p3;
p3 = new _3Dpoint(0, 0, 0);
p3.x = p1.y * p2.z - p1.z * p2.y;
p3.y = p1.z * p2.x - p1.x * p2.z;
p3.z = p1.x * p2.y - p1.y * p2.x;
return p3;
}
public bool EqualVertex(_3Dpoint p1, _3Dpoint p2)
{
if (Math.Abs(p1.x - p2.x) > EPSILON)
return (false);
if (Math.Abs(p1.y - p2.y) > EPSILON)
return (false);
if (Math.Abs(p1.z - p2.z) > EPSILON)
return (false);

return (true);
}
}
}

Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace Graphics3Dto2D
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]

39
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}

Screen.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Graphics3Dto2D
{
class Screen
{
public _2Dpoint center;
public _2Dpoint size;
public Screen()
{
center = new _2Dpoint(720, 420);
size = new _2Dpoint(800, 800);
}
}
}

40
Output:

41

You might also like