Марселла
- Отсечение строки с использованием алгоритма cohen sutherland - * /
/ * ------ * /
#include
#include
typedef unsigned int outcode;
перечисление {TOP = 0x1, BOTTOM = 0x2, RIGHT = 0x4, LEFT = 0x8};
void lineclip (x0, y0, x1, y1, xwmin, ywmin, xwmax, ywmax)
float x0, y0, x1, y1, xwmin, ywmin, xwmax, ywmax;
{
int gd, gm;
исходящий код code0, code1, codeout;
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; сделано = 1; }
иначе,
если (code0 & code1) done = 1;
else
{
float x, y;
codeout = code0? Code0: Code1;
если (codeout & TOP)
{
x = x0 + (x1-x0) * (ywmax-y0) / (y1-y0);
y = ywmax;
}
иначе,
если (codeout & BOTTOM)
{
x = x0 + (x1-x0) * (ywmin-y0) / (y1-y0);
y = ywmin;
}
иначе,
если (codeout & RIGHT)
{
y = y0 + (y1-y0) * (xwmax-x0) / (x1-x0);
x = xwmax;
}
иначе
{
y = y0 + (y1-y0) * (xwmin-x0) / (x1-x0);
x = xwmin;
}
если (codeout == code0)
{
x0 = x; y0 = y;
code0 = calcode (x0, y0, xwmin, ywmin, xwmax, ywmax);
}
иначе
{
x1 = x; y1 = y;
code1 = calcode (x1, y1, xwmin, ywmin, xwmax, ywmax);
}
}
} while (done == 0);
if (принять) строку (x0, y0, x1, y1);
прямоугольник (xwmin, ywmin, xwmax, ywmax);
getch ();
}
/ * ------ * /
int calcode (x, y, xwmin, ywmin, xwmax, ywmax)
float x, y, xwmin, ywmin, xwmax, ywmax;
{
int code = 0;
если (y> ywmax)
код | = TOP;
иначе, если (y xwmax)
код | = ВПРАВО;
иначе, если (x <xwmin)
код | = LEFT;
возврат (код);
}
/ * ------ * /
main ()
{
float x2, y2, x1, y1, xwmin, ywmin, xwmax, ywmax;
int gd, gm;
обнаружить граф (& gd, & gm);
initgraph (& gd, & gm, "C: \\ TC \\ BGI");
printf ("\ n \ n \ tВведите координаты линии:");
printf ("\ п \ п \ tX1 Y1:");
scanf ("% f% f", & x1, & y1);
printf ("\ п \ п \ tX2 Y2:");
scanf ("% f% f", & x2, & y2);
printf ("\ n \ tВведите координаты окна: \ n");
printf ("\ п \ txwmin, ywmin:");
scanf ("% f% f",
& xwmin, & ywmin);
printf ("\ п \ txwmax, ywmax:");
scanf ("% f% f", & xwmax, & ywmax);
строка (x1, y1, x2, y2);
прямоугольник (xwmin, ywmin, xwmax, ywmax);
getch ();
cleardevice ();
lineclip (x1, y1, x2, y2, xwmin, ywmin, xwmax, ywmax);
getch ();
closegraph ();
}
/ ****** ОБРЕЗКА ЛИНИИ КОЭН-САЗЕРЛЕНДА ****** /