Вы находитесь на странице: 1из 21

Program For Bezier Curves

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
int gd,gm,maxx,maxy;
float xxx[4][2];
void line1(float x2,float y2)
{
line(xxx[0][0],xxx[0][1],x2,y2);
xxx[0][0]=x2;
xxx[0][1]=y2;
}
void bezier(float xb,float yb,float xc,float yc,float
xd,float yd,int n)
{
float xab,yab,xbc,ybc,xcd,ycd;
float xabc,yabc,xbcd,ybcd;
float xabcd,yabcd;
if(n==0)
{
line1(xb,yb);
line1(xc,yc);
line1(xd,yd);
}
else
{
xab=(xxx[0][0]+xb)/2;
yab=(xxx[0][1]+yb)/2;
xbc=(xb+xc)/2;
ybc=(yb+yc)/2;
xcd=(xc+xd)/2;
ycd=(yc+yd)/2;
xabc=(xab+xbc)/2;
yabc=(yab+ybc)/2;
xbcd=(xbc+xcd)/2;
ybcd=(ybc+ycd)/2;
xabcd=(xabc+xbcd)/2;
yabcd=(yabc+ybcd)/2;
n=n-1;
bezier(xab,yab,xabc,yabc,xabcd,yabcd,n);
bezier(xbcd,ybcd,xcd,ycd,xd,yd,n);
}
}
void main()
{
int i;
float temp1,temp2;
for(i=0;i<4;i++)
{

printf("enter (x)coordinat of point%d : ",i+1);


scanf("%f",&temp1);
printf("enter (y)coordinat of point%d : ",i+1);
scanf("%f",&temp2);
xxx[i][0]=temp1;
xxx[i][1]=temp2;
}
detectgraph(&gd,&gm);
initgraph(&gd,&gm,"c:\\tc\\bgi");
line(0,240,640,240);
line(320,0,320,640);
outtextxy(590,260,"x-axis");
outtextxy(320,430,"y-axis");
outtextxy(200,5,"Bezier Curves");
bezier(xxx[1][0],xxx[1][1],xxx[2][0],xxx[2][1],xxx[3]
[0],xxx[3][1],8);
getch();
closegraph();
}

Program For Scan Line Algorithm

For Filling Polygon

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
/* Defining the structure to store edges */
struct edge
{
int x1;
int y1;
int x2;
int y2;
int flag;
};
void main()
{
int gd = DETECT, gm, n, i, j, k;
struct edge ed[10],temped;
float dx,dy,m[10],x_int[10],inter_x[10];
int x[10],y[10],ymax = 0, ymin = 480, yy,temp;
initgraph (&gd, &gm, "c:\\tc\\bgi");
/* Read the number of vertices of the polygon */
printf("Enter the number vertices of the graph: ");
scanf("%d", &n);
/* Read the vertices of the polygon and also find Ymax
and Ymin */
printf("Enter the vertices: \n");
for(i = 0; i < n; i++)
{
printf("x[%d] : ", i);
scanf("%d", &x[i]);
printf("y[%d] : ", i);
scanf("%d", &y[i]);
if(y[i] > ymax)
ymax = y[i];
if(y[i] < ymin)
ymin = y[i];
ed[i].x1 = x[i];
ed[i].y1 = y[i];
}
cleardevice();
line(0,240,640,240);
line(320,0,320,640);
outtextxy(590,260,"x-axis");
outtextxy(320,430,"y-axis");
outtextxy(200,5,"Scan Line Algorithm For Filling
Polygon");
/* Store the edge information */
for(i=0;i<n-1;i++)
{
ed[i].x2 = ed[i+1].x1;

ed[i].y2 = ed[i+1].y1;
ed[i].flag=0;
}
ed[i].x2 = ed[0].x1;
ed[i].y2 = ed[0].y1;
ed[i].flag=0;
/* Check for y1>y2, if not interchange y1 and y2
with corresponding x1 and x2 */
for(i=0;i<n;i++)
{
if(ed[i].y1 < ed[i].y2)
{
temp = ed[i].x1;
ed[i].x1=ed[i].x2;
ed[i].x2=temp;
temp = ed[i].y1;
ed[i].y1=ed[i].y2;
ed[i].y2=temp;
}
}
/* Draw the polygon */
for(i=0;i<n;i++)
{
line(ed[i].x1,ed[i].y1,ed[i].x2,ed[i].y2);
}
/* sorting of edges in the order of y1,y2,x1 */
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1;j++)
{
if(ed[j].y1<ed[j+1].y1)
{
temped = ed[j];
ed[j]=ed[j+1];
ed[j+1] = temped;
}
if(ed[j].y1==ed[j+1].y1)
{
if(ed[j].y2<ed[j+1].y2)
{
temped = ed[j];
ed[j]=ed[j+1];
ed[j+1] = temped;
}
if(ed[j].y2==ed[j+1].y2)
{
if(ed[j].x1<ed[j+1].x1)
{

temped = ed[j];
ed[j]=ed[j+1];
ed[j+1] = temped;
}
}
}
}
}
/* calculating 1/slope of each edge and storing top x
coordinate of the edge --------------------------- */
for(i=0;i<n;i++)
{
dx = ed[i].x2 - ed[i].x1;
dy = ed[i].y2 - ed[i].y1;
if(dy==0)
{
m[i]=0;
}
else
{
m[i] = dx/dy;
}
inter_x[i]= ed[i].x1;
}
yy=ymax;
while(yy>ymin)
{
/* Marking active egdes*/
for(i=0;i<n;i++)
{
if(yy > ed[i].y2 && yy <= ed[i].y1 && ed[i].y1!
=ed[i].y2)
{
ed[i].flag = 1;
}
else
{
ed[i].flag = 0;
}
}
/* Finding the x intersections */
j=0;
for(i=0;i<n;i++)
{
if(ed[i].flag==1)
{
if(yy==ed[i].y1)
{
x_int[j]=ed[i].x1;

j++;
if(ed[i-1].y1==yy && ed[i-1].y1<yy)
{
x_int[j]=ed[i].x1;
j++;
}
if(ed[i+1].y1==yy && ed[i+1].y1<yy)
{
x_int[j]=ed[i].x1;
j++;
}
}
else
{
x_int[j] = inter_x[i]+(-m[i]);
inter_x[i]=x_int[j];
j++;
}
}
}
/* Sorting the x intersections*/
for(i=0;i<j;i++)
{
for(k=0;k<j-1;k++)
{
if(x_int[k]>x_int[k+1])
{
temp =x_int[k];
x_int[k] = x_int[k+1];
x_int[k+1] = temp;
}
}
}
/* Extracting pairs of x values to draw lines*/
for(i=0;i<j;i+=2)
{
line(x_int[i],yy,x_int[i+1],yy);
}
yy--;
}
getch();
}

