Московский государственный университет имени М.В.Ломоносова
Опубликован: 23.04.2007 | Доступ: свободный | Студентов: 3308 / 461 | Оценка: 4.18 / 3.71 | Длительность: 17:54:00
ISBN: 978-5-9556-0098-7
Специальности: Программист
Лекция 3:

Алгоритмы растеризации отрезков, окружностей и эллипсов

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

3.4. Изображение окружностей

Для начала перейдем к канонической системе координат, в которой центр окружности совпадает с началом координат. Тогда можно заметить, что в силу симметрии окружности относительно прямых, разделяющих октанты, достаточно построить растровое представление в одном октанте, а затем с помощью симметрий получить изображения в других октантах (см. рис. 3.7). Будем пользоваться заданием окружности в виде неявной функции: x2 + y2 - R2 = 0.

Симметрии при изображении окружности.

Рис. 3.7. Симметрии при изображении окружности.

Пусть f(x, y) = x2 + y2 - R2. Будем рисовать часть окружности в 4 -м октанте, начиная с точки (-R, 0) (см. рис. 3.7, показано стрелкой).

Пусть R \in \mathbb{N}, тогда f(x, y) \in \mathbb{Z} \text{ для } x \in \mathbb{Z}, y \in \mathbb{Z}. Пусть функция plot8(x, y) отображает на растре все 8 точек, полученных из (x, y) с помощью симметрий.

Алгоритм Брезенхема

Будем рассуждать подобно алгоритму Брезенхема для отрезков (с соответствующими поправками на 4 -й октант) [17]. Из двух возможных пикселов в 4 -м октанте (соответствующих вертикальному и диагональному смещениям, которые обозначаются аналогично прежним s и d, см. рис. 3.10) будем выбирать тот, расстояние от окружности до которого меньше.

Расстояния до окружности.

Рис. 3.8. Расстояния до окружности.

Для того чтобы выбрать один из двух возможных пикселей, будем сравнивать расстояния от них до окружности: где расстояние меньше - тот пиксел и будет искомым. В примере на рис. 3.8 сравниваются расстояния от точек S(xs, ys) и D(xd, yd) до окружности с радиусом R. Из евклидовой метрики получаем:

\Delta R_s = \sqrt{x_s^2 + y_s^2} - R;  \\ 
\Delta R_d = R -\sqrt{x_d^2 + y_d^2}.

Но вычисление квадратного корня - вычислительно трудоемкая операция, поэтому при достаточно больших R мы будем заменять сравнение расстояний сравнением приближенных значений их квадратов (см. рис. 3.9):

(\Delta R_s)^2-(\Delta R_d)^2 = x_s^2 + y_s^2 - 2R\sqrt{x_s^2 + y_s^2}+R^2 - x_d^2 - y_d^2 + \\+ 2R\sqrt{x_d^2 + y_d^2} - R^2.
Приближенное сравнение расстояний.

Рис. 3.9. Приближенное сравнение расстояний.

Уменьшим два слагаемых на приблизительно одинаковые величины:

- 2R\sqrt{x_s^2 + y_s^2} заменим на -2R \cdot R,

+ 2R\sqrt{x_d^2 + y_d^2} заменим на +2\sqrt{x_d^2 + y_d^2} \cdot \sqrt{x_d^2 + y_d^2}

получим

(\Delta R_s)^2-(\Delta R_d)^2 \approx x_s^2 + y_s^2 - 2R \cdot R + R^2 -  \\
- x_d^2 - y_d^2 + 2\sqrt{x_d^2 + y_d^2} \cdot \sqrt{x_d^2 + y_d^2} - R^2 = \\
= x_s^2 + y_s^2 + x_d^2 + y_d^2 - 2R^2.

Таким образом, приближенно

  1. D ближе к окружности, чем S \Leftrightarrow
    x_s^2 + y_s^2 + x_d^2 + y_d^2 - 2R^2 > 0;
  2. S ближе к окружности, чем D \Leftrightarrow
    x_s^2 + y_s^2 + x_d^2 + y_d^2 - 2R^2 < 0.
