Растровое преобразование графических примитивов
Алгоритмы Брезенхема растровой дискретизации окружности и эллипса
Алгоритм изображения окружности несколько сложнее, чем построение
отрезка. Мы рассмотрим его для случая окружности радиуса с центром в
начале координат. Перенесение его на случай произвольного центра не
составляет труда. При построении растровой развертки окружности можно
воспользоваться ее симметрией относительно координатных осей и прямых
. Необходимо сгенерировать лишь одну восьмую часть окружности, а
остальные ее части можно получить путем отображений симметрии. За
основу можно взять часть окружности от 0 до 45
в направлении по
часовой стрелке с исходной точкой построения
. В этом случае
координата окружности
является монотонно убывающей функцией
координаты
.
При выбранном направлении движения по окружности имеется только три возможности для расположения ближайшего пикселя: на единицу вправо, на единицу вниз и по диагонали вниз (рис. 8.7). Выбор варианта можно осуществить, вычислив расстояния до этих точек и выбрав минимальное из них:

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


В отличие от окружности, для которой было достаточно построить одну
восьмую ее часть, а затем воспользоваться свойствами симметрии, эллипс
имеет только две оси симметрии, поэтому придется строить одну четверть
всей фигуры. За основу возьмем дугу, лежащую между точками и
в
первом квадранте координатной плоскости.
В каждой точке эллипса существует вектор нормали, задаваемый
градиентом функции
. Дугу разобьем на две части: первая - с углом
между нормалью и горизонтальной осью больше 45
(тангенс больше 1) и
вторая - с углом, меньшим 45
(рис. 8.9). Движение вдоль дуги будем
осуществлять в направлении по часовой стрелке, начиная с точки
.
Вдоль всей дуги координата является монотонно убывающей функцией от
, но в первой части она убывает медленнее, чем растет аргумент, а во
второй - быстрее. Поэтому при построении растрового образа в первой
части будем увеличивать
на единицу и искать соответствующее значение
, а во второй - сначала уменьшать значение
на единицу и определять
соответствующее значение
.
Направление нормали соответствует вектору





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


Все оставшиеся дуги эллипса строятся параллельно: после получения
очередной точки , можно инициализировать еще три точки с координатами
. Блок-схему не приводим ввиду прозрачности алгоритма.