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

UptoLike

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

Основы компьютерной графики для программистов 37
____________________________________________________________________________________________________________________
http://www.ksu.ru/persons/9134.ru.html
отрезков прямых было найдено Брезенхемом. В его алгоритме вообще не используются
операции с вещественными числами, в том числе операции умножения и деления.
Для вывода формул алгоритма Брезенхема рассмотрим рис. 30.
Пусть начало отрезка имеет координаты
(
)
1,1 yx , а конец
()
2,2 yx . Обозначим
()
12 xxdx = ,
()
12 yydy = . Не нарушая общности, будем считать, что начало
отрезка совпадает с началом координат, и прямая имеет вид
x
dy
dx
y =
, где
[]
1,0
dy
dx
.
Считаем что начальная точка находится слева. Пусть на
(
)
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
.
Рис. 30. Рисование отрезков прямых по методу Брезенхема.
Основы компьютерной графики для программистов                                                                  37
____________________________________________________________________________________________________________________



отрезков прямых было найдено Брезенхемом. В его алгоритме вообще не используются
операции с вещественными числами, в том числе операции умножения и деления.
Для вывода формул алгоритма Брезенхема рассмотрим рис. 30.




                                  Рис. 30. Рисование отрезков прямых по методу Брезенхема.

Пусть начало отрезка имеет координаты                           (x1, y1) ,   а конец   (x2, y 2 ) .   Обозначим
dx = ( x 2 − x1) , dy = ( y 2 − y1) . Не нарушая общности, будем считать, что начало
                                                                      dx         dx
отрезка совпадает с началом координат, и прямая имеет вид y =            x , где    ∈ [0,1].
                                                                      dy         dy
Считаем что начальная точка находится слева. Пусть на (i − 1) -м шаге текущей точкой
отрезка является Pi −1 = (r , q ) . Выбор следующей точки S i или Ti зависит от знака
разности (s − t ) . Если (s − t ) < 0 , то Pi = Ti = (r + 1, q ) и тогда x i +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 .
http://www.ksu.ru/persons/9134.ru.html