W.A.P to implement Cohen Sutherland line clipping algorithm.

Post date: Feb 13, 2012 3:50:14 PM

#include<iostream.h> #include<conio.h> #include<math.h> #include<graphics.h> #include<dos.h> #include<process.h> int pixels[2][4]; float xn1,xn2,yn1,yn2,x3,y3,m; void show_quadrant() { cleardevice(); rectangle(120,40,320,240); rectangle(320,40,520,240); rectangle(120,240,320,440); rectangle(320,240,520,440); for(int i=130;i<=510;i+=10) { if(i==320) continue; outtextxy(i,237,"+"); } for(i=50;i<=430;i+=10) { if(i==240) continue; outtextxy(317,i,"-"); } outtextxy(310,230,"O"); outtextxy(530,240,"X"); outtextxy(320,450,"-Y"); outtextxy(100,240,"-X"); outtextxy(320,30,"Y"); } void su_co(int x1,int y1,int x2,int y2,int xmin,int ymin,int xmax,int ymax) { int i,j,fl; for(i=0;i<2;i++) for(j=0;j<4;j++) pixels[i][j]=0; if(y1>ymax) pixels[0][0]=1; if(y1<ymin) pixels[0][1]=1; if(x1>xmax) pixels[0][2]=1; if(x1<xmin) pixels[0][3]=1; if(y2>ymax) pixels[1][0]=1; if(y2<ymin) pixels[1][1]=1; if(x2>xmax) pixels[1][2]=1; if(x2<xmin) pixels[1][3]=1; for(j=0;j<4;j++) { if(pixels[0][j]==0&&pixels[1][j]==0) continue; if(pixels[0][j]==1&&pixels[1][j]==1) { fl=3; break; } fl=2; } switch(fl) { case 1: line(320+x1,240-y1,320+x2,240-y2); break; case 3: cout<<"\n\n\a\" Line Is Not Visible...:-("; break; case 2: m=(y2-y1)/(x2-x1); xn1=x1; yn1=y1; xn2=x2; yn2=y2; if(pixels[0][0]==1) { xn1=x1+(ymax-y1)/m; yn1=ymax; } if(pixels[0][1]==1) { xn1=x1+(ymin-y1)/m; yn1=ymin; } if(pixels[0][2]==1) { yn1=y1+(xmax-x1)*m; xn1=xmax; } if(pixels[0][3]==1) { yn1=y1+(xmin-x1)*m; xn1=xmin; } if(pixels[1][0]==1) { xn2=x2+(ymax-y2)/m; yn2=ymax; } if(pixels[1][1]==1) { xn2=x2+(ymin-y2)/m; yn2=ymin; } if(pixels[1][2]==1) { yn2=y2+(xmax-x2)*m; xn2=xmax; } if(pixels[1][3]==1) { yn2=y2+(xmin-x2)*m; xn2=xmin; } line(320+xn1,240-yn1,320+xn2,240-yn2); break; } } void midpt(int x1,int y1,int x2,int y2,int xmin,int ymin,int xmax,int ymax) { int fl=1; int i,j; int ox1=x1,ox2=x2,oy1=y1,oy2=y2; for(i=0;i<2;i++) for(j=0;j<4;j++) pixels[i][j]=0; if(y1>ymax) pixels[0][0]=1; if(y1<ymin) pixels[0][1]=1; if(x1>xmax) pixels[0][2]=1; if(x1<xmin) pixels[0][3]=1; if(y2>ymax) pixels[1][0]=1; if(y2<ymin) pixels[1][1]=1; if(x2>xmax) pixels[1][2]=1; if(x2<xmin) pixels[1][3]=1; for(j=0;j<4;j++) { if(pixels[0][j]==0&&pixels[1][j]==0) continue; if(pixels[0][j]==1&&pixels[1][j]==1) { fl=3; break; } fl=2; } switch(fl) { case 1: line(320+x1,240-y1,320+x2,240-y2); break; case 3: cout<<"\n\n\a\" Line Is Not Visible...:-("; break; case 2: xn1=x1; yn1=y1; xn2=x2; yn2=y2; fl=0; x3=x1; y3=y1; while(1) { if(!(y1>ymax || y1<ymin || x1>xmax || x1<xmin) && (x3 || y3)!=0.1) break; x3=(x1+x2)/2; y3=(y1+y2)/2; if(!(y3>ymax || y3<ymin || x3>xmax || x3<xmin)) fl=1; else fl=0; if(fl) { x2=x3; y2=y3; } else { x1=x3; y1=y3; } } xn1=x3; yn1=y3; fl=0; x1=ox1; x2=ox2; y1=oy1; y2=oy2; x3=x2; y3=y2; while(1) { if(!(y2>ymax || y2<ymin || x2>xmax || x2<xmin) && (x3 || y3)!=0.1) break; x3=(x1+x2)/2; y3=(y1+y2)/2; if(!(y3>ymax || y3<ymin || x3>xmax || x3<xmin)) fl=1; else fl=0; if(fl) { x1=x3; y1=y3; } else { x2=x3; y2=y3; } } xn2=x3; yn2=y3; line(320+xn1,240-yn1,320+xn2,240-yn2); break; } } void show_message() { char *mess[]={"-","=","["," ","L","i","n","e"," ","C","l","i", "p","p","i","n","g"," ","]","=","-",}; int xx=29,xxx=50,i,j; _setcursortype(_NOCURSOR); for(i=0,j=21;i<13,j>=11;i++,j--) { gotoxy(xx,1); cout<<mess[i]; xx++; gotoxy(xxx,1); cout<<mess[j]; xxx--; delay(50); } _setcursortype(_NORMALCURSOR); } void main() { clrscr(); int gd=DETECT,gm,i,j; int xmin,ymin,xmax,ymax,x1,y1,x2,y2; int choice,ed[20],num; show_message(); cout<<"\n\n\t\t\" Enter The Co-Ordinates Of The Clipping Window.\""; cout<<"\n\n\t\t\" Enter X(min) & Y(min) \":="; cin>>xmin>>ymin; cout<<"\n\t\t\" Enter X(max) & Y(max) \":="; cin>>xmax>>ymax; cout<<"\n\t\t\" Enter The Co-Ordinates Of The Line.\""; cout<<"\n\n\t\t\" Enter X(1) & Y(1) \":="; cin>>x1>>y1; cout<<"\n\t\t\" Enter X(2) & Y(2) \":="; cin>>x2>>y2; clrscr(); show_message(); cout<<"\n\n\n\t\t1:==>\" Sutherland-Cohen \""; cout<<"\n\n\t\t2:==>\" Mid-Point Method \""; cout<<"\n\n\t\t3:==>\" Exit \""; cout<<"\n\n\t\t\" Enter Your Choice \":="; cin>>choice; switch(choice) { case 1: initgraph(&gd,&gm,"..\\bgi"); clearviewport(); show_quadrant(); line(320+xmin,240-ymin,320+xmin,240-ymax); line(320+xmin,240-ymax,320+xmax,240-ymax); line(320+xmax,240-ymax,320+xmax,240-ymin); line(320+xmax,240-ymin,320+xmin,240-ymin); line (320+x1,240-y1,320+x2,240-y2); getch(); cleardevice(); show_quadrant(); line(320+xmin,240-ymin,320+xmin,240-ymax); line(320+xmin,240-ymax,320+xmax,240-ymax); line(320+xmax,240-ymax,320+xmax,240-ymin); line(320+xmax,240-ymin,320+xmin,240-ymin); su_co(x1,y1,x2,y2,xmin,ymin,xmax,ymax); getch(); break; case 2: initgraph(&gd,&gm,"..\\bgi"); clearviewport(); show_quadrant(); line(320+xmin,240-ymin,320+xmin,240-ymax); line(320+xmin,240-ymax,320+xmax,240-ymax); line(320+xmax,240-ymax,320+xmax,240-ymin); line(320+xmax,240-ymin,320+xmin,240-ymin); line (320+x1,240-y1,320+x2,240-y2); getch(); cleardevice(); show_quadrant(); line(320+xmin,240-ymin,320+xmin,240-ymax); line(320+xmin,240-ymax,320+xmax,240-ymax); line(320+xmax,240-ymax,320+xmax,240-ymin); line(320+xmax,240-ymin,320+xmin,240-ymin); midpt(x1,y1,x2,y2,xmin,ymin,xmax,ymax); getch(); break; case 3: exit(0); default: cout<<"\n\t\a\" Press A Valid Key...!!! \""; getch(); main(); break; } closegraph(); }