Алгоритм Брезенхема для генерации окружностей
В растр нужно разлагать не только линейные, но и другие, более сложные функции. Разложению конических сечений, т. е. окружностей, эллипсов, парабол, гипербол посвящено значительное число работ.Наибольшее внимание, разумеется, уделено окружности.
Для вывода алгоритма рассмотрим первую четверть окружности с центром в начале координат. Заметим, что если работа алгоритма начинается в точке x = 0, у = R, то при генерации окружности по часовой стрелке в первом квадранте у является монотонно убывающей функцией аргумента x (рис. 2.4). Аналогично, если исходной точкой является y = 0, x = R, то при генерации окружности против часовой стрелки x будет монотонно убывающей функцией аргумента у. В нашем случае выбирается генерация по часовой стрелке с началом в точке x = 0, у = R. Предполагается, что центр окружности и начальная точка находятся точно в точках растра. Для любой заданной точки на окружности при генерации по часовой стрелке существует только три возможности выбрать следующий пиксел, наилучшим образом приближающий окружность: горизонтально вправо, по диагонали вниз и вправо, вертикально вниз. На рис.2.5 эти направления обозначены соответственно mH, mD, mV. Алгоритм выбирает пиксел, для которого минимален квадрат расстояния между одним из этих пикселов и окружностью, т. е. минимум из mH = | (xi + 1)2 + (yi)2 – R2 | mH = | (xi + 1)2 + (yi - 1)2 – R2 | mH = | (xi)2 + (yi - 1)2 – R2 |
Разность между квадратами расстояний от центра окружности до диагонального пиксела (xi + 1, yi- 1) и от центра до точки на окружности R2 равна Как и в алгоритме Брезенхема для отрезка, для выбора соответствующего пикселя желательно использовать только знак ошибки, а не её величину. При 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 горизонтальный (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. Аналогично разбору предыдущего случая критерий выбора можно получить, рассматривая сначала случай З и проверяя разность между квадратами расстояний от
При 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\ в виде Дополнение до полного квадрата члена (xi)2 с помощью добавления и вычитания 2xi + 1 дает Использование определения Di приводит выражение к виду Теперь, рассматривая случай 4, снова заметим, что следует выбрать вертикальный пиксел (xi, уi – 1), так как y является монотонно убывающей функцией при возрастании x. проверка компонент d\ для случая 4 показывает, что поскольку оба пиксела находятся вне окружности. Следовательно, d\ > 0 и при использовании критерия, разработанного для случая 3, происходит верный выбор mV. Осталось проверить только случай 5 на рис.2.7, который встречается, когда диагональный пиксел (xi + 1, уi – 1) лежит на окружности, т. е. Di = 0. Проверка компонент d показывает, что Следовательно, d > 0 и выбирается диагональный пиксел (xi + 1, уi – 1). Аналогичным образом оцениваем компоненты d\: и d < 0, что является условием выбора правильного диагонального шага к (хi + 1, уi – 1). Таким образом, случай Di = 0 подчиняется тому же критерию, что и случай Di < 0 или Di > 0. Подведем итог полученных результатов: Di < 0 d £ 0 выбираем пиксел (хi + 1, уi) ® mH d > 0 выбираем пиксел (хi + 1, уi – 1) ® mD Di > 0 d\ £ 0 выбираем пиксел (хi + 1, уi – 1) ® mD d\ > 0 выбираем пиксел (хi, уi – 1) ® mV Di = 0 выбираем пиксел (хi + 1, уi – 1) ® mD Легко разработать простые рекуррентные соотношения дня реализации пошагового алгоритма. Сначала рассмотрим горизонтальный шаг mH к пикселу (хi + 1, уi). Обозначим это новое положение пиксела как (i + 1). Тогда координаты нового пиксела и значение Di равны Аналогично координаты нового пиксела и значения Di для шага mD к пикселу (хi + 1, уi – 1) таковы: То же самое для шага mV к (хi, уi – 1)
|