- •2. Трехмерное изменение масштаба.
- •3. Трехмерный сдвиг
- •4. Трехмерное вращение
- •Содержание
- •Метод трассировки луча[править | править исходный текст] Учёт числа пересечений[править | править исходный текст]
- •Учёт числа оборотов[править | править исходный текст]
- •Метод суммирования углов[править | править исходный текст]
- •Содержание
Учёт числа оборотов[править | править исходный текст]
Кривая делает два оборота вокруг данной точки.
Рассмотрим число оборотов, которое делает ориентированная граница многоугольника вокруг данной точки P. В алгебраической топологии это число называется winding number.[2] Оно может быть вычислено следующим образом. Как и раньше, выпустим луч из P в произвольном направлении и рассмотрим рёбра, которые он пересекает. Каждому пересечению присвоим число +1 или -1, в зависимости от того, как ребро пересекает луч — по часовой (слева направо) или против часовой стрелки (справа налево). Эти два случая можно различить по знаку скалярного произведения между направляющим вектором ребра и нормалью к направляющему вектору луча.[3] Сумма полученных величин и есть winding number. Сумма будет положительной или отрицательной, в зависимости от ориентации границы. Если она не равна нулю, то будем считать, что точка лежит внутри многоугольника, иначе — снаружи.
Такой алгоритм известен под названием nonzero winding rule.[3]
Для простых многоугольников этот метод работает так же, как и метод, основанный на подсчёте числа пересечений. Разница между ними проявляется при рассмотрении многоугольников с самопересекающейся границей.
Метод суммирования углов[править | править исходный текст]
Можно определить, что точка P находится внутри многоугольника c вершинами V0, V1, ..., Vn = V0, вычислив сумму:
,
где
—
угол (в радианах и со знаком) между
лучами PVi -
1 и PVi,
т.е.:
Можно
доказать, что эта сумма есть не что иное,
как winding
number точки P относительно
границы многоугольника, с точностью до
константного множителя
.
Поэтому можно считать, что точка лежит
снаружи многоугольника, если сумма
равна нулю (или достаточно близка к
нему, если используется приближённая
арифметика). Однако данный метод весьма
непрактичен, так как требует вычисления
дорогостоящих операций для каждого
ребра (обратных тригонометрических
функций, квадратных корней, деления), и
был даже назван «худшим в мире алгоритмом»
для данной задачи.[1]
К. Вейлером был предложен практичный вариант этого метода, избегающий дорогостоящих операций и приближенных вычислений.[4] Было показано, что сумму углов можно вычислить, используя лишь операцию классификации точки многоугольника по квадрантам относительно точки P. Алгоритм Вейлера и некоторые улучшения к нему описываются в [5].
Алгоритм Уайлера — Атертона (Вейлера — Азертона, Weiler–Atherton) используется в компьютерной графике для клиппинга (нахождения области пересечения)отсекаемого многоугольника по отсекающему многоугольнику, также называемому окном. Отсекаемый и отсекающий многоугольники могут быть невыпуклыми. Алгоритм применим только для плоских фигур.
Входные многоугольники должны иметь фиксированное направление обхода границы (допустим, по часовой стрелке), и не иметь самопересечений. Алгоритм может обрабатывать многоугольники с дырками (дырки задаются как многоугольники с противоположным направлением обхода), но требует дополнительных алгоритмов для определения, какие из многоугольников являются дырками.
Алгоритм может быть модифицирован для объединения двух многоугольников.
Алгоритм[править | править исходный текст]
Из координат вершин многоугольников A и B составляются два списка.
Вершины в каждом из списков помечаются в соответствии с тем, находятся ли они внутри другого многоугольника или нет.
В оба списка добавляются точки пересечения многоугольников; между совпадающими точками в разных списках устанавливаются двусторонние связи.
Если ни одного пересечения не найдено, возникает одна из следующих ситуаций:
A внутри B — вернуть A при отсечении, B при объединении.
B внутри A — вернуть B при отсечении, A при объединении.
A и B не пересекаются — вернуть пустое множество при отсечении, A&B при объединении.
Составляется список точек пересечения, в которых граница многоугольника A при обходе входит в многоугольник B. Следуя из каждой такой точки по часовой стрелке вдоль границ обоих многоугольников A и B, можно найти множество областей пересечения. В случае, когда A и B выпуклы, многоугольник пересечения только один. Таким же образом можно найти и объединение многоугольников, в этом случае обход нужно начинать с выходных точек.
Проективное преобразование — это преобразование проективной плоскости, переводящее прямые в прямые.