Program For Sutherland-Hodgeman Polygon Clipping


#include<stdio.h>
#include<graphics.h>
#include<math.h>
typedef struct
{
float x;
float y;
}PT;
int n;
void main()
{
int i,j,gd,gm;
PT d,p1,p2,p[20],pi1,pi2,pp[20];
detectgraph(&gd,&gm);
initgraph(&gd,&gm,"c:\\tc\\bgi");
/* Read coordinates of clipping window */
printf("Enter coordinate X (left,top) of point1 : ");
scanf("%f",&p1.x);
printf("Enter coordinate Y (left,top) of point1 : ");
scanf("%f",&p1.y);
printf("Enter coordinates X(right,bottom) of point2 : ");
scanf("%f",&p2.x);
printf("Enter coordinate Y (right,bottom) of point2 : ");
scanf("%f",&p2.y);
/* Enter the number of vertex */
printf("Enter the number of vertex : ");
scanf("%d",&n);
/* Read vertex coordinates of clipping window */
for(i=0;i<n;i++)
{
printf("Enter x coordinate of vertex %d : ",i+1);
scanf("%f",&p[i].x);
printf("Enter y coordinate of vertex %d : ",i+1);
scanf("%f",&p[i].y);
}
p[i].x = p[0].x;
p[i].y = p[0].y;
cleardevice();
line(0,240,640,240);
line(320,0,320,640);
outtextxy(590,260,"x-axis");
outtextxy(320,430,"y-axis");
outtextxy(200,5,"Sutherland-Hodgeman Polygon clipping");
drawpolygon(p,n);
rectangle(p1.x,p1.y,p2.x,p2.y);
getch();
left(p1,p,pp);

right(p2,p,pp);
top(p1,p,pp);
bottom(p2,p,pp);
cleardevice();
line(0,240,640,240);
line(320,0,320,640);
outtextxy(590,260,"x-axis");
outtextxy(320,430,"y-axis");
outtextxy(200,5,"Sutherland-Hodgeman Polygon clipping");
rectangle(p1.x,p1.y,p2.x,p2.y);
drawpolygon(p,n);
getch();
closegraph();
}
left(PT p1,PT p[20],PT pp[20])
{
int i,j=0;
for(i=0;i<n;i++)
{
if(p[i].x < p1.x && p[i+1].x >= p1.x)
{
if(p[i+1].x-p[i].x!=0)
{
pp[j].y = (p[i+1].y-p[i].y)/(p[i+1].x-p[i].x)*
(p1.x-p[i].x)+p[i].y;
}
else
{
pp[j].y = p[i].y;
}
pp[j].x = p1.x;
j++;
pp[j].x=p[i+1].x;
pp[j].y=p[i+1].y;
j++;
}
if(p[i].x > p1.x && p[i+1].x >= p1.x)
{
pp[j].y = p[i+1].y;
pp[j].x = p[i+1].x;
j++;
}
if(p[i].x > p1.x && p[i+1].x <= p1.x)
{
if(p[i+1].x-p[i].x!=0)
{
pp[j].y = (p[i+1].y-p[i].y)/(p[i+1].x-p[i].x)*
(p1.x-p[i].x)+p[i].y;
}
else

{
pp[j].y = p[i].y;
}
pp[j].x = p1.x;
j++;
}
}
for(i=0;i<j;i++)
{
p[i].x = pp[i].x;
p[i].y = pp[i].y;
}
p[i].x = pp[0].x;
p[i].y = pp[0].y;
n=j;
return;
}
right(PT p2,PT p[20],PT pp[20])
{
int i,j=0;
for(i=0;i<n;i++)
{
if(p[i].x > p2.x && p[i+1].x <= p2.x)
{
if(p[i+1].x-p[i].x!=0)
{
pp[j].y = (p[i+1].y-p[i].y)/(p[i+1].x-p[i].x)*
(p2.x-p[i].x)+p[i].y;
}
else
{
pp[j].y = p[i].y;
}
pp[j].x = p2.x;
j++;
pp[j].x=p[i+1].x;
pp[j].y=p[i+1].y;
j++;
}
if(p[i].x < p2.x && p[i+1].x <= p2.x)
{
pp[j].y = p[i+1].y;
pp[j].x = p[i+1].x;
j++;
}
if(p[i].x < p2.x && p[i+1].x >= p2.x)
{
if(p[i+1].x-p[i].x!=0)
{

pp[j].y = (p[i+1].y-p[i].y)/(p[i+1].x-p[i].x)*
(p2.x-p[i].x)+p[i].y;
}
else
{
pp[j].y = p[i].y;
}
pp[j].x = p2.x;
j++;
}
}
for(i=0;i<j;i++)
{
p[i].x = pp[i].x;
p[i].y = pp[i].y;
}
p[i].x = pp[0].x;
p[i].y = pp[0].y;
n=j;
return;
}
top(PT p1,PT p[20],PT pp[20])
{
int i,j=0;
for(i=0;i<n;i++)
{
if(p[i].y < p1.y && p[i+1].y >= p1.y)
{
if(p[i+1].y-p[i].y!=0)
{
pp[j].x = (p[i+1].x-p[i].x)/(p[i+1].y-p[i].y)*
(p1.y-p[i].y)+p[i].x;
}
else
{
pp[j].x = p[i].x;
}
pp[j].y = p1.y;
j++;
pp[j].x=p[i+1].x;
pp[j].y=p[i+1].y;
j++;
}
if(p[i].y > p1.y && p[i+1].y >= p1.y)
{
pp[j].y = p[i+1].y;
pp[j].x = p[i+1].x;
j++;
}
if(p[i].y > p1.y && p[i+1].y <= p1.y)

{
if(p[i+1].y-p[i].y!=0)
{
pp[j].x = (p[i+1].x-p[i].x)/(p[i+1].y-p[i].y)*
(p1.y-p[i].y)+p[i].x;
}
else
{
pp[j].x = p[i].x;
}
pp[j].y = p1.y;
j++;
}
}
for(i=0;i<j;i++)
{
p[i].x = pp[i].x;
p[i].y = pp[i].y;
}
p[i].x = pp[0].x;
p[i].y = pp[0].y;
n=j;
return;
}
bottom(PT p2,PT p[20],PT pp[20])
{
int i,j=0;
for(i=0;i<n;i++)
{
if(p[i].y > p2.y && p[i+1].y <= p2.y)
{
if(p[i+1].y-p[i].y!=0)
{
pp[j].x = (p[i+1].x-p[i].x)/(p[i+1].y-p[i].y)*
(p2.y-p[i].y)+p[i].x;
}
else
{
pp[j].x = p[i].x;
}
pp[j].y = p2.y;
j++;
pp[j].x=p[i+1].x;
pp[j].y=p[i+1].y;
j++;
}
if(p[i].y < p2.y && p[i+1].y <= p2.y)
{
pp[j].y = p[i+1].y;

pp[j].x = p[i+1].x;
j++;
}
if(p[i].y < p2.y && p[i+1].y >= p2.y)
{
if(p[i+1].y-p[i].y!=0)
{
pp[j].x = (p[i+1].x-p[i].x)/(p[i+1].y-p[i].y)*
(p2.y-p[i].y)+p[i].x;
}
else
{
pp[j].x = p[i].x;
}
pp[j].y = p2.y;
j++;
}
}
for(i=0;i<j;i++)
{
p[i].x = pp[i].x;
p[i].y = pp[i].y;
}
p[i].x = pp[0].x;
p[i].y = pp[0].y;
n=j;
return;
}
drawpolygon(PT x[20],int n)
{
int i;
for(i=0;i<n-1;i++)
{
line(x[i].x,x[i].y,x[i+1].x,x[i+1].y);
}
line(x[i].x,x[i].y,x[0].x,x[0].y);
return;
}

