Скачиваний:
67
Добавлен:
16.04.2013
Размер:
3.38 Mб
Скачать

Растровая развертка окружностей

Существует несколько очень простых, но неэффективных способов преобразования окружностей в растровую форму. Рассмотрим для простоты окружность с центром в начале координат, для которой

x2+y2=R2. Решая это уравнение относительно у, получим

Y = ± R2 –x2

Чтобы изобразить четвертую часть окружности, можно увеличивать х с единичным шагом от 0 до R и на каждом шаге вычислять (остальные четверти изображаются симметрично).

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

Неэффективным методом, при использовании которого также не удается избежать больших разрывов, является изображение R*cos или R*sin путем пошагового изменения от 0 до 900

Восьмисторонняя симметрия

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

Y = ± R2x2

или некоторый другой более эффективный механизм вычисления у по значениям х из диапазона 0 — R/2 (точка, в которой х = у) можно получить еще семь дополнительных точек на окружности. Этот диапазон х соответствует дуге окружности 45°, показанной на рисунке.

Алгоритм брезенхема для генерации окружности

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

Для вывода алгоритма рассмотрим первую четверть окружности с центром в начале координат. Заметим, что если работа алгоритма начинается в точке х = 0, у = R, то при генерации окружности по часовой стрелке в первом квадранте у является монотонно убывающей функцией аргумента Х (рис. 2.11).

Отразить первый октант относительно Y= Х

0 1

1 0

Отразить первый квадрант относительно х = 0

-1 0

0 1

Отразить верхнюю 1 0 полуокружность 0 -1 относительно У=0

Рис. 2.10. Генерация полной окружности из дуги в первом октанте.

Аналогично, если исходной точкой является у = 0, х = R , то при генерации окружности против часовой стрелки х будет монотонно убывающей функцией аргумента у. В нашем случае выбирается генерация по часовой стрелке с началом в точке х = 0, у = R . Предполагается, что центр окружности и начальная точка находятся точно в точках растра.

Рис. 2.11. Окружность в первом квадранте.

Для любой заданной точки на окружности при генерации по часовой стрелке существует только три возможности выбрать следующий пиксел, наилучшим образом приближающий окружность: горизонтально вправо, по диагонали вниз и вправо, вертикально вниз. На рис. 2.12 эти направления обозначены соответственно mH, mD, mV. Алгоритм выбирает пиксел, для которого минимален квадрат расстояния между одним из этих пикселов и окружностью, т. е. минимум из (здесь минимизируется не квадрат расстояния, а абсолютное значение разности квадратов расстояний от центра окружности до пиксела и до окружности)

mH = |(xi + 1)2 + (yi)2R2|

mD = |(xi + l)2 + (yil )2 - R2|

mV = |(xi)2 + (уi - 1)2 - R2|

Рис. 2.12. Выбор пикселов в первом квадранте.

Вычисления можно упростить, если заметить, что в окрестности точки (xi, yi) возможны только пять типов пересечений окружности и сетки растра, приведенных на рис. 2.13.

Разность между квадратами расстояний от центра окружности до диагонального пиксела (xi + 1, уi - 1) и от центра до точки на окружности R2 равна

Di = (xi + 1)2 + (yi – 1)2R2

Рис. 2.13. Пересечение окружности и сетки растра.

Как и в алгоритме Брезенхема для отрезка, для выбора соответствующего пиксела желательно использовать только знак ошибки, а не ее величину.

A) При Di < 0

- диагональная точка (хi + 1, уi — 1) находится внутри реальной окружности, т. е. это случаи 1 или 2 на рис. 2.13. Ясно, что в этой ситуации следует выбрать либо пиксел (xi + 1, yi), т.е. mH, либо пиксел (xi + l, yi - 1), т. е. mD.

Для этого сначала рассмотрим случай 1 и проверим разность квадратов расстояний от окружности до пикселов в горизонтальном и диагональном направлениях:

d = |{(xi + I)2 + (уi)2 - R2}| - |{(xi + 1)2 + (уi - 1)2 - R2}|

При d < 0 расстояние от окружности до диагонального пиксела (mD) больше, чем до горизонтального (mH).

Напротив, если d > О, расстояние до горизонтального пиксела (mH) больше. Таким образом,

при d ≤0 выбираем mH в (хi + 1, уi)

при d > О выбираем mD в (xi + l, yi - 1)

При d = 0, когда расстояние от окружности до обоих пикселов одинаковы, выбираем горизонтальный шаг.

Количество вычислений, необходимых для оценки величины d, можно сократить, если заметить, что в случае 1

(xi + 1)2 + (yi)2R2 0

(xi + 1)2 + (yi - 1)2 – R2 < 0

так как диагональный пиксел (xi + 1, уi - 1) всегда лежит внутри окружности, а горизонтальный (xi + 1, уi) — вне ее.

Таким образом, можно вычислить по формуле

= (хi + 1)2 + (уi)2 - R2 (xi + 1)2 + (уi - 1)2 - R2

Дополнение до полного квадрата члена i)2 с помощью добавления и вычитания - 2уi + 1 дает

= 2[(xi + 1)2 + (уi - 1)2 -R2] + 2yi – 1

В квадратных скобках стоит по определению i, и его подстановка

= 2*(i + yi) - 1

