Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
rgr.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
592.9 Кб
Скачать

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 и, таким образом, перейти к следующей сканирующей строке.

В этом алгоритме для эффективности преобразования многоугольника в растровую форму используется когерентность ребер и сканирующих строк, а также сортировка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]