Program for ANIMATION


#include <stdio.h>
#include <graphics.h>
#include <conio.h>
void main()
{
void far line();
int gdriver;
int gmode,maxx,maxy,i,j;
int scale [2][2] =
{
2,0,
0,2
};
float scale1 [2][2] =
{
2,0,
0,2
};
int tri [76] [2];
int tri1 [66] [2] =
{
0,8,
7,8,
0,8,
8,6,
7,8,
8,12,
7,8,
10,5,
8,12,
21,12};
int tri2 [66] [2] =
{21,12,
31,27,
31,27,
53,36,
53,36,
50,30,
50,30,
54,32,
54,32,
53,29,
53,29,
55,30,
55,30,
53,26
};
int tri3 [66] [2] =

{27,13,
38,25,
38,25,
53,26,
53,26,
56,26,
56,26,
70,35,
70,35,
66,28,
66,28,
72,30,
72,30,
67,26,
67,26,
74,29,
74,29,
52,10,
52,10,
44,7};
int tri4 [66] [2] =
{44,7,
52,10,
52,10,
80,10,
80,10,
42,0,
42,0,
36,0,
36,0,
23,4,
23,4,
10,5};
int tri5 [66] [2] =
{11,7,
11,9,
11,9,
13,9,
13,9,
13,7,
13,7,
11,7
};
detectgraph(&gdriver,&gmode);
if(gdriver < 0)
{
puts("Cannot detect a graphics card");
exit(1);
}
initgraph(&gdriver, &gmode, "c:\\tc\\bgi");

cleardevice();
setbkcolor(0);
setcolor(15);
maxy=getmaxy();
for(i=0;i<10;i++)
{j=i;
tri[j][0] = tri1[i][0]*scale[0][0]+tri1[i][1]*scale[1]
[0];
tri[j][1] = tri1[i][0]*scale[0][1]+tri1[i][1]*scale[1]
[1];
}
for(i=0;i<14;i++)
{ j=i+10;
tri[j][0] = tri2[i][0]*scale[0][0]+tri2[i][1]*scale[1]
[0];
tri[j][1] = tri2[i][0]*scale[0][1]+tri2[i][1]*scale[1]
[1];
}
for(i=0;i<20;i++)
{ j=i+24;
tri[j][0] = tri3[i][0]*scale1[0][0]+tri3[i]
[1]*scale1[1][0];
tri[j][1] = tri3[i][0]*scale1[0][1]+tri3[i]
[1]*scale1[1][1];
}
for(i=0;i<14;i++)
{ j=i+44;
tri[j][0] = tri4[i][0]*scale[0][0]+tri4[i][1]*scale[1]
[0];
tri[j][1] = tri4[i][0]*scale[0][1]+tri4[i][1]*scale[1]
[1];
}
for(i=0;i<8;i++)
{ j=i+58;
tri[j][0] = tri5[i][0]*scale[0][0]+tri5[i][1]*scale[1]
[0];
tri[j][1] = tri5[i][0]*scale[0][1]+tri5[i][1]*scale[1]
[1];
}
for(j=500;j>100;)
{
for (i=0;i<72;)
{ line(j+tri[i][0],maxy/2-tri[i][1],j+tri[i+1]
[0],maxy/2-tri[i+1][1]);
i=i+2;
}
delay(20);
j=j-1;
for (i=0;i<72;)

{ line(j+tri[i][0],maxy/2-tri[i][1],j+tri[i+1]
[0],maxy/2-tri[i+1][1]);
i=i+2;
}
j=j+1;
setcolor(0);
for (i=0;i<72;)
{ line(j+tri[i][0],maxy/2-tri[i][1],j+tri[i+1]
[0],maxy/2-tri[i+1][1]);
i=i+2;
}
setcolor(15);
j=j-1;
for (i=0;i<72;)
{ line(j+tri[i][0],maxy/2-tri[i][1],j+tri[i+1]
[0],maxy/2-tri[i+1][1]);
i=i+2;
}

}
getch();
closegraph();
}

Вам также может понравиться