Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс Компьютерная Графика / Литература / Учебное пособие по КГГ для ИДО4.doc
Скачиваний:
199
Добавлен:
15.04.2015
Размер:
3.49 Mб
Скачать
      1. Растровая развёртка окружности

Существует несколько очень простых, но не эффективных способов преобразования окружностей в растровую форму. Например, рассмотрим для простоты окружность с центром в начале координат. Ее уравнение записывается как x2 + y2=R2. Решая это уравнение относительноy,получим

y= ± .

Чтобы изобразить четвертую часть окружности, будем изменять x с единичным шагом от 0 доRи на каждом шаге вычислятьy. Вторым простым методом растровой развертки окружности является использование вычисленийxиyпо формуламx=Rcos α,y=Rsinα при пошаговом изменении угла α от 0до 90.

Для упрощения алгоритма растровой развёртки стандартной окружности можно воспользоваться её симметрией относительно координатных осей и прямых y= ±x; в случае, когда центр окружности не совпадает с началом координат, эти прямые необходимо сдвинуть параллельно так, чтобы они прошли через центр окружности. Тем самым достаточно построить растровое представление для 1/8 части окружности, а все оставшиеся точки получить симметрией (см. рис. 2 .15).

Рис. 2.15. Восьмисторонняя симметрия

Рассмотрим участок окружности из второго октанта xЄ [0, R/]. Далее опишем алгоритм Брезенхейма для этого участка окружности.

На каждом шаге алгоритм выбирает точку Pi(xi, yi), которая является ближайшей к истинной окружности. Идея алгоритма заключается в выборе ближайшей точки при помощи управляющих переменных, значения которых можно вычислить в пошаговом режиме с использованием небольшого числа сложений, вычитаний и сдвигов.

Рассмотрим небольшой участок сетки пикселов, а также возможные способы (от A до E) прохождения истинной окружности через сетку (рис. 2 .16).

Предположим, что точка Pi-1 была выбрана как ближайшая к окружности приx=xi-1. Теперь найдем, какая из точек (SiилиTi) расположена ближе к окружности приx=xi-1+ 1.

Рис. 2.16. Варианты прохождения окружности через растровую сетку

Заметим, что ошибка при выборе точки Pi (xi, yi) была равна

D(Pi) = (xi2+ yi2) –R2.

Запишем выражение для ошибок, получаемых при выборе точки SiилиTi:

D(Si) = [(xi-1+ 1)2 + (yi-1)2] – R2;

D(Ti) = [(xi-1+ 1)2 + (yi-1 – 1)2] – R2.

Если | D(Si) | ≥ |D(Ti) |, тоTiближе к реальной окружности, иначе выбираетсяSi.

Введем di= |D(Si) | – |D(Ti) |.

Tiбудет выбираться приdi≥ 0, в противном случае будет устанавливатьсяSi.

Опуская алгебраические преобразования, запишем diиdi+1для разных вариантов выбора точкиSiилиTi.

D1= 3 – 2R.

Если выбирается Si(когдаdi< 0), тоdi+1=di+ 4xi-1+ 6.

Если выбирается Ti(когдаdi≥ 0), тоdi+1=di+ 4 (xi-1yi-1) + 10.

Существует модификация алгоритма Брезенхейма для эллипса.

      1. Закраска области, заданной цветом границы

Рассмотрим область, ограниченную набором пикселей заданного цвета и точку (x, y), лежащую внутри этой области.

Задача заполнения области заданным цветом в случае, когда эта область не является выпуклой, может оказаться довольно сложной.

Простейший рекурсивный алгоритм:

void PixelFill(int x, int y, int border_color, int color)

{

int c = getpixel(x, y);

if ((c != border_color) && (c != color))

{

putpixel(x, y, color);

PixelFill(x – 1, y, border_color, color);

PixelFill(x + 1, y, border_color, color);

PixelFill(x, y – 1, border_color, color);

PixelFill(x, y + 1, border_color, color);

}

}

Этот алгоритм является слишком неэффективным, так как для всякого уже отрисованного пикселя функция вызывается ещё 4 раза и, кроме того, этот алгоритм требует слишком большого объёма стека из-за большой глубины рекурсии. Поэтому для решения задачи закраски области предпочтительнее алгоритмы, способные обрабатывать сразу целые группы пикселей, т. е. использовать их «связность». Если данный пиксель принадлежит области, то, скорее всего, его ближайшие соседи также принадлежат данной области.

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

Сначала заполняется горизонтальная полоса пикселов, содержащих начальную точку. Затем, чтобы найти самый правый пиксель каждой строки, справа налево проверяется строка, предыдущая по отношению к только что заполненной полосе. Адреса найденных пикселов заносятся в стек. То же самое выполняется и для строки, следующей и за последней заполненной полосой. Когда строка обработана таким способом, в качестве новой начальной точки используется пиксель, адрес которого берется из стека. Для него повторяется вся описанная процедура. Алгоритм заканчивает свою работу, если стек пуст.

Соседние файлы в папке Литература