#include<graphics.h> #include<stdio.h> int graDriver=DETECT,gramode; int px[10]; int py[10]; int cx[10]; int cy[10]; int psize=4,csize=5; float ta,tb,tc; int insidex,insidey,meety,meetx; int a[10],b[10],c[10];//equations for clipping polygon int outx1[20],outy1[20],outx2[20],outy2[20],outcount1=0,outcount2=0,outswitcher=1,outcount; void getEquation(int x1,int yy1,int x2, int y2) { if(y2==yy1) { ta=0; tb=1; tc=-yy1; } else if(x2==x1) { ta=1; tb=0; tc=-x2; } else { ta=y2-yy1; tb=x1-x2; tc=-tb*yy1-x1*ta; } } void addPoint2Output(int tx,int ty) { if(outswitcher%2==1) { outx1[outcount1]=tx; outy1[outcount1++]=ty; } else { outx2[outcount2]=tx; outy2[outcount2++]=ty; } } int getXfromOut(int index) { if(outswitcher%2==0) return outx1[index]; else return outx2[index]; } int getYfromOut(int index) { if(outswitcher%2==0) return outy1[index]; else return outy2[index]; } void populateEquations() { int i; for(i=0;i<csize;i++) { getEquation(cx[i],cy[i],cx[(i+1)%csize],cy[(i+1)%csize]); a[i]=ta; b[i]=tb; c[i]=tc; } } int isInsideEdge(int x,int y,int a,int b,int c) { int z,u; z=a*insidex+b*insidey+c; z=z/abs(z); u=a*x+b*y+c; if(u==0) return 1; u=u/abs(u); if(u==z) return 1; else return 0; } //================ //GET AN INSIDE POINT //================ void getApointInsideClipPoly() { int i=0,yi,xi,xsum=0,ysum=0; for(i=0;i<csize;i++) { xsum+=cx[i]; ysum+=cy[i]; } insidex=(int)xsum/csize; insidey=(int)ysum/csize; } //================ //GETiNTERSECTION //================ void getIntersection(a,b,c)//ta,tb,tc got as global { //getEquation() called from context float mult; if(ta!=0&&a!=0) { mult=(float)a/ta; meety=(tc*mult-c)/(b-tb*mult); meetx=-(b*meety+c)/a; } else { mult=b/tb; meetx=(tc*mult-c)/(a-ta*mult); meety=-(a*meetx+c)/b; } } //================ //dRAW OUTPUT //================ void draw() { int i; initgraph(&graDriver,&gramode,"C:\\TC\\BGI"); setcolor(GREEN); if(outcount1!=0) { for(i=0;i<outcount1;i++) line(outx1[i],outy1[i],outx1[(i+1)%outcount1],outy1[(i+1)%outcount1]); } else { for(i=0;i<outcount2;i++) line(outx2[i],outy2[i],outx2[(i+1)%outcount2],outy2[(i+1)%outcount2]); } setcolor(RED); for(i=0;i<csize;i++) line(cx[i],cy[i],cx[(i+1)%csize],cy[(i+1)%csize]); getch(); closegraph(); } //================ //RAW DRAW //================ void rawdraw() { int i; initgraph(&graDriver,&gramode,"C:\\TC\\BGI"); setcolor(RED); for(i=0;i<csize;i++) line(cx[i],cy[i],cx[(i+1)%csize],cy[(i+1)%csize]); setcolor(GREEN); for(i=0;i<psize;i++) line(px[i],py[i],px[(i+1)%psize],py[(i+1)%psize]); putpixel(insidex,insidey,YELLOW); } //================ //MAIN //================ int main() { int i,j,x1,yy1,x2,y2,i1,i2,temp; printf("\nEnter no of points of polygon"); scanf("%d",&psize); printf("\nEnter points of polygon"); for(i=0;i<psize;i++) { scanf("%d%d",&px[i],&py[i]); } printf("\nEnter no of points of clipping polygon"); scanf("%d",&csize); printf("\nEnter points of clipping polygon"); for(i=0;i<csize;i++) { scanf("%d%d",&cx[i],&cy[i]); } populateEquations(); getApointInsideClipPoly(); printf("\nbefore clipping"); rawdraw(); delay(5000); closegraph(); //copying polygon points to outx2,outy2 for(i=0;i<psize;i++) { outx2[i]=px[i]; outy2[i]=py[i]; } outcount2=psize; outcount=outcount2; for(i=0;i<csize;i++)//clipping line { printf("\nCheck against clip edge:(%d,%d)>(%d,%d):%dx+%dy+%d=0",cx[i],cy[i],cx[(i+1)%csize],cy[(i+1)%csize],a[i],b[i],c[i]); getch(); for(j=0;j<outcount;j++)//clipped line { x1=getXfromOut(j);//outx[i]; yy1=getYfromOut(j);//outy[i]; x2=getXfromOut((j+1)%outcount);//outx[(i+1)%outcount]; y2=getYfromOut((j+1)%outcount);//outy[(i+1)%outcount]; i1=isInsideEdge(x1,yy1,a[i],b[i],c[i]); i2=isInsideEdge(x2,y2,a[i],b[i],c[i]); if(i1==1&&i2==1) { addPoint2Output(x2,y2); } else if(i1==1&&i2==0) { getEquation(x1,yy1,x2,y2); getIntersection(a[i],b[i],c[i]); addPoint2Output(meetx,meety); } else if(i1==0&&i2==1) { getEquation(x1,yy1,x2,y2); getIntersection(a[i],b[i],c[i]); addPoint2Output(meetx,meety); addPoint2Output(x2,y2); } } outswitcher++; outcount=(outswitcher%2==1)?outcount2:outcount1; if(outswitcher%2==1) outcount1=0; else outcount2=0; } draw(); getch(); return 0; }
Search This Blog
C Program for Polygon Clipping by Another Polygon - Computer Graphics Lab Program
Polygon clipping is one of the classic problem in computer graphics lab. Generally, polygons or whatever objects, are clipped by a rectangular clipping windows. But, this one is a little more challenging graphics lab experiment in which we have to clip polygon with another polygon. That is the clipping windows is actually another polygon. The following c program implements polygon clipping with another polygon. The program clips any polygon with the clipping polygon, given both should be convex polygons.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment