hi IV cse, i attached the exercise no.4 & 5 programs.
#include<stdio.h> #include<conio.h> #include<dos.h> #include<graphics.h> #include<stdlib.h> typedef struct coord { int x,y; char code[4]; }PT; void drawwindow(); void drawline(PT p1,PT p2,int c1); PT setcode(PT p); int visibility(PT p1,PT p2); PT resetendpt(PT p1,PT p2); void main() { int gd=DETECT,gm,v; PT p1,p2,ptemp; initgraph(&gd,&gm,"c:\\tc\\bgi"); cleardevice(); printf("\t\tCOHEN-SUTHERLAND LINE CLIPPING ALGORITHM"); printf("\nEnter the two end points p1(x,y)"); scanf("%d%d",&p1.x,&p1.y); printf("Enter the two end points p2(x,y):"); scanf("%d%d",&p2.x,&p2.y); cleardevice(); printf("\t\tCLIPPING WINDOW"); drawwindow(); getch(); printf("\tCOHEN-SUTHERLAND LINE CLIPPING ALGORITHM"); printf("\n\t\tBEFORE CLIPPING"); drawline(p1,p2,4); getch(); p1=setcode(p1); p2=setcode(p2); v=visibility(p1,p2); switch(v) { case 0: cleardevice(); //printf("\t\tCLIPPING WINDOW"); drawwindow(); drawline(p1,p2,15); break; case 1: cleardevice(); drawwindow(); break; case 2: cleardevice(); p1=resetendpt(p1,p2); p2=resetendpt(p2,p1); drawwindow(); printf("\tCOHEN-SUTHERLAND LINE CLIPPING ALGORITHM"); printf("\n\t\tAFTER CLIPPING"); drawline(p1,p2,15); break; } getch(); closegraph(); //return(0); } void drawwindow() { setcolor(RED); setlinestyle(DOTTED_LINE, 1, 1); line(150,100,100,100); line(150,100,150,50); line(450,100,500,100); line(450,100,450,50); line(450,350,500,350); line(450,350,450,400); line(150,350,150,400); line(150,350,100,350) ; line(150,100,100,100); line(150,100,150,50); setlinestyle(SOLID_LINE, 1, 1); line(150,100,450,100); line(450,100,450,350); line(450,350,150,350); line(150,350,150,100); outtextxy(450,30,"1001"); outtextxy(470,200,"1000"); outtextxy(470,370,"1010"); outtextxy(300,370,"0010"); outtextxy(120,370,"0110"); outtextxy(120,200,"0100"); outtextxy(120,30,"0101"); outtextxy(300,30,"0001"); outtextxy(300,200,"0000"); } void drawline(PT p1,PT p2,int c1) { setcolor(c1); line(p1.x,p1.y,p2.x,p2.y); } PT setcode(PT p) { PT ptemp; if(p.y<100) ptemp.code[0]='1'; else ptemp.code[0]='0'; if(p.y>350) ptemp.code[1]='1'; else ptemp.code[1]='0'; if(p.x>200) ptemp.code[2]='1'; else ptemp.code[2]='0'; if(p.x<150) ptemp.code[3]='1'; else ptemp.code[3]='0'; ptemp.x=p.x; ptemp.y=p.y; return(ptemp); } int visibility(PT p1,PT p2) { int i,flag=0; for(i=0;i<4;i++) { if((p1.code[i]!='0')||(p2.code[i]!='0')) flag=1; } if(flag==0) return(0); for(i=0;i<4;i++) { if((p1.code[i]==p2.code[i])&&(p1.code[i]=='1')) flag=0; } if(flag==0) return(1); return(2); } PT resetendpt(PT p1,PT p2) { PT temp; int x,y,i; float m,k; if(p1.code[3]=='1') x=150; if(p1.code[2]=='1') x=450; if((p1.code[3]=='1')||(p1.code[2]=='1')) { m=(float)(p2.y-p1.y)/(p2.x-p1.x); k=(p1.y+(m*(x-p1.x))); temp.y=k; temp.x=x; for(i=0;i<4;i++) { temp.code[i]=p1.code[i]; if(temp.y<=350 && temp.y>=100) return(temp); } if(p1.code[0]=='1') y=100; if(p1.code[1]=='1') y=350; if((p1.code[0]=='1')||(p1.code[1]=='1')) { m=(float)(p2.y-p1.y)/(p2.x-p1.x); k=(float)p1.x+(float)(y-p1.y)/m; temp.y=y; temp.x=k; for(i=0;i<4;i++) temp.code[i]=p1.code[i]; return(temp); } } else return(p1); return(p2); }
//POLYGON CLIPPING USING SUTHERLAND-HODGMAN METHOD #include<iostream.h> #include<stdio.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) { 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; } } 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]; initgraph(&gdriver,&gmode,"c:\\tc\\bgi"); clrscr(); printf("Coordinates of rectangular clip window :\nxmin,ymin :"); cin>>xmin>>ymin; printf("xmax,ymax :"); cin>>xmax>>ymax; printf("\n\nPolygon to be clipped :\nNumber of sides :"); cin>>n; printf("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++) poly[i]=round(polyy[i]); initgraph(&gdriver,&gmode,"c:\\tc\bgi"); setcolor(RED); rectangle(xmin,ymax,xmax,ymin); printf("\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); printf("\tCLIPPED POLYGON"); getch(); closegraph(); }