Обобщенный целочисленный алгоритм Брезенхема квадрантов

Общий алгоритм Брезенхема

Целочисленный алгоритм Брезенхема для первого октанта

Целочисленный алгоритм Брезенхема

Алгоритм Брезенхема в том виде, как он представлен выше, требует использования арифметики с плавающей точкой и деления (для вычисления углового коэффициента и оценки ошибки). Быстродействие алгоритма можно увеличить, если использовать только целочисленную арифметику и исключить деление. Так как важен лишь знак ошибки, то простое преобразование

e'= 2еDх

превратит предыдущий алгорим в целочисленный и позволит эффективно реализовать его на аппаратном или микропрограммном уровне. Модифицированный целочисленный алгоритм для первого октанта, т. е. для 0<=Dy<=Dx таков:

предполагается, что концы отрезка (х1, у1) и (х2, у2) не совпадают и все переменные - целые

х = х1

у=у1

Dх = у2 - х1

Dу = у2 - х1

инициализируем е' с поправкой на половину пиксела

e' = 2*Dy - Dx

начало основного цикла

for i = 1 to Dх

Plot (x,y)

while (e' > 0)

у = у + 1

e' = e' - 2 *Dx

end while

x = x + 1

e' = e' + 2 * Dу

next i

finish

Чтобы реализация алгоритма Брезенхема была полной, необходимо обрабатывать отрезки во всех октантах. Модификацию легко сделать, учитывая в алгоритме номер квадранта, в котором лежит отрезок и его угловой коэффициент. Когда абсолютная величина углового коэффициента больше 1, у постоянно изменяется на единицу, а критерий ошибки Брезенхема используется для принятия решения об изменении величины х. Выбор постоянно изменяющейся (на +1 или -1) координаты зависит от квадранта.

Предполагается:

· концы отрезка (х1, у1) и (х2, у2) не совпадают;

· все переменные считаются целыми;

· функция Sign возвращает -1,0, 1 для отрицательного, нулевого и положительного аргумента соответственно.

инициализация переменных: х=х1 у=у1 Dх = abs (х2 - х1) Dу = abs (у2 - у1) s1 = Sign (х2 - х1) s2 = Sign (у2 - у1) обмен значений х и у в зависимости от углового коэффициента наклона отрезка: if Dу > Dх then Врем = Dх Dх = Dу Dу = Врем Обмен =1 else Обмен = 0 end if Разбор случаев для обобщённого алгоритма Брезенхема.

инициализация е' с поправкой на половину пиксела:

e' = 2 * Dу - Dх

основной цикл:

for i = 1 to Dх

Plot(x, у)

while (e' >= 0)

If Обмен = 1 then

x = x + s1

else

y = y + s2

end if

e' = e' - 2 * Dх

end while

If Обмен = l then

у = у + s2

else

x = x + s1

end if

e' = e' + 2* Dy

next i

finish