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 ******/