Алгоритм Брезенхема для окружности.

Рис. 3.10. Алгоритм Брезенхема для окружности.

Пусть (x, y) - текущий пиксель. Обозначим

F_s = f(x, y + 1) = x^2 + {(y + 1)}^2 - R^2 > 0, \\
F_d = f(x + 1, y + 1) = {(x + 1)}^2 + {(y + 1)}^2 - R^2 < 0, \\
F = F_s + F_d;

\Delta F(s) = ( \Delta F \text{ при переходе }s\colon (x, y) \to (x, y + 1) ) = \\
= f(x, y + 2) + f(x + 1, y + 2) - f(x, y + 1)- \\
- f(x + 1, y + 1)\\
= 4y + 6,

\Delta F(d) = ( \Delta F \text{ при переходе } d\colon (x, y) \to (x + 1, y + 1) ) = \\
= f(x + 1, y + 2) + f(x + 2, y + 2) - f(x, y + 1)- \\
- f(x + 1, y + 1) \\
= 4x + 4y + 10.

Тогда из двух возможных смещений d и s выберем.

  1. F = F_s + F_d < 0 \Leftrightarrow F_s < -F_d, т.е. (x + 1, y + 1) ближе к окружности, чем (x, y + 1):

    d: Переходим в (x + 1, y + 1) и придаем соответствующие приращения F, \Delta F(s), \Delta F(d):

    F = F +\Delta F(d);  \Delta F(s) = \Delta F(s)+4;  \Delta F(d) = \Delta F(d)+8.
  2. F = F_s+F_d < 0 \Leftrightarrow F_s < -F_d, т.е. (x, y+1) ближе к окружности, чем (x + 1, y + 1):

    s: Переходим в (x, y + 1) и придаем соответствующие приращения F, \Delta F(s), \Delta F(d):

    F = F +\Delta F(s);  \Delta F(s) = \Delta F(s)+4;  \Delta F(d) = \Delta F(d)+4.

Если мы начинаем из (-R, 0), то начальные значения будут следующими:

F = F_s + F_d = ({(-R)}^2 + 1^2 - R^2) + ({(-R + 1)}^2 + 1^2 - R^2) \\
= 1 + (-2R + 1 + 1) = 3 - 2R, \\
\Delta F(s) = 4 \cdot 0 + 6 = 6, \\
\Delta F(d) = 4 \cdot (-R) + 4 \cdot 0 + 10 = 10 - 4R.

Легко видеть, что в алгоритме все величины, связанные с F, кроме F начального, будут кратны 2. Но, если мы поделим все эти величины на 2 (в дальнейшем значения всех величин уже понимаются в этом смысле), то F_{нач} = \frac{1}{2}+1-R. Так как приращения F могут быть только целочисленными, то F = \frac{1}{2} +T, где T \in \mathbb{Z} ; т.е. если отнять \frac{1}{2} от всех значений, то знак F не изменится для всех T, кроме T = 0. Для того чтобы результат сравнения остался прежним, будем считать, что F = 0 теперь соответствует смещению s.

x = -r; y = 0;

F = 1-r;
delta_Fs = 3;
delta_Fd = 5-2*r;

while( x + y < 0 )
{
      plot8( x, y );

      if( F > 0 )
      {
            // d: Диагональное смещение
            F += delta_Fd;
            x++; y++;
            delta_Fs += 2;
            delta_Fd += 4;
      }
      else
      {
            // s: Вертикальное смещение
            F += delta_Fs;
            y++;
            delta_Fs += 2;
            delta_Fd += 2;
      }
}
Листинг 3.5. Алгоритм Брезенхема для окружности

Размерность вычислений этого алгоритма (т.е. отношение максимальных модулей значений величин, с которыми он оперирует к модулям исходных данных (в данном случае R )) равна 2.

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >