Вопросы 15 - chrislvt/CG GitHub Wiki
Отсечение - это операция удаления изображения за пределами выделенной области, называемой окном.
Алгоритм отсекает отрезок произвольным выпуклым отсекателем.
Отрезок, вектор.
- Рассматриваем дирректрису(вектор направления отрезка)
- Вектор из произвольной точки ребра (обычно начальная) в начало определяемого отрезка "вектор, начинающийся в точке, лежащей на i - ом ребре окна отсечения, и заканчивающийся в любой точке исследуемого отрезка"
- Вектор внутренней нормали.
Анализируем скалярные произведения 1 и 3, 2 и 3.
Да, может. Если отсекаемый отрезок параллелен рассматриваему ребру.(или если отрезок вырожденный)
В самом начале алгоритма t_down = 0, t_up = 1 (отрезок считается полностью видимым).
Далее во время работы алгоритма
при вычислении начала видимой части будем получать t < 0
при вычислении конца видимой части t > 1.
Началом видимой части считается максимальное значение среди всех параметров,
определяющих начало видимой части, а так как они все получатся t ≤ 0,
то максимальное значение начала видимой части будет равно 0.
Концом видимой части считается минимальное значение среди всех параметров,
определяющих конец видимой части, а так как они все получаться t ≥1, то
минимальное значение конца видимой части будет равно 1.
Получается, что t_down = 0, t_up = 1 и выполняется условие
фактической видимости отрезка t_down <= t_up
(начало видимой части отрезка расположено до конца видимой части),
поэтому отрезок является полностью видимым.
А при невидимом
При проверке пересечения с какой-то из сторон значение t
получится больше 1, а значение D * Ni (scalarD) будет больше 0.
Значит начало границы видимости расположено ближе к началу отрезка (scalarD > 0),
но при этом на продолжении отрезка (t > 1) => отрезок невиден
Задача - отсечение выпуклым отсекателем отрезков.
Параметрическое уравнение отрезка, векторы: директриса(вектор направления отрезка), вектор из произвольной точки ребра (на самом деле выбирается одна из вершин ребра) в начало определяемого отрезка "вектор, начинающийся в точке, лежащей на i - ом ребре окна отсечения, и заканчивающийся в любой точке исследуемого отрезка", вектор внутренней (но можно реализовать и со внешней) нормали. С векторами - векторное произведение (для проверки на выпуклость ещё до алгоритма) и скалярные в самом алгоритме.
Не очень понятно, что Куров вообще хочет услышать на эту тему, но вот типа два подхода (озвучьте оба): 1) В целом может быть не более двух точек пересечения отрезка с отсекателем. 2) Для каждого ребра отсекателя может быть найдено пересечение отрезка с самим ребром или его продолжением (или не найдено вообще). То есть всего будет найдено не более n точек пересечения (где n - кол-во рёбер отсекателя).
Суть в том, что в итоге для отрезка у нас получается два набора точек пересечения (две группы). Они называются верхней и нижней. Нижняя - точки пересечения, ближе к началу отрезка - определяют начало видимости отрезка. Верхняя - ближе к концу - определяют конец видимости отрезка. Из нижней группы мы выбираем максимум. Из верхней - минимум. Это и будут границы видимости. То есть по сути нужна сортировка, но она не происходит явно, так как на каждом шаге мы релаксируем (обновляем) значение миниму и максимума.