В результате такого усовершенствования подпрограмма isSimpleRegionO работает следующим образом: при инициализации ей присваивается значение false, а массив faces устанавливается в NULL. Каждая грань в faces тестируется на втянутость в область. (Поскольку тестирование этого списка осуществляется четырьмя экземплярами функции drawRegion, то он должен сохраняться до окончания всех четырех просмотров.) Втянутость определяется с помощью функции int 1sInvolved(Rect region. Face * f), которая возвращает true, если грань f втянута в область region, и fal se в противном случае. Копия указателя на каждую втянутую грань проталкивается в стек outFaces, и число таких проталкиваний хранится в специальном счетчике. Когда массив faces пройден, просматривается значение этого счетчика: если оно равно 0 или 1, то подпрограмма возвращает true. Отметим, что данная версия подпрограммы isSimpleRegion( ) должна тестировать каждую грань из входного списка, независимо от ее втянутости: подпрограмма не прерывает работу после обнаружения двух втянутых граней.

Тематическое задание 13.7. HLR с помощью алгоритма стека ребер

Уровень сложности II.

Напишите приложение, выполняющее рисование на трехмерной сцене прямых линий с использованием алгоритма drawVisibleEdges, описанного в разделе «О методах удаления невидимых линий», где ребра рисуются только тогда, когда их видимость полностью установлена. Проверьте полученную программу на интересных сценах, состоящих из нескольких объектов, таких как набор случайных кубов, о которых говорилось в тематическом задании 13.1.

Для загрузки начального состояния стека ребер напишите подпрограмму makeEdgeStackO, которая просматривает каждую грань в массиве faces[], анализирует каждое ее ребро и загружает в запись типа Edge данные по ребрам для всех потенциально видимых ребер (без дубликатов). Определитесь, что делать с теми ребрами, которые принадлежат только одной невидимой грани.

13.10. Дополнительная литература В классической работе Сазерленда и других авторов [Sutherland, 193] содержится превосходный обзор проблемы удаления невидимых поверхностей, а также блестящие описания численных HSR-алгоритмов и их ожидаемой производительности. В работе Роджерса [Rogers, 105] подробно рассматривается большое число HSR-алгоритмов, а также приводится множество полезных примеров. Фоли и его соавторы [Foley, 17] также представляют ценный обзор HSR-проблемы и предлагают множество ее решений.


⇐ Предыдущая| |Следующая ⇒