Marcella
- Coupure de ligne en utilisant cohen sutherland algo -*/
/*------*/
#include
#include
typedef unsigned int outcode ;
enum { HAUT=0x1, BAS=0x2, DROIT=0x4, GAUCHE=0x8 } ;
void lineclip(x0,y0,x1,y1,xwmin,ywmin,xwmax,ywmax )
float x0,y0,x1,y1,xwmin,ywmin,xwmax,ywmax;
{
int gd, gm;
code de sortie 0, code 1, code de sortie ;
int accept = 0, done=0 ;
code0 = calcode(x0,y0,xwmin,ywmin,xwmax,ywmax);
code1 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax);
do{
if(!(code0 | code1))
{ accept =1 ; fait =1; }
else
if(code0 & code1) done = 1;
else
{
float x,y;
code out = code0 ? Code0 : Code1;
if(codeout & TOP)
{
x = x0 + (x1-x0)*(ywmax-y0)/(y1-y0) ;
y = ywmax;
}
else
if( codeout & BOTTOM)
{
x = x0 + (x1-x0)*(ywmin-y0)/(y1-y0);
y = ywmin;
}
else
if ( codeout & RIGHT)
{
y = y0+(y1-y0)*(xwmax-x0)/(x1-x0);
x = xwmax ;
}
else
{
y = y0 + (y1-y0)*(xwmin-x0)/(x1-x0) ;
x = xwmin;
}
if( codeout == code0)
{
x0 = x; y0 = y;
code0=calcode(x0,y0,xwmin,ywmin,xwmax,ywmax);
}
else
{
x1 = x; y1 = y;
code1 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax);
}
}
} while( done == 0);
if(accepte) ligne(x0,y0,x1,y1) ;
rectangle(xwmin,ywmin,xwmax,ywmax);
getch();
}
/*------*/
int calcode (x,y,xwmin,ywmin,xwmax,ywmax)
float x,y,xwmin,ywmin,xwmax,ywmax;
{
code int =0;
if(y> ywmax)
code |=TOP;
sinon si( y xwmax)
code |= DROITE;
sinon si ( x< xwmin)
code |= GAUCHE;
Code de retour);
}
/*------*/
main()
{
float x2,y2,x1,y1,xwmin,ywmin,xwmax,ywmax;
int gd,gm;
detectgraph(&gd,&gm);
initgraph(&gd,&gm,"C:\\TC\\BGI");
printf("\n\n\tEntrez les coordonnées de la ligne :");
printf("\n\n\tX1 Y1 : ");
scanf("%f %f",&x1,&y1);
printf("\n\n\tX2 Y2 : ");
scanf("%f %f",&x2,&y2);
printf("\n\tEntrez les coordonnées de la fenêtre :\n ");
printf("\n\txwmin , ywmin : ");
scanf("%f %f",
&xwmin,&ywmin);
printf("\n\txwmax , ywmax : ");
scanf("%f %f",&xwmax,&ywmax);
ligne(x1,y1,x2,y2) ;
rectangle(xwmin,ywmin,xwmax,ywmax);
getch();
cleardevice();
lineclip(x1,y1,x2,y2,xwmin,ywmin,xwmax,ywmax );
getch();
closegraph();
}
/****** COUPE DE LIGNE COHEN-SUTHERLAND ******/