Быстродействие алгоритма можно существенно увеличить, если использовать только целочисленную арифметику и исключить деление. Т.к. важен лишь знак ошибки, то приняв
можно добиться хорошей скорости выполнения алгоритма.
2.2 Разбор случаев для обобщённого алгоритма Брезенхема.
Чтобы реализация алгоритма была полной необходимо обрабатывать отрезки во всех октантах. Когда абсолютная величина углового коэффициента больше 1, yпостоянно изменяется на единицу, а критерий ошибки Брезенхема используется для принятия решения об изменении величены x.Выбор постоянно изменяющейся (на +1 или –1) координаты зависит от квадранта (рис. 2.2).
Алгоритм Брезенхема может быть оформлен в следующем виде.
Обобщённый целочисленный алгоритм Брезенхема квадрантов
предполагается, что концы отрезка (x1,y1) и (x2,y2) не совпадают и все переменные-целые.
Функция Sign возвращает - 1, 0, 1 для отрицательного нулевого и положительного аргумента соответственно.
инициализация переменных
x = x1
y = y1
Dx = abs ( x2 - x1 )
Dy = abs ( y2 - y1 )
s1 = Sign ( x2 - x1 )
s2 = Sign ( y2 - y1 )
обмен значение Dx и Dy в зависимости от углового коэффициента наклона отрезка
ifDy > Dx then
Врем =Dx
Dx = Dy
Dy = Врем
Обмен = 1
else
Обмен = 0
end if
инициализация
с поправкой на половину пиксела = 2 * Dy -Dxосновной цикл
for i = 1 toDx
Plot ( x ,y )
While (
³ 0 )IfОбмен = 1 then
x = x + s1
else
y = y + s2
end if
= - 2 * Dxend while
ifОбмен = 1 then
y = y + s2
else
x = x + s1
end if
= + 2 * Dynext i
finish
Этот алгоритм удовлетворяет самым строгим требованиям. Он имеет приемлемую скорость и может быть легко реализован на аппаратном или микропрограммном уровне.
Алгоритм Брезенхема для генерации окружностей
В растр нужно разлагать не только линейные, но и другие, более сложные функции. Разложению конических сечений, т. е. окружностей, эллипсов, парабол, гипербол посвящено значительное число работ.Наибольшее внимание, разумеется, уделено окружности. Один из наиболее эффективныхи простых для понимания алгоритмов генерации окружности принадлежит
2.3 Генерация полной окружности из дуги в первом октанте
Брезенхему. Для начала заметим, что необходимо сгенерировать только одну восьмую часть окружности. Остальные её части могут быть получены последовательными отражениями, как это показано на рис. 2.3. Если сгенерирован первый октант (от 0° до 45° против часовой стрелки), то второй октант можно получить зеркальным отражением относительно прямой у = x, что дает в совокупности первый квадрант. Первый квадрант отражается относительно прямой x = 0 для получения соответствующей части окружности во втором квадранте. Верхняя полуокружность отражается относительно прямой у = 0 для завершения построения. На рис.2.3. приведены двумерные матрицы соответствующих преобразований.
Для вывода алгоритма рассмотрим первую четверть окружности с центром в начале координат. Заметим, что если работа алгоритма начинается в точке x = 0, у = R, то при генерации окружности по часовой стрелке в первом квадранте у является монотонно убывающей функцией аргумента x (рис. 2.4). Аналогично, если исходной точкой является y = 0, x = R, то при генерации окружности против часовой стрелки x будет монотонно убывающей функцией аргумента у. В нашем случае выбирается генерация по часовой стрелке с началом в точке x = 0, у = R. Предполагается,что центр окружности и начальная точка находятся точно в точках растра.
Для любой заданной точки на окружности при генерации по часовой стрелке существует только три возможности выбрать следующий пиксел, наилучшим образом приближающий окружность: горизонтально вправо, по диагонали вниз и вправо, вертикально вниз. На рис.2.5 эти направления обозначены соответственно mH, mD, mV.
2.4 Окружность в первом квадранте. 2.5 Выбор пикселов в первом квадранте
Алгоритм выбирает пиксел, для которого минимален квадрат расстояния между одним из этих пикселов и окружностью, т. е. минимум из
mH = | ( xi + 1 )2 + ( yi )2 – R2 |
mH = | ( xi + 1 )2 + ( yi- 1 )2 – R2 |
mH = | ( xi )2 + ( yi- 1 )2 – R2 |
Вычисления можно упростить, если заметить, что в окрестности точки ( xi, yi ) возможны только пять типов пересечений окружности и сетки растра, приведенных на рис.2.6.
Разность между квадратами расстояний от центра окружности до диагонального пиксела ( xi+ 1, yi- 1) и от центра до точки на окружности R2 равна
Как и в алгоритме Брезенхема для отрезка, для выбора соответствующего пиксела желательно использовать только знак ошибки, а не её величину.
2.6 Пересечение окружности и сетки растра
При D < 0 диагональная точка ( xi+ 1, yi- 1) находится внутри реальной окружности, т. е. это случаи 1 или 2 на рис.2.6. Ясно, что в этой ситуации следует выбрать либо пиксел ( xi+ 1, yi )т. е. mH, либо пиксел ( xi+ 1, yi- 1), т. е. mD. Для этого сначала рассмотрим случай 1 и проверим разность квадратов расстояний отокружности до пикселов в горизонтальном и диагональном направлениях:
При d < 0 расстояние от окружности до диагонального пиксела
(mD)больше, чем до горизонтального (mH). Напротив, если d > 0, расстояние до горизонтального пиксела (mH)больше. Таким образом,
при d < 0 выбираем mH( xi + 1, уi )
при d > 0 выбираем mD ( xi + 1, уi – 1 )
При d = 0, когда расстояния от окружности до обоих пикселоводинаковы, выбираем горизонтальный шаг.
Количество вычислений, необходимых для оценки величины d, можно сократить, если заметить, что в случае 1
так как диагональный пиксел ( xi + 1, уi – 1 ) всегда лежит внутри окружности, а горизонтальный ( xi + 1, уi ) - вне ее. Таким образом, d можно вычислить по формуле
Дополнение до полного квадрата члена ( yi )2 с помощью добавления и вычитания - 2уi + 1 дает
В квадратных скобках стоит по определению Di, и его подстановка
d = 2(Di + yi) – 1
существенно упрощает выражение.
Рассмотрим случай 2 на рис.2.6 и заметим, что здесь должен быть выбран горизонтальный пиксел ( xi + 1, уi ), так как у является монотонно убывающей функцией. Проверка компонент d показывает, что
поскольку в случае 2 горизонтальный ( xi + 1, уi ) и диагональный ( xi + 1, уi – 1 ) пикселы лежат внутри окружности. Следовательно, d < 0, и при использовании того же самого критерия, что и в случае 1, выбирается пиксел ( xi + 1, уi ).
Если Di > 0, то диагональная точка ( xi + 1, уi – 1 ) находится вне окружности, т. е. это случаи З и 4 на рис.2.6. В данной ситуации ясно, что должен быть выбран либо пиксел ( xi + 1, уi – 1 ), т. е. mD, либо ( xi, уi – 1 ), т. е. mV. Аналогично разбору предыдущего случая критерий выбора можно получить, рассматривая сначала случай З и проверяя разность между квадратами расстояний от окружности до диагонального mD и вертикального mV пикселов, т. е.
При d\ < 0 расстояние от окружности до вертикального пиксела ( xi, уi – 1 ) больше и следует выбрать диагональный шаг mD, к пикселу ( xi + 1, уi – 1 ). Напротив, в случае d\ > 0 расстояние от окружности до диагонального пиксела больше и следует выбрать вертикальное движение к пикселу ( xi, уi – 1 ). Таким образом,
при d£0 выбираем mD в ( xi + 1, уi – 1 )
при d< 0 выбираем mV в ( xi, уi – 1 )
Здесь в случае d = 0, т. е. когда расстояния равны, выбран диагональный шаг.
Проверка компонент d\ показывает, что
поскольку для случая З диагональный пиксел ( xi + 1, уi – 1 ) находится вне окружности, тогда как вертикальный пиксел ( xi, уi – 1 ) лежит внутри ее. Это позволяет записать d\ в виде