Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KGMicro.DOC
Скачиваний:
66
Добавлен:
27.05.2013
Размер:
907.78 Кб
Скачать

15.3. Исключение сравнений по глубине. Оболочки

В некоторых алгоритмах, чтобы избежать ненужных сравнений между объектами, используются экранные оболочки, введенные в гл. 4 для исключения лишних отсечений. На рис. 15.3 показаны два трехмерных многоугольника, их проекции, а также прямоуголь­ные оболочки, окружающие проекции. Оболочки в этом случае не пересекаются и, следовательно, не надо проверять, не перекрыва­ются ли ребра одного многоугольника с ребрами другого.

чтобы выяснить, например, перекрываются ли два многоугольника в направлении z. На рис. 15.5 показано, как в таком случае исполь­зуются оболочки; здесь оболочкой является бесконечная область, ^ограниченная минимальным и максимальным значениями г для каждого многоугольника. Перекрытие по оси z отсутствует, если

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

Предположим, что многоугольники были подвергнуты преобра­зованию, описываемому матрицей М (разд. 15.2). Тогда проециро­вание на плоскость ху выполняется тривиально путем установки z=0 для каждой вершины. Если бы это преобразование не приме­нялось, для построения проекции потребовалось бы деление на г.

Если прямоугольные оболочки перекрываются, имеет место один из двух случаев (показанных на рис. 15.4): либо проекции много­угольников также перекрываются (случай а), либо этого не происхо­дит (случай б). В обоих случаях для более подробного анализа тре­буются дополнительные сравнения. В случае б с их помощью будет установлено, что на самом деле два многоугольника не перекры­ваются: пересечение оболочек в некотором смысле оказалось «лож­ной тревогой».

Можно воспользоваться оболочками, как в гл. 9, для окружения самих многоугольников, а не их проекций — в этом случае оболоч­ки становятся пространственными. С другой стороны, их можно применить для указания границ в пределах одного измерения,

15.4. Алгоритм сортировки по глубине

В этом алгоритме, разработанном Ньюэлом, Ньюэлом и Санча [341], применяется простой подход, состоящий из трех шагов:

1. Упорядочение всех многоугольников в соответствии с их наибольшими z-координатами.

2. Разрешение всех неопределенностей, которые возникают при перекрытии z-оболочек.

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

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

Этот алгоритм может легко работать с явным приоритетом, рас­смотренным в разд. 11.9. Приоритет играет роль максимального значения z, причем неопределенностей, связанных с глубиной, в этом случае может не быть, поскольку считается, что каждому приоритету соответствует своя плоскость с постоянной координа­той z. На рис. 15.6 показаны некоторые типы неопределенностей, необходимость в разрешении которых может возникнуть на шаге 2. Как же устраняются эти неопределенности? Обозначим многоуголь­ник, находящийся в конце упорядоченного списка многоугольни­ков, через Р. До отображения в буфер регенерации этот многоуголь

ник необходимо сравнить с каждой гранью Q, г-оболочка которой перекрывает z-оболочку многоугольника Р. Проверка складывается не более чем из пяти шагов (тестов), которые выполняются в поряд­ке возрастания сложности. Как только на любом из шагов выдается утвердительный ответ, Р сразу преобразуется в растровую форму. Этими пятью тестами являются следующие:

1. х-оболочки многоугольников не перекрываются, поэтому сами многоугольники тоже не перекрываются;

2. у-оболочки многоугольников не перекрываются, поэтому сами многоугольники тоже не перекрываются. (Отметим, что в те­стах 1 и 2, взятых в совокупности, оболочки рассматриваются в том виде, как были впервые введены в предыдущем разделе.)

3. Р целиком лежит с той стороны от плоскости Q, которая дальше от точки зрения (этот тест дает отрицательный ответ в случае а на рис. 15.6 и утвердительный ответ в ситуации, показанной на рис. 15.7).

4. Q целиком находится с той стороны от плоскости Р, которая ближе к точке зрения (этот тест дает отрицательный ответ в случае а на рис. 15.6 и утвердительный ответ в ситуации, показанной на рис. 15.8).

5. Проекции многоугольников на плоскость ху (экран) не пе­рекрываются (это определяется путем сравнения ребер одного мно­гоугольника с ребрами другого). В упражнении 15.7 предложен способ реализации тестов 3 и 4.

Если во всех пяти тестах получен отрицательный ответ, мы предполагаем, что Р действительно закрывает Q, поэтому поменяем Р и Q местами в списке, пометив при этом, что многоугольник Q был перемещен на новое место в конце списка. В случае а на рис. 15.6 так оно и есть: если мы сравним Q с Р, то обнаружим с помощью теста 3 (где Р и Q поменялись местами), что многоугольник Q дол­жен преобразовываться в растровую форму первым. В случаях же б и в на рис. 15.6 (поскольку не существует плоскости, разделяющей многоугольники) многоугольник Q рано или поздно придется снова перемещать в списке, и алгоритм зациклится.

Чтобы избежать зацикливания, введем ограничение, в соот­ветствии с которым многоугольник, перенесенный в конец списка (и, следовательно, помеченный), не может подвергаться повторному перемещению. Вместо этого многоугольник Р или Q рассекается на ! две части плоскостью другого многоугольника (разд. 11.6). Первоначальный многоугольник отбрасывается, а две его части включаются в соответствующие места упорядоченного списка, и алгоритм ; продолжает работать, как прежде.

С помощью такого алгоритма многоугольники, находящиеся с задней стороны объекта, изображаются первыми, но затем они могут быть закрыты. Это может помочь наблюдателю понять пространствен­ную структуру объекта, однако отсюда следует, что некоторые многоугольники будут без необходимости преобразовываться в растровую форму. Алгоритм плохо приспособлен для использования на растровых фильмирующих устройствах, поскольку фильм, проэкспонированный под действием некоторого многоугольника, нельзя «разэкспонировать», если позднее на этот многоугольник наложится другой.

С помощью алгоритма сортировки по глубине можно стирать также и невидимые ребра. Вначале в буфер регенерации заносятся некоторые значения V0. При разложении многоугольника в растр его ребрам присваивается некоторое другое значение Vi, а все внутренние пэлы устанавливаются в V0. Если многоугольник пере­крывает другой многоугольник, который ранее уже был преобразо­ван в растровую форму, при установке внутренности нового много­угольника в уо будут стерты ребра предыдущего многоугольника. Подобный подход можно использовать и в других алгоритмах, рассмотренных в этой главе.

Упомянутые выше алгоритмы изображения однозначных функ­ций двух переменных действуют так же, как и алгоритм сортировки по глубине, лишь обработка в этих случаях производится, начиная с переднего плана (минимальные значения г) по направлению к заднему. Сортировка, как таковая, отсутствует, поскольку функция однозначная. При изображении каждой новой грани поверхности, представляющей функцию, рисуется только та часть этой грани, которая попадает за пределы внешней границы фигуры, образован-ной ранее рассмотренными гранями. Внешняя граница затем соот­ветствующим образом расширяется. В новом алгоритме Сечреста и Гринберга обработка производится снизу вверх, а не спереди назад 1416].