Алгоритмы растеризации отрезков, окружностей и эллипсов
Этот раздел посвящен растеризации простейших геометрических объектов, таких как отрезки, окружности и эллипсы, на плоскости.
3.1. Введение в растеризацию кривых
Пусть у нас есть некоторая кривая, и мы хотим построить ее изображение на растровой решетке. Возникает вопрос: какие из ближайших пикселей следует закрашивать? В данной и следующей лекциях мы рассмотрим случай построения на монохромном растре, когда возможны только два уровня интенсивности закраски пикселя - "полностью закрашен" или "полностью не закрашен". Если же допустимы несколько уровней интенсивности, то можно растеризовывать более аккуратно, уменьшая эффекты алиасинга (т.е. ступенчатости), "Дискретизация. Антиалиасинг. Геометрические преобразования растровых изображений" .
Пусть (x0, y0) - фиксированный пиксель, а (x, y) - некоторый другой пиксель на плоскости. Тогда для определения их близости вводятся следующие понятия:
В дальнейших рассуждениях расстояние будем считать заданным стандартной евклидовой метрикой1 dist(P1,P2) = ((x1 - x2)2 + (y1 - y2)2)1/2 .
3.2. Изображение отрезка с целочисленными координатами концов
Пусть наш отрезок - это AB. Перейдем от системы координат Oxy к Ax'y' (см. рис. 3.2, этап 1). Отрезок может лежать в любом из 8 октантов, но всегда существуют симметрии относительно осей, разделяющих эти октанты, симметрии определяются матрицами
и позволяющие свести задачу к случаю отрезка, лежащего в первом октанте (пример см. на рис. 3.2, этап 2, в нем матрица имеет вид Назовем такой случай каноническим, в дальнейшем будут рассмотрены алгоритмы для этого случая. В каноническом случае процесс рисования 8 -связной линии можно закодировать последовательностью вида: sdssd... (см. рис. 3.3), где- s - горизонтальное смещение;
- d - диагональное смещение.
Эквивалентно этой последовательности можно сопоставить бинарный код, где 0 соответствует s, а 1 соответствует d. Такой код для рисования отрезка называется кодом Ротштейна [46] для .
Пусть plot(x,y) - функция, закрашивающая точку растра с координатами (x,y).
Цифровой дифференциальный анализатор
Алгоритм Цифровой дифференциальный анализатор (англ. DDA - Digital Differential Analyzer) строит 8-связную линию.
Для начала, пусть P1 = (1, 0) ; P2 = (1, 1). Для определения того, какой из пикселей, - P1 или P2, - следует закрасить, сравним расстояния до них. В силу подобия треугольников, образованных пересечением рисуемого отрезка, прямой x = 1 и перпендикулярами из P1 и P2 на отрезок (см. рис. 3.4), достаточно сравнить e (ординату пересечения отрезка c прямой x = 1 ) с . Далее, для следующего шага алгоритм работает аналогично с учетом изменения e - ординаты пересечения отрезка со следующей вертикальной прямой .
// Координаты концов отрезка - (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. Цифровой дифференциальный анализатор
Недостатком данного алгоритма является то, что он работает с числами с плавающей точкой.