существенно упрощает выражение.

Рассмотрим случай 2 на рис. 2.13 и заметим, что здесь должен быть выбран горизонтальный пиксел (хi + 1, уi,), так как y является монотонно убывающей функцией. Проверка компонент  показывает, что

(xi + 1)2 + (уi)2 - R2 < 0

(xi + 1)2 + (уi-1)2 - R2 < 0

поскольку в случае 2 горизонтальный (xi + 1, уi) и диагональный (хi + l, yi - 1) пикселы лежат внутри окружности.

Следовательно, < 0, и при использовании того же самого критерия, что и в случае 1, выбирается пиксел (хi + 1,уi).

Б) Если i > 0,

то диагональная точка (хi + 1, yi — 1) находится вне окружности, т. е. это случаи 3 и 4 на рис. 2.13. В данной ситуации ясно, что должен быть выбран либо пиксел (xi + 1, yi — 1), т. е. mD, либо (xi, yi - 1), т. е. mV.

Аналогично разбору предыдущего случая, критерий выбора можно получить, рассматривая сначала случай 3 и проверяя разность между квадратами расстояний от окружности до диагонального mD и вертикального mV пикселов,

' = |{(xi + 1)2 + (yi - 1)2 - R2}| - |{(xi)2 + (уi - 1)2 - R2}|

При ' < 0 расстояние от окружности до вертикального пиксела (xi, yi — 1) больше и следует выбрать диагональный шаг mD, к пикселу (xi + 1, уi - 1).

В случае ' > 0 расстояние от окружности до диагонального пиксела больше и следует выбрать вертикальное движение к пикселу (xi, уi - 1).

Таким образом,

при ' 0 выбираем mD в (xi + 1, уi — 1)

при ' > 0 выбираем mV в (xi, уi — 1)

В случае ' = 0, т. е. когда расстояния равны, выбран диагональный шаг.

Проверка компонент ' показывает, что

(xi +1)2 + (yi - 1)2R2 0

(xi)2 + (yi – 1)2R2 < 0

поскольку для случая 3 диагональный пиксел mD (xi + l, yi — 1) находится вне окружности, тогда как вертикальный пиксел mV (xi, yi — 1) лежит внутри ее. Это позволяет записать ' в виде

' = (хi + 1)2 + (уi - 1)2 - R2 (xi)2 + (уi - 1)2 - R2

Дополнение до полного квадрата члена (хi)2 с помощью добавления и вычитания i + 1 дает

' = 2[(xi + 1)2 + (уi - 1)2 - R2] – 2xi – 1

Использование определения i приводит выражение к виду

' = 2(i - xi) – 1

Рассматривая случай 4, снова заметим, что следует выбрать вертикальный пиксел (xi, yi - 1), так как у является монотонно убывающей функцией при возрастании х.

Проверка компонент ' для случая 4 показывает, что

(хi +1)2 + (yi - 1)2 -R2 > 0

(xi)2 + (yi – 1)2 – R2 > 0

поскольку оба пиксела находятся вне окружности.

Следовательно, ' > 0 и при использовании критерия, разработанного для случая 3, происходит верный выбор mV.

Случай 5, когда диагональный пиксел (xi + l, yi — 1) лежит на окружности, т. е. I = 0. Проверка компонент показывает, что

i + 1)2 + (yi)2R2 > 0

(xi + 1)2 + (yi – 1)2R2 = 0

Следовательно, > 0 и выбирается диагональный пиксел (xi + 1, уi — 1).

Аналогичным образом оцениваем компоненты ' :

(хi +1)2 + (уi - 1)2 - R2 = 0

(xi)2 + (уi - 1)2 - R2 < 0

и ' < 0, что является условием выбора диагонального шага к (хi + 1, уi -1)

Таким образом, случай I = 0 подчиняется тому же критерию, что и случай I < 0 или I > 0.

Подведем итог для полученных результатов:

I < 0

 ≤ 0 выбираем пиксел (xi + l, yi)  mH

  • > 0 выбираем пиксел (xi + l, yi - 1)  mD

I > 0

' 0 выбираем пиксел (xi + l, yi — 1) mD

' > 0 выбираем пиксел (xi, yi - 1)  mV

I = 0 выбираем пиксел (xi + 1, уi - 1)  mD

Легко разработать простые рекуррентные соотношения для реализации пошагового алгоритма.

Рассмотрим горизонтальный шаг mH к пикселу (xi+1, у). Обозначим это новое положение пиксела как (i + 1). Тогда координаты нового пиксела и значение i равны

xi+1 = xi + 1

yi+1 = yi

i+1 = (xi+1 + 1)2 + (уi+1 - 1)2 - R2 =

= (xi+1)2 + 2xi+1 + 1 + (yi - 1)2 - R2 =

= [(xi + 1)2 + (yi – 1)2 – R2] + 2xi+1 +1 =

= I + 2xi+1 +1

Аналогично координаты нового пиксела и значение I для шага mD к пикселу (xi + 1, yi - 1) таковы:

xi+1 = xi + 1

yi+1 = yi - 1

i+1 = I + 2xi+1 -2yi+1 +2

То же самое для шага mV к (xi, уi - 1)

xi+1 = xi

yi+1 = уi - 1

i+1 = i - 2yi+1 + 1