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

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

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Аннотация: Введение в растеризацию кривых. Изображение отрезка с целочисленными координатами концов. Цифровой дифференциальный анализатор. Алгоритм Брезенхема. Алгоритм Кастла-Питвея. Изображение отрезка с нецелочисленными координатами концов. Изображение окружностей. Алгоритм Брезенхема. Изображение эллипсов. Построение по неявной функции. Построение путем сжатия окружности

Этот раздел посвящен растеризации простейших геометрических объектов, таких как отрезки, окружности и эллипсы, на плоскости.

3.1. Введение в растеризацию кривых

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

Изображение кривых на растре.

Рис. 3.1. Изображение кривых на растре.

Пусть (x0, y0) - фиксированный пиксель, а (x, y) - некоторый другой пиксель на плоскости. Тогда для определения их близости вводятся следующие понятия:

1. 4-связность
|x-x0|+|y-y0|=1

2. 8-связность
max{|x-x0|, |y-y0|}=1

В дальнейших рассуждениях расстояние будем считать заданным стандартной евклидовой метрикой1 dist(P1,P2) = ((x1 - x2)2 + (y1 - y2)2)1/2 .

3.2. Изображение отрезка с целочисленными координатами концов

Пусть наш отрезок - это AB. Перейдем от системы координат Oxy к Ax'y' (см. рис. 3.2, этап 1). Отрезок может лежать в любом из 8 октантов, но всегда существуют симметрии относительно осей, разделяющих эти октанты, симметрии определяются матрицами

\left( \begin{array}{cc} 
\pm 1 & 0 \\ 
0 & \pm 1  
\end{array} \right)
и
\left( \begin{array}{cc} 
0 & \pm 1 \\ 
\pm 1 & 0  
\end{array} \right),
позволяющие свести задачу к случаю отрезка, лежащего в первом октанте (пример см. на рис. 3.2, этап 2, в нем матрица имеет вид
\left( \begin{array}{cc} 
0 & 1 \\ 
1 & 0  
\end{array} \right).
Назовем такой случай каноническим, в дальнейшем будут рассмотрены алгоритмы для этого случая. В каноническом случае процесс рисования 8 -связной линии можно закодировать последовательностью вида: sdssd... (см. рис. 3.3), где

  • s - горизонтальное смещение;
  • d - диагональное смещение.
Переход к каноническому случаю в два этапа.

Рис. 3.2. Переход к каноническому случаю в два этапа.

Эквивалентно этой последовательности можно сопоставить бинарный код, где 0 соответствует s, а 1 соответствует d. Такой код для рисования отрезка (0, 0) \to (p, q), p > q \in \mathbb{N} называется кодом Ротштейна [46] для \frac{p}{q}.

Пусть plot(x,y) - функция, закрашивающая точку растра с координатами (x,y).

Кодирование закрашивания отрезка (или код Ротштейна).

Рис. 3.3. Кодирование закрашивания отрезка (или код Ротштейна).

Цифровой дифференциальный анализатор

Алгоритм Цифровой дифференциальный анализатор (англ. DDA - Digital Differential Analyzer) строит 8-связную линию.

Для начала, пусть P1 = (1, 0) ; P2 = (1, 1). Для определения того, какой из пикселей, - P1 или P2, - следует закрасить, сравним расстояния до них. В силу подобия треугольников, образованных пересечением рисуемого отрезка, прямой x = 1 и перпендикулярами из P1 и P2 на отрезок (см. рис. 3.4), достаточно сравнить e (ординату пересечения отрезка c прямой x = 1 ) с \frac{1}{2}. Далее, для следующего шага алгоритм работает аналогично с учетом изменения e - ординаты пересечения отрезка со следующей вертикальной прямой x = k, k \in \mathbb{N}.

Цифровой дифференциальный анализатор.

Рис. 3.4. Цифровой дифференциальный анализатор.
// Координаты концов отрезка - (0,0) и (a,b)

e = b/a; // Текущая ордината
delta_e = b/a; // Приращение ординаты

// (x,y) - Координаты текущей точки
x = 0; y = 0;

while( x < a )
{
      plot(x, y);

      if( e > 1/2 )
      {
            // d : диагональное смещение
            x++; y++;

            // т.к. произошло смещение по y на 1 вверх
            e += delta_e - 1;
      }
      else
      {
            // s : горизонтальное смещение
            x++;
            e += delta_e;
      }
}
Листинг 3.1. Цифровой дифференциальный анализатор

Недостатком данного алгоритма является то, что он работает с числами с плавающей точкой.

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