Graphics programming using c
Home
Question Paperz
Java Projectz
ASP Projectz
8086
Data structures
c++
8085
Sunday, August 15, 2010
Sutherland-Hodgeman Polygon Clipping
#include<stdio.h> #include<graphics.h> struct point { int x; int y; }wmin,wmax,p1,p2,ipt,pin[50],pout[50]; int np=0,n,gd=DETECT,gm=VGAMAX; void newpin(); void drawpolygon(); void showpoints(); void clippolygon() { float m=0.0; np=0; int i,j; for(i=0,j=0;i<n;i++) { m=0.0; p1=pin[i]; p2=pin[(i+1)%n]; if(p1.x>=wmin.x&&p2.x>=wmin.x) { pout[j]=p2; np++; j++; } else if(p2.x==wmin.x) { pout[j]=p2; np++; j++; } else if(p1.x<wmin.x&&p2.x>wmin.x||p1.x>wmin.x&&p2.x<wmin.x) { if(p1.x!=p2.x) m=(float)(p1.y-p2.y)/(float)(p1.x-p2.x); ipt.x=wmin.x; ipt.y=p1.y+(wmin.x-p1.x)*m; if(p1.x<wmin.x) { pout[j]=ipt; pout[j+1]=p2; np=np+2; j=j+2; } else { p2=ipt; pout[j]=ipt; np++; j++; } } } newpin(); outtextxy(220,10,"After left clip"); drawpolygon(); while (!kbhit()); closegraph(); initgraph(&gd,&gm,"NULL"); np=0; for(i=0,j=0;i<n;i++) { m=0.0; p1=pin[i]; p2=pin[(i+1)%n]; if(p1.x<=wmax.x&&p2.x<=wmax.x) { pout[j]=p2; np++; j++; } else if(p2.x==wmax.x) { pout[j]=p2; np++; j++; } else if(p1.x>wmax.x&&p2.x<wmax.x||p1.x<wmax.x&&p2.x>wmax.x) { if(p1.x!=p2.x) m=(float)(p1.y-p2.y)/(float)(p1.x-p2.x); ipt.x=wmax.x; ipt.y=p1.y+(wmax.x-p1.x)*m; if(p1.x>wmax.x) { pout[j]=ipt; pout[j+1]=p2; np=np+2; j=j+2; } else { p2=ipt; pout[j]=ipt; np++; j++; } } } newpin(); outtextxy(220,10,"After right clip"); drawpolygon(); while (!kbhit()); closegraph(); initgraph(&gd,&gm,"NULL"); np=0; for(i=0,j=0;i<n;i++) { m=0.0; p1=pin[i]; p2=pin[(i+1)%n]; if(p1.y>=wmin.y&&p2.y>=wmin.y) { pout[j]=p2; np++; j++; } else if(p2.y==wmin.y) { pout[j]=p2; np++; j++; } else if(p1.y<wmin.y&&p2.y>wmin.y||p1.y>wmin.y&&p2.y<wmin.y) { if(p1.x!=p2.x) m=(float)(p1.y-p2.y)/(float)(p1.x-p2.x); ipt.y=wmin.y; if(m!=0) ipt.x=p1.x+(float)(wmin.y-p1.y)*(float)(1/m); else ipt.x=p1.x; if(p1.y<wmin.y) { pout[j]=ipt; pout[j+1]=p2; np=np+2; j=j+2; } else { p2=ipt; pout[j]=ipt; np++; j++; } } } newpin(); outtextxy(220,10,"After bottom clip"); drawpolygon(); while (!kbhit()); closegraph(); initgraph(&gd,&gm,"NULL"); np=0; for(i=0,j=0;i<n;i++) { m=0.0; p1=pin[i]; p2=pin[(i+1)%n]; if(p1.y<=wmax.y&&p2.y<=wmax.y) { pout[j]=p2; np++; j++; } else if(p2.y==wmax.y) { pout[j]=p2; np++; j++; } else if(p1.y>wmax.y&&p2.y<wmax.y||p1.y<wmax.y&&p2.y>wmax.y) { if(p1.x!=p2.x) m=(float)(p1.y-p2.y)/(float)(p1.x-p2.x); ipt.y=wmax.y; if(m!=0) ipt.x=p1.x+(float)(wmax.y-p1.y)*(float)(1/m); else ipt.x=p1.x; if(p1.y>wmax.y) { pout[j]=ipt; pout[j+1]=p2; np=np+2; j=j+2; } else { p2=ipt; pout[j]=ipt; np++; j++; } } } newpin(); outtextxy(220,10,"clipped Polygon"); showpoints(); drawpolygon(); } void newpin() { int i,j; for(j=0,i=0;j<np;j++,i++) pin[i]=pout[j]; n=i; } void showpoints() { int j; printf("Vertex"); for(j=0;j<n;j++) printf("\n%d.(%d,%d)",j+1,pin[j].x,pin[j].y); } void drawpolygon() { int j; setcolor(10); rectangle(wmin.x,wmin.y,wmax.x,wmax.y); setcolor(6); for(j=0;j<n;j++) line(pin[j].x,pin[j].y,pin[(j+1)%n].x,pin[(j+1)%n].y); } int main() { int c,j; printf("Enter the window minimum coordinates"); scanf("%d%d",&wmin.x,&wmin.y); printf("Enter the window max coordinates"); scanf("%d%d",&wmax.x,&wmax.y); printf("Enter the no of sides in polygon:\n"); scanf("%d",&n); printf("Enter the coordinates(x,y)\n"); for(j=0;j<n;j++) { printf("Enter the coordinate %d\n",j+1); scanf("%d%d",&pin[j].x,&pin[j].y); } initgraph(&gd,&gm,"NULL"); outtextxy(220,10,"Orginal Polygon"); drawpolygon(); while (!kbhit()); closegraph(); initgraph(&gd,&gm,"NULL"); clippolygon(); while (!kbhit()); closegraph(); return 0; }
1 comment:
Umesh358
February 15, 2016 at 4:45 AM
thanx for the filling non recursive code
Reply
Delete
Replies
Reply
Add comment
Load more...
Newer Post
Older Post
Home
Subscribe to:
Post Comments (Atom)
thanx for the filling non recursive code
ReplyDelete