Основы компьютерной графики: Часть 1. Математический аппарат компьютерной графики. Казанцев А.В. - 44 стр.

UptoLike

Составители: 

ОСНОВЫ КОМПЬЮТЕРНОЙ ГРАФИКИ, часть 1 44
Иначе биту присваивается нулевое значение. Значения этих битов для
конечных точек отрезков легко определить по знакам соответствующих
разностей:
()
yy
max
- для 1-го бита,
(
)
min
yy
- для 2-го бита,
()
xx
max
-
для 3-го бита и
()
min
xx
- для 4-го бита. Отрезок рисуется без отсечения, то
есть принимается целиком, если оба кода равны 0000, или
[]
1кодP ИЛИ
[]
00002 =кодP , где ИЛИбинарная операция. Отрезок
отбрасывается без вычислений если оба его конца находятся выше, ниже,
правее или левее окна. В этих случаях соответствующие биты в обоих кодах
равны 1 и это легко определить, умножив эти коды по бинарной операции И.
Если результат операции И равен 0000, то отрезок нельзя ни принять ни
отбросить, так как он может пересекаться с окном. В этом случае
применяется последовательное разделение отрезка, так что на каждом шаге
конечная точка отрезка с ненулевым кодом вне/внутри заменяется на точку,
лежащую на стороне окна или на прямой содержащей сторону. При этом
порядок перебора сторон окна не имеет значения.
Далее приводится
текст процедуры на языке Паскаль, с довольно
изящной реализацией этого метода. Отрезок задан граничными точками
()
1,11 yxP = ,
()
2,22 yxP = , границы окна: xmin, xmax, ymin, ymax.
Используются вызовы процедур: Accept_Check – выполняет проверку на
полное принятие отрезка; Reject_Check – на полный отказ от рисования
отрезка; Outcodes – вычисляет 4-х битовый кодвне/внутри”; SWAP – меняет
местами координаты двух точек.
Procedure CLIP(x1,x2,y1,y2,xmin,xmax,ymin,ymax: real);
type
outcode = array[1..4] of boolean;
var
accept,reject,done: boolean;
outcode1,outcode2,
outcode3,outcode4:outcode;{коды вне/внутри}
begin
accept:= false;
reject:= false;
done:= false;
repeat
Outcodes(x1,y1,outcode1);
Outcodes(x2,y2,outcode2);
{проверка на отбрасывание}
ОСНОВЫ КОМПЬЮТЕРНОЙ ГРАФИКИ, часть 1                                                44



       Иначе биту присваивается нулевое значение. Значения этих битов для
конечных точек отрезков легко определить по знакам соответствующих
разностей: ( y max − y ) - для 1-го бита, ( y − y min ) - для 2-го бита, ( x max − x ) -
для 3-го бита и ( x − x min ) - для 4-го бита. Отрезок рисуется без отсечения, то
есть принимается целиком, если оба кода равны 0000, или
[кодP1] ИЛИ [кодP2] = 0000 , где ИЛИ – бинарная операция. Отрезок
отбрасывается без вычислений если оба его конца находятся выше, ниже,
правее или левее окна. В этих случаях соответствующие биты в обоих кодах
равны 1 и это легко определить, умножив эти коды по бинарной операции И.
Если результат операции И равен 0000, то отрезок нельзя ни принять ни
отбросить, так как он может пересекаться с окном. В этом случае
применяется последовательное разделение отрезка, так что на каждом шаге
конечная точка отрезка с ненулевым кодом вне/внутри заменяется на точку,
лежащую на стороне окна или на прямой содержащей сторону. При этом
порядок перебора сторон окна не имеет значения.
       Далее приводится текст процедуры на языке Паскаль, с довольно
изящной реализацией этого метода. Отрезок задан граничными точками
P1 = ( x1, y1) , P 2 = ( x 2, y 2 ) , границы окна: xmin, xmax, ymin, ymax.
Используются вызовы процедур: Accept_Check – выполняет проверку на
полное принятие отрезка; Reject_Check – на полный отказ от рисования
отрезка; Outcodes – вычисляет 4-х битовый код “вне/внутри”; SWAP – меняет
местами координаты двух точек.

Procedure CLIP(x1,x2,y1,y2,xmin,xmax,ymin,ymax: real);
type
 outcode = array[1..4] of boolean;
var
 accept,reject,done: boolean;
outcode1,outcode2,
outcode3,outcode4:outcode;{коды вне/внутри}
begin
 accept:= false;
 reject:= false;
 done:= false;
repeat
Outcodes(x1,y1,outcode1);
Outcodes(x2,y2,outcode2);
{проверка на отбрасывание}