Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры 1 шпоры.docx
Скачиваний:
21
Добавлен:
22.09.2019
Размер:
1.52 Mб
Скачать

12.Алгоритмы построения криволинейных поверхностей.

Алгоритм Ньюэла - Санча для случая многоугольников

Сформировать предварительный список приоритетов по глубине, используя в качестве ключа сортировки значение zmin для каждого многоугольника. Первым в списке будет многоугольник с минимальным значением zmin. Этот многоугольник лежит дальше всех от точки наблюдения, расположенной в бесконечности на положительной полуоси z. Обозначим его через P, а следующий в списке многоугольник — через Q.

Для каждого многоугольника P из списка надо проверить его отношение с Q:

-если ближайшая вершина P (РZmax) будет дальше от точки наблюдения, чем самая удаленная вершина Q (QZmin), то есть QZmin >= PZmax, то никакая часть P не может экранировать Q. Занести P в буфер кадра;

-если QZmin < PZmax то P потенциальное экранирует не только Q, но также и любой другой многоугольник типа Q из списка, для которого QZmin < PZmax. Тем самым образуется множество {Q}. Однако P может фактически и не экранировать ни один из этих многоугольников. Если последнее верно, то P можно заносить в буфер кадра. Для ответа на этот вопрос используется серия тестов, следующих по возрастанию их вычислительной сложности. Эти тесты ниже формулируются в виде вопросов. Если ответ на любой вопрос будет положительным, то P не может экранировать {Q}. Поэтому P сразу же заносится в буфер кадра. Вот эти тесты:

Верно ли, что прямоугольные объемлющие оболочки P и Q не перекрываются по x?

Верно ли, что прямоугольные оболочки P и Q не перекрываются по y?

Верно ли, что P целиком лежит по ту сторону плоскости, несущей Q, которая расположена дальше от точки наблюдения?

Верно ли, что Q целиком лежит по ту сторону плоскости, несущей P, которая ближе к точке наблюдения?

Верно ли, что проекции P и Q не перекрываются?

Каждый из этих тестов применяется к каждому элементу {Q}. Если ни один из них не дает положительного ответа и не заносит P в буфер кадра, то P может закрывать Q.

Поменять P и Q местами, пометив позицию Q в списке. Повторить тесты с новым списком. Это дает положительный результат.

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

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

Третий и четвертый тесты можно реализовать с использованием некоторых из ранее обсуждавшихся тестов видимости. Поскольку уравнение несущей плоскости или нормаль к ней часто известны для каждого многоугольника, то удобно применить простой тест подстановки. Если исследуется отношение многоугольника Q к многоугольнику P, то координаты вершин Q подставляются в уравнение плоскости, несущей P. Если все знаки результатов подстановки совпадают, то Q целиком лежит по одну сторону от P. Здесь, так же как и в других алгоритмах удаления невидимых поверхностей, производится предварительное удаление нелицевых граней.