Вопросы 15 - p1xelse/CG GitHub Wiki

Что такое отсечение?

Отсечение - это операция удаления изображения за пределами выделенной области, называемой окном.

Что делает алгоритм?

Алгоритм отсекает отрезок произвольным выпуклым отсекателем.

Какие рассматриваются геометрические фигуры?

Отрезок, вектор.

Какие векторы и что мы с ними делаем?

  1. Рассматриваем дирректрису(вектор направления отрезка)
  2. Вектор из произвольной точки ребра (обычно начальная) в начало определяемого отрезка "вектор, начинающийся в точке, лежащей на i - ом ребре окна отсечения, и заканчивающийся в любой точке исследуемого отрезка"
  3. Вектор внутренней нормали.

Анализируем скалярные произведения 1 и 3, 2 и 3.

Знаменатель может равняться нулю (когда мы определяем t)?

Да, может. Если отсекаемый отрезок параллелен рассматриваему ребру.(или если отрезок вырожденный)

Как определяется полная видимость отрезка?

В самом начале алгоритма 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) => отрезок невиден

Part 2 Отсечение. Алгоритм отсечения выпуклым отсекателем

Какая задача-то?

Задача - отсечение выпуклым отсекателем отрезков.

Какие математические объекты мы используем?

Параметрическое уравнение отрезка, векторы: директриса(вектор направления отрезка), вектор из произвольной точки ребра (на самом деле выбирается одна из вершин ребра) в начало определяемого отрезка "вектор, начинающийся в точке, лежащей на i - ом ребре окна отсечения, и заканчивающийся в любой точке исследуемого отрезка", вектор внутренней (но можно реализовать и со внешней) нормали. С векторами - векторное произведение (для проверки на выпуклость ещё до алгоритма) и скалярные в самом алгоритме.

Всего сколько точек пересечения мы можем найти?

Не очень понятно, что Куров вообще хочет услышать на эту тему, но вот типа два подхода (озвучьте оба): 1) В целом может быть не более двух точек пересечения отрезка с отсекателем. 2) Для каждого ребра отсекателя может быть найдено пересечение отрезка с самим ребром или его продолжением (или не найдено вообще). То есть всего будет найдено не более n точек пересечения (где n - кол-во рёбер отсекателя).

Вопрос не слышно. Что-то про сортировку и выбор.

Суть в том, что в итоге для отрезка у нас получается два набора точек пересечения (две группы). Они называются верхней и нижней. Нижняя - точки пересечения, ближе к началу отрезка - определяют начало видимости отрезка. Верхняя - ближе к концу - определяют конец видимости отрезка. Из нижней группы мы выбираем максимум. Из верхней - минимум. Это и будут границы видимости. То есть по сути нужна сортировка, но она не происходит явно, так как на каждом шаге мы релаксируем (обновляем) значение миниму и максимума.

⚠️ **GitHub.com Fallback** ⚠️