ВУЗ:
Составители:
ОСНОВЫ КОМПЬЮТЕРНОЙ ГРАФИКИ, часть 1 41
Пусть на
()
1−i -м шаге текущей точкой отрезка является
()
qrP
i
,
1
=
−
. Выбор
следующей точки
i
S или
i
T зависит от знака разности
(
)
ts
−
. Если
()
0
<
−
ts ,
то
()
qrTP
ii
,1+== и тогда 1
1
+
=
+ ii
xx ,
ii
yy
=
+1
, если же
()
0≥− ts , то
()
1,1 ++== qrSP
ii
и тогда 1
1
+
=
+ ii
xx , 1
1
+
=
+ ii
yy .
()
qr
dx
dy
s −+= 1,
()
11 +−+= r
dx
dy
qt ,
⇒
()
1212 −−+=− qr
dx
dy
ts
⇒
()
(
)
dxdydxqdyrtsdx
−
+
⋅
−
⋅
=
−
22.
Поскольку знак
()
tsdx − совпадает со знаком разности
()
ts − , то будем
проверять знак выражения
(
)
tsdxd
i
−
=
. Так как
1−
=
i
xr и
1−
=
i
yq , то
()
11
22
−+
−−+=
iiii
yydxdydd .
Пусть на предыдущем шаге
0
<
i
d , тогда
()
0
1
=
−
−ii
yy и
dydd
ii
2
1
+=
+
. Если же на предыдущем шаге 0≥
i
d , то
()
1
1
=
−
−ii
yy и
()
dxdydd
ii
−+=
+
2
1
.
Осталось узнать как вычислить
1
d
. Так как при 1
=
i :
()
(
)
0,0,
00
=
yx , dxdyd
−
=
⇒ 2
1
.
Далее приводится листинг процедуры на языке Паскаль, реализующей
алгоритм Брезенхема.
Procedure Bresenham(x1,y1,x2,y2,Color: integer);
var
dx,dy,incr1,incr2,d,x,y,xend: integer;
begin
dx:= ABS(x2-x1);
dy:= Abs(y2-y1);
d:=2*dy-dx; {начальное значение для d}
incr1:=2*dy; {приращение для d<0}
incr2:=2*(dy-dx); {приращение для d>=0}
if x1>x2 then {начинаем с точки с меньшим знач. x}
begin
x:=x2;
y:=y2;
xend:=x1;
end
ОСНОВЫ КОМПЬЮТЕРНОЙ ГРАФИКИ, часть 1 41
Пусть на (i − 1)-м шаге текущей точкой отрезка является Pi −1 = (r , q ). Выбор
следующей точки S i или Ti зависит от знака разности (s − t ) . Если (s − t ) < 0 ,
то Pi = Ti = (r + 1, q ) и тогда xi +1 = x i + 1, y i +1 = y i , если же (s − t ) ≥ 0 , то
Pi = S i = (r + 1, q + 1) и тогда xi +1 = xi + 1 , y i +1 = y i + 1 .
dy
s= (r + 1) − q , t = q + 1 − dy (r + 1) , ⇒
dx dx
dy
s − t = 2 (r + 1) − 2q − 1 ⇒
dx
dx(s − t ) = 2(r ⋅ dy − q ⋅ dx ) + 2dy − dx .
Поскольку знак dx(s − t ) совпадает со знаком разности (s − t ) , то будем
проверять знак выражения d i = dx(s − t ) . Так как r = x i −1 и q = y i −1 , то
d i +1 = d i + 2dy − 2dx( y i − y i −1 ) .
Пусть на предыдущем шаге d i < 0 , тогда ( y i − y i −1 ) = 0 и
d i +1 = d i + 2dy . Если же на предыдущем шаге d i ≥ 0 , то ( y i − y i −1 ) = 1 и
d i +1 = d i + 2(dy − dx ) .
Осталось узнать как вычислить d1 . Так как при i = 1 :
(x0 , y 0 ) = (0,0 ), ⇒ d1 = 2dy − dx .
Далее приводится листинг процедуры на языке Паскаль, реализующей
алгоритм Брезенхема.
Procedure Bresenham(x1,y1,x2,y2,Color: integer);
var
dx,dy,incr1,incr2,d,x,y,xend: integer;
begin
dx:= ABS(x2-x1);
dy:= Abs(y2-y1);
d:=2*dy-dx; {начальное значение для d}
incr1:=2*dy; {приращение для d<0}
incr2:=2*(dy-dx); {приращение для d>=0}
if x1>x2 then {начинаем с точки с меньшим знач. x}
begin
x:=x2;
y:=y2;
xend:=x1;
end
Страницы
- « первая
- ‹ предыдущая
- …
- 39
- 40
- 41
- 42
- 43
- …
- следующая ›
- последняя »
