Как работает Алгоритм простой тупой воронки?

14

Работая с алгоритмом воронки, показанным на Digesting Duck, я не уверен, как работает обнаружение воронки.

Может ли кто-нибудь объяснить мне метод четко или предложить альтернативный способ обнаружения воронки, и если стороны воронок перекрываются?

Rolfcore
источник

Ответы:

18

Алгоритм начинается с пути, который вы нашли ранее, в данном случае это список треугольников:

путь

Код в нижней части поста Микко в блоге создает массив порталов, представляющий собой список отрезков, представляющих отрезки между полигонами пути. Это «порталы», через которые должен пройти сглаженный путь (или ребра полигона из «давайте проследим середины ребра полигона»). Обратите внимание, что список порталов начинается и заканчивается вырожденными отрезками в начальной и конечной точках.

Этот список порталов показан в виде желтых пунктирных линий на его рисунках.

порталы

Алгоритм начинается с широкой воронки и продолжается итерационным перемещением сторон воронки вперед вдоль боковых точек портала (конечных точек отрезков линии), пока это затягивает воронку (AD).

алгоритм

Это означает, что каждое движение вперед должно перемещать края воронки внутрь, это можно проверить с помощью перекрестного произведения векторов, представляющих старую сторону и потенциальную новую сторону ( P × Q на рисунке ниже; также см. triarea2В коде Микко). Если движение вперед на сторону не затянет воронку, мы не обновляем эту сторону для текущей итерации порталов (E).

двигаться внутрь

Другой случай, который необходимо обработать, - это когда воронка вырождается в отрезок. Чтобы учесть это, алгоритм проверяет, находится ли одна из сторон на «неправильной» стороне, снова используя перекрестное произведение, на этот раз векторов, сделанных вершиной воронки и правой и левой боковыми конечными точками соответственно ( R × S в изображение ниже).

вырожденная воронка

В этом случае вектор из вершины воронки и правильной боковой конечной точки добавляется к сглаженному пути ( R на рисунке выше), и алгоритм перезапускается с конечной точкой в ​​качестве новой вершины (FG), если только, конечно, если это цель цели.

Эрик
источник
2
@ Rolfcore Ответ ясен? Если нет, то какие детали нуждаются в улучшении?
Эрик
Я думаю, что он просто забыл принять ответ, он очень хорош и должен быть серийно одобрен ^^.
GameDeveloper
Может быть, тонко понял, что в шаге F вы не говорите, что мы не начинаем снова с нуля, потому что существует вероятность того, что узкий угол, указывающий на юг, сделает возможной самую тесную воронку, поэтому мы должны подождать, пока стороны ботов действительно потерпят неудачу. тест, а не только один. Таким образом, мы делаем это в G вместо F .. хорошее объяснение в любом случае :)
GameDeveloper