
- •2. Построение каркасного изображения
- •2.1. Изображение шара
- •3.2. Перспективная проекция
- •5. Модели закрашивания
- •5.1. Геометрические составляющие для нахождения отраженного света
- •5.2. Вычисления диффузионной составляющей
- •5.3. Зеркальное отражение
- •5.4. Повышение эффективности с помощью «промежуточного вектора».
- •5.5. Фоновые источники и фоновые отражения
- •5.6. Комбинирование компонентов освещения
- •5.7. Добавление цвета
- •6. Растровая развертка многоугольников
- •6.1.Использование списка вершин и когерентности сканирующих строк
- •6.2.Пересечения вершин (особый случай)
- •7. Алгоритм удаления невидимых поверхностей (алгоритм z-буфера)
- •Литература
6.2.Пересечения вершин (особый случай)
При сортировки и закраски пикселей могут возникнуть трудности. Если число точек в отсортированном списке нечетно, процедура раскраски работает неправильно. Это возможно, когда сканирующая строка пересекает вершину, в результате чего в список пересечения заносятся две точки пересечения. Рассмотри, например, строку с y=3 (рис.6.1). Она пересекается с ребрами многоугольника в точках 2, 2 и 10. Тогда последовательность пикселей от 2 до 2 (т.е. пиксель в точке x=2,y=3) закрасилась бы, совокупность пикселей от 3 до 9 осталась бы незакрашенной, а последовательность от 10 до правой границы буфера закрасится. На самом же деле следовало бы закрасить лишь группу пикселей от 2 до 10.
Очевидно, прохождение сканирующей строки через вершину следует считать за одно пересечение. Однако это не приводит к правильным результатам в случаях, когда с вершинами пересекаются строки 1, 7, 9 или 11. Разумным является решение, в соответствии с которым пересечения с вершинами, представляющими собой локальные минимумы и максимума, считаются как два пересечения, а пересечения со всеми другими вершинами учитываются как одно пересечение. В вершине достигается локальный минимум, когда y-координаты предыдущей и последующей вершин больше, чем у рассматриваемой вершины. Аналогично определяется локальный максимум. Вершины, расположенные на сканирующих строках 1 и 7, представляют собой локальные минимумы, а вершины на строках 9 и 11 – локальные максимумы. Все они учитываются как два пересечения с соответствующими сканирующими строками, а вершины, через которые проходят строки 3 и 5, считаются за одно пересечение. Убедиться, что такие промежуточные вершины пересекаются только один раз, довольно легко: одно из смежных ребер укорачивается до того, как вычисляются пересечения. Такое укорачивание проводится только в том случае, если вершина лежит на сканирующей строке, что случается всегда, когда координаты вершин – целые числа, и редко, если координаты вершин представлены с более высоким разрешением, чем сама растровая сетка.
Первый шаг процедуры, т.е. вычисление пересечений, может оказаться медленным. Каждое ребро многоугольника требуется сравнивать с каждой сканирующей строкой. Во многих случаях лишь небольшое число ребер будет представлять интерес. Более того, необходимо отметить, что многие из ребер, пересекаемых строкой i, будут пересекаться также строкой i +1. Такая когерентность ребер (аналогичная когерентности сканирующих строк, рассмотренной выше) проявляется всякий раз, сканирующие строки пересекают ребро. При переходе от одной строки к другой можно вычислить новую x-координату точки пересечения ребра, используя x-координату старой точки пересечения (аналогично случаю развертки отрезков):
(6.1)
где m – тангенс
угла наклона ребра. Параметр m равен
,
так что 1/ m=
Можно воспользоваться когерентностью ребер и устранить лишние сравнения сканирующих строк и ребер путем построчного разложения многоугольника в растр снизу вверх (или сверху вниз), используя алгоритм построчного сканирования. Для каждой сканирующей строки рассматриваются только те ребра, которые пересекают строку. Они задаются таблицей активных ребер ( TAP). При переходе к следующей строке новые значения x-координат точек пересечения вычисляются с помощью уравнения (6.1), все новые ребра, пересекаемые следующей сканируемой строкой, добавляются в TAP, но не пересекаются со следующей строкой, удаляются. Ребра, содержащиеся в TAP, упорядочиваются по значениям x-координат точек пересечения, поэтому можно легко находить значения пикселей, которые следует закрасить.
Для эффективной
реализации включения ребер в TAP введем
таблицу ребер (ТР), которая содержит все
ребра, упорядоченные по значениям их
меньших y-координат. ТР обычно строят с
помощью групповой сортировки, выделяя
столько же групп, сколько имеется
сканирующих строк. Внутри каждой группы
ребра располагаются в порядке возрастания
x-координат наиболее низких точек. Этот
порядок устанавливается с помощью
сортировки вставками. Каждый элемент
ТР содержит большую y-координату ребра
(
),
x-координату нижней точки (
)
и приращение x, используемое для перехода
от одной сканирующей строки к следующей
(1/ m).
На рис. 6.2 показано, как были отсортированы шесть ребер, изображенные на рис. 6.1, в предположении, что соответствующие ребра были предварительно укорочены на одну строку каждое, чтобы избежать двойных пересечений. На рис.6.3 приведена ТАР в случае сканирующих строк 9 и 10 для многоугольника, показанного на рис. 6.1.
После того как ТР сформирована, алгоритм построчного сканирования алгоритм построчного сканирования складывается из следующих шагов:
1.Установить y равным минимальному значению координаты y среди элементов ТР, т.е. совпадающей с y-координатой первой непустой группы.
2.Инициализировать ТАР, сделать ее пустой.
Повторять шаг 3 до тех пор, пока ТАР и ТР не станут пустыми:
3.1.Слить информацию из группы y в ТР с информацией в ТАР, сохраняя упорядочение по x-координате.
3.2. Занести желаемые значения в пиксели на сканирующей строке, определяемой текущим значением y, используя пары x-координат из ТАР.
3.3. Удалить из ТАР
те элементы, в которых
.
3.4. Для всех элементов, содержащихся в ТАР, заменить x на x+1/ m.. Тем самым пересечение со следующей сканирующей строкой заносится в каждый элемент ТАР.
3.5. Поскольку на предыдущем шаге могла нарушиться упорядоченность ТАР по x, провести пересортировку ТАР.
3.6. Увеличить y на 1 и, таким образом, перейти к следующей сканирующей строке.
В этом алгоритме для эффективности преобразования многоугольника в растровую форму используется когерентность ребер и сканирующих строк, а также сортировка.