Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по компьютерной графике [по вопросам].doc
Скачиваний:
84
Добавлен:
02.05.2014
Размер:
783.36 Кб
Скачать

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

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

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

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

1. Поместим затравочную точку на стек.

2. Извлекаем координаты точки с вершины стека в переменные (x, y).

3. Заполняем максимально возможный интервал, в котором находится точка, вправо и влево вплоть до достижения граничных точек.

4. Запоминаем крайнюю левую xl и крайнюю правую xr абсциссы заполненного интервала.

5. В соседних строках над и под интервалом (xl , xr ) находим незаполненные к настоящему моменту внутренние точки области, которые объединены в интервалы, а правый конец каждого такого интервала помещаем в стек.

6. Если стек не пуст, то переходим к пункту 3.

Этот алгоритм эффективно работает даже для областей с дырками.

Задача отсечения Вопрос 23

Если изображение выходит за пределы экрана, то на части дисплеев увеличивается время построения за счет того, что изображение строится в "уме". В некоторых дисплеях это приводит к искажению изображения. Поэтому требуется выполнения отсечения сцены по границам окна видимости.

Двумерный алгоритм Коэна-Сазерленда (Кохена-Сазерленда)

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

Идея алгоритма состоит в следующем:

Окно отсечения и прилегающие к нему части плоскости вместе образуют 9 областей.Каждой из областей присвоен 4-х разрядный код.

Определение того лежит ли отрезок целиком внутри окна или целиком вне окна выполняется следующим образом:

  • е

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

  • если логическое & кодов обоих концов отрезка не равно нулю, то отрезок целиком вне окна, отсечение не нужно и он отбрасывается

  • если логическое & кодов обоих концов отрезка равно нулю, то отрезок может быть частично видимым или целиком невидимым для него нужно определить координаты пересечений со сторонами окна и для каждой полученной части определить тривиальную видимость или невидимость

Двумерный fc-алгоритм

Схема кодирования близка к используемой в алгоритме Коэна-Сазерленда Пространство разбивается на 9 неперекрывающихся областей, пронумерованных арабскими цифрами от 1 до 9.

Отрезок видим только в области 5, т.е. отрезок, координаты которого удовлетворяют условиям:

Xлев ≤ X ≤ Xправ     и    Yниз ≤ Y ≤ Yверх.

Каждая конечная точка отрезка V0V1 окажется с одной из этих областей. Комбинация кодов концов отрезка, называемая кодом линии, используется для определения возможных вариантов расположения отрезка и, следовательно, отсечения. Код линии формируется из кодов концов отрезка следующим образом: LineCode (V0,V1)    =   (Code(V0) ×16) + Code (V1),

здесь Code(V1) обозначает код конечной точки V1, Code(V0) × 16 означает сдвиг кода начальной точки V0 влево на 4 разряда.

Так как каждый код может принимать одно из 9 значений, то всего имеется 81 возможный вариант расположения отрезка. Но, если Code(V0) равен Code(V1), то LineCode(V0,V1) равен LineCode(V1,V0). Имеется всего 9 таких случаев: 1-1, 2-2, 9-9. Следовательно, число различных случаев уменьшается до 72.

Каждый LineCode требует своего набора вычислений для определения отсечения отрезка за минимальное время. Всего имеется 8 основных случаев отсечения, а остальные симметричны к ним. Главное отличие FC-алгоритма от алгоритма Коэна-Сазерленда состоит в упорядочивании действий по отсечению.