Sei sulla pagina 1di 7

LINE clipping________________________

#include<iostream.h>
#include<conio.h>
# include<graphics.h>
void main(){
int gd=DETECT,gm;
initgraph(&gd,&gm,"C:\\TC\\BGI");
int xl,xh,yl,yh,bit1,bit2,i,x1,y1,x2,y2,b3,b4,b1,b2,d,e;
float m;
cout<<"Enter the lower window co-ordinates";
cin>>xl>>yl;
cout<<"Enter higher window co-ordinates";
cin>>xh>>yh;
rectangle(xl,yl,xh,yh);
cout<<"\n Enter the two end-points of line:";
cout<<"x1:";
cin>>x1;
cout<<"y1:";
cin>>y1;
cout<<"x2:";
cin>>x2;
cout<<"y2:";
cin>>y2;
line(x1,y1,x2,y2);
//for 1st end-point
if(x1<xl && y1>yl)
bit1=5;
else
if(x1<xl && y1>yh && y1<yl)
bit1=1;
else
if(x1<xl && y1<yh)
bit1=9;
else
if(x1>xl && x1<xh && y1<yh)
bit1=8;

else
if(x1>xh && y1<yh)
bit1=10;
else
if(x1>xh && y1>yh && y1<yl)
bit1=2;
else
if(x1>xh && y1>yl)
bit1=6;
else
if(x1<xh && x1>xl && y1>yl)
bit1=4;
else
{bit1=0;}
//for 2nd end point
if(x2<xl && y2>yl)
bit2=5;
else
if(x2<xl && y2>yh && y2<yl)
bit2=1;
else
if(x2<xl && y2<yh)
bit2=9;
else
if(x2>xl && x2<xh && y2<yh)
bit2=8;
else
if(x2>xh && y2<yh)
bit2=10;
else
if(x2>xh && y2>yh && y2<yl)
bit2=2;
else
if(x2>xh && y2>yl)
bit2=6;
else
if(x2<xh && x2>xl && y2>yl)
bit2=4;

else
{bit2=0;}
m=(float)(y2-y1)/(x2-x1);
b1=m*(xl-x1)+y1;
b2=m*(xh-x1)+y1;
d=yh-y1;
e=yl-y1;
b3=x1+(d/m);
b4=x1+(e/m);
if(bit1!=0 || bit2!=0)
{setcolor(46);
if(b1<=yl && b1>=yh && b2<=yl && b2 >=yh)
line(xl,b1,xh,b2);
else
if(b1<=yl && b1>=yh && b3<=xh && b3 >=xl)
line(xl,b1,b3,yh);
else
if(b1<=yl && b1>=yh && b4<=xh && b4 >=xl)
line(xl,b1,b4,yl);
else
if(b2<=yl && b2>=yh && b3<=xh && b3>=xl)
line(xh,b2,b3,yh);
else
if(b2<=yl && b2>=yh && b4<=xh && b4 >=xl)
line(xh,b2,b4,yl);
else
if( b3<=xh && b3>=xl && b4<=xh && b4>=xl)
line(b3,yh,b4,yl);
}
else
{cout<<"line lies inside the window"; }
getch();
}

POLYGON Clipping:#include <stdio.h>


#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <process.h>
#define TRUE 1
#define FALSE 0
typedef unsigned int outcode;
outcode CompOutCode(float x,float y);
enum { TOP = 0x1,
BOTTOM = 0x2,
RIGHT = 0x4,
LEFT = 0x8
};
float xmin,xmax,ymin,ymax;
void clip(float x0,float y0,float x1,float y1)
{
outcode outcode0,outcode1,outcodeOut;
int accept = FALSE,done = FALSE;
outcode0 = CompOutCode(x0,y0);
outcode1 = CompOutCode(x1,y1);
do
{
if(!(outcode0|outcode1))
{
accept = TRUE;
done = TRUE;
}
else
if(outcode0 & outcode1)
done = TRUE;
else
{
float x,y;
outcodeOut = outcode0?outcode0:outcode1;
if(outcodeOut & TOP)
{

x = x0+(x1-x0)*(ymax-y0)/(y1-y0);
y = ymax;
}
else if(outcodeOut & BOTTOM)
{
x = x0+(x1-x0)*(ymin-y0)/(y1-y0);
y = ymin;
}
else if(outcodeOut & RIGHT)
{
y = y0+(y1-y0)*(xmax-x0)/(x1-x0);
x = xmax;
}
else
{
y = y0+(y1-y0)*(xmin-x0)/(x1-x0);
x = xmin;
}
if(outcodeOut==outcode0)
{
x0 = x;
y0 = y;
outcode0 = CompOutCode(x0,y0);
}
else
{
x1 = x;
y1 = y;
outcode1 = CompOutCode(x1,y1);
}
}
}while(done==FALSE);
if(accept)
line(x0,y0,x1,y1);
outtextxy(150,20,"POLYGON AFTER CLIPPING");
rectangle(xmin,ymin,xmax,ymax);
}
outcode CompOutCode(float x,float y)

outcode code = 0;
if(y>ymax)
code|=TOP;
else if(y<ymin)
code|=BOTTOM;
if(x>xmax)
code|=RIGHT;
else if(x<xmin)
code|=LEFT;
return code;

}
void main( )
{
float x1,y1,x2,y2;
/* request auto detection */
int gdriver = DETECT, gmode, n,poly[14],i;
clrscr( );
printf("Enter the no of sides of polygon:");
scanf("%d",&n);
printf("\nEnter the coordinates of polygon\n");
for(i=0;i<2*n;i++)
{
scanf("%d",&poly[i]);
}
poly[2*n]=poly[0];
poly[2*n+1]=poly[1];
printf("Enter the rectangular coordinates of clipping window\n");
scanf("%f%f%f%f",&xmin,&ymin,&xmax,&ymax);
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
outtextxy(150,20,"POLYGON BEFORE CLIPPING");
drawpoly(n+1,poly);
rectangle(xmin,ymin,xmax,ymax);
getch( );
cleardevice( );
for(i=0;i<n;i++)

clip(poly[2*i],poly[(2*i)+1],poly[(2*i)+2],poly[(2*i)+3]);
getch( );
restorecrtmode( );
}

Potrebbero piacerti anche