Marcella
    
     - Linien-Clipping mit Cohen-Sutherland-Algo -*/
      
/*------*/
      
     
#include
      
#include
      
     
typedef unsigned int outcode;
      
Aufzählung { TOP=0x1, UNTEN=0x2, RECHTS=0x4, LINKS=0x8};
      
     
void lineclip(x0,y0,x1,y1,xwmin,ywmin,xwmax,ywmax )
      
float x0,y0,x1,y1,xwmin,ywmin,xwmax,ywmax;
      
{
      
     
int gd,gm;
      
outcode code0,code1,codeout;
      
int akzeptieren = 0, fertig = 0;
      
     
code0 = calcode(x0,y0,xwmin,ywmin,xwmax,ywmax);
      
code1 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax);
      
     
do{
      
if(!(code0 | code1))
      
{ akzeptieren =1; fertig =1; }
      
else
      
if(code0 & code1) done = 1;
     
else
      
{
      
float x,y;
      
Codeout = Code0 ? Code0: Code1;
      
if(codeout & TOP)
      
{
      
x = x0 + (x1-x0)*(ywmax-y0)/(y1-y0);
      
y = ywmax;
      
}
      
Else
      
if (CodeOut & unten)
      
{
      
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);
      
}
      
sonst
      
{
      
x1 = x; y1 = y;
      
code1 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax);
      
}
      
}
      
} Während (erledigt == 0);
      
     
if(akzeptieren) line(x0,y0,x1,y1);
      
     
Rechteck(xwmin,ywmin,xwmax,ywmax);
      
     
getch();
      
     
}
      
/*------*/
      
     
int calcode (x,y,xwmin,ywmin,xwmax,ywmax)
      
float x,y,xwmin,ywmin,xwmax,ywmax;
      
{
      
int-Code = 0;
      
     
if(y> ywmax)
      
Code |=TOP;
      
sonst if( y xwmax)
      
Code |= RECHTS;
     
else if ( x< xwmin) 
Code |= LINKS
      ;
      
     
Rückgabe Code);
      
}
      
     
/*------*/
      
     
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\tGeben Sie die Koordinaten der Linie ein:");
      
     
printf("\n\n\tX1 Y1 : ");
      
scanf("%f %f",&x1,&y1);
      
     
printf("\n\n\tX2 Y2 : ");
      
scanf("%f %f",&x2,&y2);
      
     
printf("\n\tGeben Sie die Koordinaten des Fensters ein :\n ");
      
printf("\n\txwmin , ywmin : ");
      
scanf("%f %f",
     &xwmin,&ywmin); 
printf("\n\txwmax , ywmax : ");
     
scanf("%f %f",&xwmax,&ywmax);
     
     
Linie(x1,y1,x2,y2);
     
Rechteck(xwmin,ywmin,xwmax,ywmax);
     
getch();
     
cleardevice();
     
     
Linienclip (x1,y1,x2,y2,xwmin,ywmin,xwmax,ywmax);
     
getch();
     
closegraph();
     
     
}
      
     
/****** COHEN-SUTHERLAND LINIENAUSSCHNITT ******/