Основы компьютерной графики для программистов. Казанцев А.В. - 40 стр.

UptoLike

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

Основы компьютерной графики для программистов 40
____________________________________________________________________________________________________________________
http://www.ksu.ru/persons/9134.ru.html
вне/внутри заменяется на точку, лежащую на стороне окна или на прямой содержащей
сторону. При этом порядок перебора сторон окна не имеет значения.
Далее приводится текст процедуры на языке Паскаль, с довольно изящной реализацией
этого метода. Отрезок задан граничными точками
(
)
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);
{проверка на отбрасывание}
reject:=Reject_Check(outcode1,outcode2);
if reject then done:= true
else
begin {возможно принятие целиком}
accept:=Accept_Check(outcode1,outcode2);
if accept then done:=true
else
begin {разделить отрезок}
{если P1 внутри, то с помощью SWAP сделать снаружи}
if not((outcode1[1])or(outcode1[2])or
(outcode1[3])or(outcode1[4])) then SWAP;
{теперь P1 перемещается в точку пересечения}
if outcode1[1] then
begin {отбросить верхнюю часть}
x1:=x1+(x2-x1)*(ymax-y1)/(y2-y1);
y1:=ymax;
end
else if outcode1[2] then
if outcode1[1] then
begin {отбросить нижнюю часть}
x1:=x1+(x2-x1)*(ymin-y1)/(y2-y1);
y1:=ymin;
end
else if outcode1[3] then
begin {отбросить правую часть}
y1:=x1+(y2-y1)*(ymax-x1)/(x2-x1);
x1:=xmax;
Основы компьютерной графики для программистов                                                                  40
____________________________________________________________________________________________________________________



вне/внутри заменяется на точку, лежащую на стороне окна или на прямой содержащей
сторону. При этом порядок перебора сторон окна не имеет значения.
Далее приводится текст процедуры на языке Паскаль, с довольно изящной реализацией
этого метода. Отрезок задан граничными точками 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);
{проверка на отбрасывание}
 reject:=Reject_Check(outcode1,outcode2);
  if reject then done:= true
  else
     begin {возможно принятие целиком}
          accept:=Accept_Check(outcode1,outcode2);
     if accept then done:=true
     else
begin {разделить отрезок}
{если P1 внутри, то с помощью SWAP сделать снаружи}
if not((outcode1[1])or(outcode1[2])or
       (outcode1[3])or(outcode1[4])) then SWAP;
{теперь P1 перемещается в точку пересечения}
  if outcode1[1] then
   begin {отбросить верхнюю часть}
     x1:=x1+(x2-x1)*(ymax-y1)/(y2-y1);
     y1:=ymax;
   end
else if outcode1[2] then
if outcode1[1] then
   begin {отбросить нижнюю часть}
     x1:=x1+(x2-x1)*(ymin-y1)/(y2-y1);
     y1:=ymin;
   end
else if outcode1[3] then
   begin {отбросить правую часть}
     y1:=x1+(y2-y1)*(ymax-x1)/(x2-x1);
     x1:=xmax;

http://www.ksu.ru/persons/9134.ru.html