Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Алгоритм Коэна Сазерленда - Пример реализации23 января 2011Оглавление: 1. Алгоритм Коэна Сазерленда 2. Пример реализации Пример реализации на языке C для двумерной модели:
#define LEFT 1 /* двоичное 0001 */
#define RIGHT 2 /* двоичное 0010 */
#define BOT 4 /* двоичное 0100 */
#define TOP 8 /* двоичное 1000 */
/* точка */
struct point {
double x, y;
};
/* прямоугольник */
struct rect {
double x_min, y_min, x_max, y_max;
};
/* вычисление кода точки
r : указатель на struct rect; p : указатель на struct point */
#define vcode \
->x <->x_min) ? LEFT : 0) + /* +1 если точка левее прямоугольника */ \
->x >->x_max) ? RIGHT : 0) + /* +2 если точка правее прямоугольника */\
->y <->y_min) ? BOT : 0) + /* +4 если точка ниже прямоугольника */ \
->y >->y_max) ? TOP : 0)) /* +8 если точка выше прямоугольника */
/* если отрезок ab не пересекает прямоугольник r, функция возвращает -1;
если отрезок ab пересекает прямоугольник r, функция возвращает 0 и отсекает
те части отрезка, которые находятся вне прямоугольника */
int cohen_sutherland
{
int code_a, code_b, code; /* код конечных точек отрезка */
struct point *c; /* одна из точек */
code_a = vcode;
code_b = vcode;
/* пока одна из точек отрезка вне прямоугольника */
while {
/* если обе точки с одной стороны прямоугольника, то отрезок не пересекает прямоугольник */
if
return -1;
/* выбираем точку c с ненулевым кодом */
if {
code = code_a;
c = a;
} else {
code = code_b;
c = b;
}
/* если c левее r, то передвигаем c на прямую x = r->x_min
если c правее r, то передвигаем c на прямую x = r->x_max */
if {
c->y += * / ;
c->x = r->x_min;
} else if {
c->y += * / ;
c->x = r->x_max;
}
/* если c ниже r, то передвигаем c на прямую y = r->y_min
если c выше r, то передвигаем c на прямую y = r->y_max */
if {
c->x += * / ;
c->y = r->y_min;
} else if {
c->x += * / ;
c->y = r->y_max;
}
/* обновляем код */
if
code_a = vcode;
else
code_b = vcode;
}
/* оба кода равны 0, следовательно обе точки в прямоугольнике */
return 0;
}
Пример реализации на языке C для трёхмерной модели:
#define BOTTOM 1 // 00 000001
#define LEFT 2 // 00 000010
#define TOP 4 // 00 000100
#define RIGHT 8 // 00 001000
#define BACK 16 // 00 010000
#define FRONT 32 // 00 100000
typedef struct Area {
float xlt,ylt,zlt; // Координаты левого верхнего угла ближней грани
float xrb,yrb,zrb; // Координаты правого нижнего угла дальней грани
} Area;
int GetCode {
int code = 0;
if // Точка выше области отсечения
code |= TOP;
else if // Точка ниже области отсечения
code |= BOTTOM;
if // Точка правее области отсечения
code |= RIGHT;
else if // Точка левее области отсечения
code |= LEFT;
if // Точка перед областью отсечения
code |= FRONT;
else if // Точка заобластью отсечения
code |= BACK;
return code;
}
// Трёхмерное отсечение методом Коэна-Сазерленда.
// beg - координаты начала отрезка
// end - координаты конца отрезка
// anArea - координаты отсекающей области
void CS_Clip
{
// Коды концов отрезка
int outcode0 = 0, outcode1 = 0, outcodeOut = 0;
char codes = {"000000","000000"};
float temp;
// Флаг видимости и флаг завершения отсечения
bool accept = false, done = false;
outcode0 = GetCode; // Вычисляем начальные коды концов отрезка
outcode1 = GetCode;
do
{
float x, y, z;
if ) { // Отрезок полностью видимый
accept = true;
done = true;
}
else if // Отрезок полностью невидимый
done = true;
else { // Отрезок частично видимый. Вычисление точек пересечения отрезка и области отсечения
outcodeOut = outcode0 ? outcode0: outcode1;
if {
x = beg+*/;
z = beg+*/;
y = anArea.ylt;
}
else if {
x = beg+*/;
z = beg+*/;
y = anArea.yrb;
}
else if {
y = beg+*/;
z = beg+*/;
x = anArea.xrb;
}
else if {
y = beg+*/;
z = beg+*/;
x = anArea.xlt;
}
else if {
x = beg+*/;
y = beg+*/;
z = anArea.zrb;
}
else if {
x = beg+*/;
y = beg+*/;
z = anArea.zlt;
}
if {
temp = x;
temp = y;
temp = z;
outcode0 = GetCode;
}
else {
temp = x;
temp = y;
temp = z;
outcode1 = GetCode;
}
}
}while ;
if { // Отрезок полностью видимый. Вывод отрезка на экран.
LINE;
}
}
Просмотров: 4540
|