Я хотел бы проверить, описывает ли набор из N точек выпуклый многоугольник или нет
Мне было интересно, есть ли хороший алгоритм для этого?
Вот некоторые подходы, о которых я подумал:
1. Алгоритм выпуклой оболочки:
Если множество равно его выпуклой оболочке, то оно выпуклое. Сложность такого алгоритма O(n*LN(N)). Но у меня было чувство, что это было все равно, что разбить бабочку о колесо.
3. Глядя на углы:
Затем я подумал о том, чтобы проверить, не превышают ли углы двух последовательных векторов 180°. Но поскольку мои точки не упорядочены, мне нужно проверить все комбинации из 3 последовательных точек, и это составляет сложность O (n3). (Должен быть способ сделать лучше, чем это)
Например, я пытаюсь выбирать точки справа налево, но результаты не всегда такие, как ожидалось:
Например, в этом случае я нахожу выпуклую форму, если беру слева направо:
Поэтому для этого решения мне может понадобиться хороший алгоритм для выбора точек.
<сильный>3. глядя на барицентр :
Я думаю, что проверка того, находится ли барицентр всех трех последовательных точек внутри формы, скажет мне, является ли форма выпуклой или нет.
Вот что я имею в виду (G — барицентр каждого треугольника):
для этого решения я могу без проблем выбирать точки слева направо. если сложность проверки того, находится ли G в форме, равна O(N), то общая сложность будет примерно такой же, как O(N2).
Не могли бы вы посоветовать мне хороший алгоритм для решения этой проблемы или улучшить решения, о которых я думаю?
заранее спасибо
N
баллах (они заказаны?), то вы не можете получить ничего лучше, чемN*log(N)
. Если я смогу найти доказательство, я буду рад поделиться им с вами, но сейчас это скорее ощущение, чем доказательство. - person B. Decoster   schedule 04.07.2011