Учитывая многоугольник и точку в 2D, как можно найти элемент (вершину или ребро) многоугольника, ближайший к точке?

Наивный подход состоит в том, чтобы найти для каждого ребра многоугольника точку на этом ребре, ближайшую к данной точке, а затем выбрать ближайшую. Есть ли более быстрый алгоритм? Моя цель — реализовать 2D-платформер в стиле Super Mario Galaxy.

Судя по всему, это можно сделать с регионами Вороного, как на этом видео: http://www.youtube.com/watch?v=Ldh2YKobuWo

Однако я не могу найти ни одного алгоритма Вороного, который бы работал не только с точками, но и с ребрами. Идеи?


person Jake    schedule 04.10.2011    source источник


Ответы (2)


Если многоугольник выпуклый, то накладные расходы вычисления Вороного намного превышают наивные подходы.

Если это выполняется много раз, и каждый раз, когда точка немного меняется, вам нужно проверить только 3 сегмента (подумайте об этом: когда вы перемещаетесь, предполагая много проверок, ближайшее ребро будет меняться только на соседнее ребро)

person Foo Bah    schedule 04.10.2011
comment
Последняя часть не соответствует действительности. Может измениться на сегмент на противоположной стороне многоугольника, если вы начнете, например, близко к середине. - person Jean-François Corbett; 05.10.2011
comment
@ Jean-FrançoisCorbett Если вы находитесь внутри многоугольника, это правда. - person Foo Bah; 05.10.2011
comment
К счастью для моего приложения, рассматриваемая точка никогда не окажется внутри многоугольника. Ура. - person Jake; 05.10.2011
comment
@ Джейк, когда точка снаружи (что я и предполагал, учитывая характер вопроса), мой ответ правильный - person Foo Bah; 05.10.2011
comment
Я согласен! Не знаю, как вы догадались, что точка снаружи... Наверное, я давно не играл в Супер Марио. - person Jean-François Corbett; 05.10.2011

Вычислите расстояние между точкой и линией для каждого ребра, затем выберите кратчайшее. . Нет ярлыка. На этом сайте есть хорошее объяснение и даже реализации на разных языках.

Однако нахождение «точки на этом ребре, ближайшей к данной точке», является ненужным с точки зрения вычислений промежуточным результатом.

person Jean-François Corbett    schedule 04.10.2011