OBJECTIVE: Implementation of Weiler Atherton polygon clipping algorithm.
THEORY: The basic idea behind this algorithm is that instead of always processing around the polygon edges as vertex are processed, we sometime want to follow the window boundaries. Which path we follow depends on polygon processing direction and whether the pair of vertices currently being processed represent outside-to-inside pair or an inside-to-outside pair.
PROGRAM:
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
#include<process.h>
struct vect
{
float x;
float y;
float z;
}v[10],W[10],w[10];
int main()
{
float xmin,xmax,ymin,ymax,u[10];
int n,i;
float m,p;
int driver=DETECT,mode=DETECT;
initgraph(&driver,&mode,"c:\\dev-cpp\\bgi");
printf("enter the no of point\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("enter the v%d of x,y,z,coordinate\n",i);
scanf("%f%f%f",&v[i].x,&v[i].y,&v[i].z);
}
for(i=1;i<=n;i++)
{
printf("\nthe v%d points as\n",i);
printf("%f\t%f\t%f",v[i].x,v[i].y,v[i].z);
}
for(i=1;i<n;i++)
{
u[i]=(v[i].x*v[i+1].y)-(v[i+1].x*v[i].y);
printf("\nu is\n");
printf("%f",u[i]);
}
u[i]=(v[i].x*v[1].y)-(v[1].x*v[i].y);
printf("\nu is\n");
printf("%f",u[i]);
for(i=1;i<=n;i++)
{
if(u[i]<0)
{
break;
}
}
if(u[i]<0)
{
printf("\nConcave");
}
else
printf("\nConvex");
printf("\nenter the Xmin , Ymin \n");
scanf("%f%f",&xmin,&ymin);
printf("enter the Xmax , Ymax \n");
scanf("%f%f",&xmax,&ymax);
line(int(xmin),int(ymin),int(xmax),int(ymin));
line(int(xmax),int(ymin),int(xmax),int(ymax));
line(int(xmax),int(ymax),int(xmin),int(ymax));
line(int(xmin),int(ymax),int(xmin),int(ymin));
for(i=1;i<n;i++)
{
setcolor(GREEN);
line(int(v[i].x),int(v[i].y),int(v[i+1].x),int(v[i+1].y));
}
setcolor(GREEN);
line(int(v[i].x),int(v[i].y),int(v[1].x),int(v[1].y));
for(i=1;i<=n;i++)
{
if((v[i].x <xmin)&&(v[i+1].x>xmin))
{
W[i].x=xmin;
m=((v[i+1].y-v[i].y)/(v[i+1].x-v[i].x));
(W[i].y)=(v[i].y)+(m*(xmin-v[i].x));
W[i+1].x=v[i+1].x;
W[i+1].y=v[i+1].y;
if(v[i+1].x>xmax)
{
W[i+1].x=xmax;
W[i+1].y=(v[i].y)+(m*(xmax-v[i].x));
}
setcolor(RED);
line(int(W[i].x),int(W[i].y),int(W[i+1].x),int(W[i+1].y));
}
if(v[i].x>=xmin&&v[i+1].x>=xmin)
{
W[i].x=v[i].x;
W[i].y=v[i].y;
W[i+1].x=v[i+1].x;
W[i+1].y=v[i+1].y;
setcolor(RED);
line(int(W[i].x),int(W[i].y),int(W[i+1].x),int(W[i+1].y));
}
if((v[i].x>xmin)&&(v[i+1].x<xmin))
{
W[i].x=v[i].x;
W[i].y=v[i].y;
W[i+1].x=xmin;
m=((v[i+1].y-v[i].y)/(v[i+1].x-v[i].x));
W[i+1].y=(v[i].y)+(m*(xmin-v[i].x));
if(v[i].x>xmax)
{
W[i].x=xmax;
m=((v[i+1].y-v[i].y)/(v[i+1].x-v[i].x));
W[i].y=(v[i].y)+(m*(xmax-v[i].x));
}
setcolor(RED);
line(int(W[i].x),int(W[i].y),int(W[i+1].x),int(W[i+1].y));
}
if((W[i].y >ymax)&&(W[i+1].y<ymax))
{
w[i].y=ymax;
m=((W[i+1].y-W[i].y)/(W[i+1].x-W[i].x));
p=1/m;
(w[i].x)=(W[i].x)+(p*(ymax-W[i].y));
w[i+1].y=W[i+1].y;
w[i+1].x=v[i+1].x;
if(W[i+1].y<ymin)
{
w[i+1].y=ymin;
p=1/m;
w[i+1].x=(W[i].x)+(p*(ymin-W[i].y));
}
setcolor(YELLOW);
line(int(w[i].x),int(w[i].y),int(w[i+1].x),int(w[i+1].y));
}
if(W[i].y<=ymax&&W[i+1].y>=ymin)
{
w[i].y=W[i].y;
w[i].x=W[i].x;
w[i+1].y=W[i+1].y;
w[i+1].x=W[i+1].x;
setcolor(YELLOW);
line(int(w[i].x),int(w[i].y),int(w[i+1].x),int(w[i+1].y));
}
if((W[i].y<ymax)&&(W[i+1].y>ymax))
{
w[i].y=W[i].y;
w[i].x=W[i].x;
w[i+1].y=ymax;
m=((W[i+1].y-W[i].y)/(W[i+1].x-W[i].x));
p=1/m;
w[i+1].x=(W[i].x)+(p*(ymax-W[i].y));
if(W[i].y<ymin)
{
w[i].y=ymin;
m=((W[i+1].y-W[i].y)/(W[i+1].x-W[i].x));
p=1/m;
w[i].x=(W[i].x)+(p*(ymin-W[i].y));
}
setcolor(YELLOW);
line(int(w[i].x),int(w[i].y),int(w[i+1].x),int(w[i+1].y));
}
}
getch();
closegraph();
}
No comments:
Post a Comment