Marcella
- Recorte de línea usando cohen sutherland algo - * /
/ * ------ * /
#include
#include
typedef unsigned int outcode;
enumeración {ARRIBA = 0x1, ABAJO = 0x2, DERECHA = 0x4, IZQUIERDA = 0x8};
void lineclip (x0, y0, x1, y1, xwmin, ywmin, xwmax, ywmax)
flotante x0, y0, x1, y1, xwmin, ywmin, xwmax, ywmax;
{
int gd, gm;
outcode code0, code1, codeout;
int aceptar = 0, hecho = 0;
code0 = calcode (x0, y0, xwmin, ywmin, xwmax, ywmax);
code1 = calcode (x1, y1, xwmin, ywmin, xwmax, ywmax);
hacer {
si (! (código0 | código1))
{aceptar = 1; hecho = 1; }
else
if (code0 & code1) done = 1;
else
{
flotar x, y;
codeout = code0? Code0: Code1;
if (salida de código y TOP)
{
x = x0 + (x1-x0) * (ywmax-y0) / (y1-y0);
y = ywmax;
}
else
if (salida de código & BOTTOM)
{
x = x0 + (x1-x0) * (ywmin-y0) / (y1-y0);
y = ywmin;
}
más
si (salida de código y DERECHA)
{
y = y0 + (y1-y0) * (xwmax-x0) / (x1-x0);
x = xwmax;
}
más
{
y = y0 + (y1-y0) * (xwmin-x0) / (x1-x0);
x = xwmin;
}
si (codeout == code0)
{
x0 = x; y0 = y;
code0 = calcode (x0, y0, xwmin, ywmin, xwmax, ywmax);
}
más
{
x1 = x; y1 = y;
code1 = calcode (x1, y1, xwmin, ywmin, xwmax, ywmax);
}
}
} while (hecho == 0);
if (aceptar) línea (x0, y0, x1, y1);
rectángulo (xwmin, ywmin, xwmax, ywmax);
getch ();
}
/ * ------ * /
int calcode (x, y, xwmin, ywmin, xwmax, ywmax)
float x, y, xwmin, ywmin, xwmax, ywmax;
{
int código = 0;
if (y> ywmax)
código | = TOP;
else if (y xwmax)
código | = DERECHA;
si no (x <xwmin)
código | = IZQUIERDA;
código de retorno);
}
/ * ------ * /
main ()
{
flotante x2, y2, x1, y1, xwmin, ywmin, xwmax, ywmax;
int gd, gm;
detectgraph (& gd, & gm);
initgraph (& gd, & gm, "C: \\ TC \\ BGI");
printf ("\ n \ n \ tIntroduce las coordenadas de la Línea:");
printf ("\ n \ n \ tX1 Y1:");
scanf ("% f% f", & x1, & y1);
printf ("\ n \ n \ tX2 Y2:");
scanf ("% f% f", & x2, & y2);
printf ("\ n \ tIntroduce las coordenadas de la ventana: \ n");
printf ("\ n \ txwmin, ywmin:");
scanf ("% f% f",
& xwmin, & ywmin);
printf ("\ n \ txwmax, ywmax:");
scanf ("% f% f", & xwmax, & ywmax);
línea (x1, y1, x2, y2);
rectángulo (xwmin, ywmin, xwmax, ywmax);
getch ();
cleardevice ();
clip de línea (x1, y1, x2, y2, xwmin, ywmin, xwmax, ywmax);
getch ();
closegraph ();
}
/ ****** RECORTES DE LÍNEA COHEN-SUTHERLAND ****** /