exam33 - MiAneko24/bmstu-cg GitHub Wiki

33. Алгоритм, использующий список приоритетов.

  • Алгоритмы, использующие список приоритетов, пытаются получить преимущество предварительной сортировкой по глубине или приоритету.
  • На выходе (после сортировки) получаем окончательный список элементов сцены, упорядоченных по приоритету глубины, основанному на расстоянии от точки наблюдения.
  • Если список окончателен, то никакие два элемента не будут перекрывать друг друга.
  • Эффекты прозрачности можно включить в состав алгоритма путем частичной корректировки содержимого буфера кадра.
  • Такие алгоритмы работают как в пространстве объекта, так и в пространстве изображения.

Основная проблема

  • Для простых сцен, список приоритетов мы можем получить сразу.
  • Однако, есть сцены, для которых невозможно получить результат простой сортировкой по z.
  • Может случится так, что объекты циклические прерывают друг друга.

example

Решение проблемы (не циклического прерывания)

Для таких приколов придумали специальный метод сортировки.
В алгоритме динамически вычисляется новый список приоритетов перед обработкой каждого кадра сцены.

Алгоритм (из Роджерса)

Называется алгоритмом Ньюэла - Ньюэла - Санча.

1. Сформировать предварительный список приоритетов по глубине, используя в качестев
   ключа сортировки zmin, для каждого многоугольника. Первый многоугольник в списке -
   с минимальным zmin. Он будет лежать дальше всех от точки наблюдения. Обозначим его P,
   следующий в списке - Q.
2. Для каждого P из списка проверить отношение с Q.
   2.1. Если ближайшая вершина P(P zmax) дальше от точки наблюдения чем самая удаленная
        Q(Qzmin) (Qzmin >= Pzmax), то никая часть P не может экранировать Q. Занести P
        в буффер кадра.
   2.2. Иначе (если Qzmin < Qzmax), то P потенциальное экранирует не только Q, но и любой
        другой многоугольника типа Q из списка для которого Qzmin < Pzmax. Образуется
        множество { Q }. Однако, P может фактически и не экранировать ни один из этих 
        многоугольников. Если последнее верно, то P заносим в буфер кадра. Для ответа 
        на этот вопрос, используется серия тестов. Если ответ на любой вопрос положительный,
        то P не может экранировать { Q }, P заносится в буффер кадра.

Те самые тесты

Расположены эти тесты по возрастанию их вычислительной сложности.

aga

Тут вообще можно дохуя всего написать по поводу этих тестов. Но я не буду, это пиздец какой то.

При циклическом экранировании

Тут нужно разбиение. Для разбиения многоугольников вдоль линии пересечения несущих этих многоугольников можно воспользоваться алгоритмом Сазерланда - Ходжмена.

1

РАССМАТРИВАЕМ КАРТИНКУ РАСПОЛОЖЕННУЮ СПРАВА.

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

Тот, что слева, имеет приоритет над Q. А справа - наоборот, экраниризируется Q.

Оценка эффективности

  • Может нехватить мощности ЭВМ для динамического вычисления.
  • В большинстве случаев, картинка статична. Можно предварительно вычислять некоторые более общие приоритетные характеристики (алгоритм Шумейкера, там вообще шок какой-то).

Следующий вопрос: 34. Алгоритм построчного сканирования, использующий Z буфер. Интервальные методы построчного сканирования (основные предпосылки).

Предыдущий вопрос: 32. Алгоритм, использующий Z буфер.