Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Робертс алгоритмі.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
650.7 Кб
Скачать

Учёт числа оборотов[править | править исходный текст]

Кривая делает два оборота вокруг данной точки.

Рассмотрим число оборотов, которое делает ориентированная граница многоугольника вокруг данной точки P. В алгебраической топологии это число называется winding number.[2] Оно может быть вычислено следующим образом. Как и раньше, выпустим луч из P в произвольном направлении и рассмотрим рёбра, которые он пересекает. Каждому пересечению присвоим число +1 или -1, в зависимости от того, как ребро пересекает луч — по часовой (слева направо) или против часовой стрелки (справа налево). Эти два случая можно различить по знаку скалярного произведения между направляющим вектором ребра и нормалью к направляющему вектору луча.[3] Сумма полученных величин и есть winding number. Сумма будет положительной или отрицательной, в зависимости от ориентации границы. Если она не равна нулю, то будем считать, что точка лежит внутри многоугольника, иначе — снаружи.

Такой алгоритм известен под названием nonzero winding rule.[3]

Для простых многоугольников этот метод работает так же, как и метод, основанный на подсчёте числа пересечений. Разница между ними проявляется при рассмотрении многоугольников с самопересекающейся границей.

Метод суммирования углов[править | править исходный текст]

Можно определить, что точка P находится внутри многоугольника c вершинами V0V1, ..., 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 выпуклы, многоугольник пересечения только один. Таким же образом можно найти и объединение многоугольников, в этом случае обход нужно начинать с выходных точек.

Проективное преобразование — это преобразование проективной плоскости, переводящее прямые в прямые.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]