Относится к: Разложение многоугольника - удаление вогнутых точек для формирования выпуклых многоугольников
Я ищу алгоритм для выполнения следующих действий:
Входные данные - это массив2D точек (P 0 … P N-1 ).Длина N массива варьируется (3 ≤ N <∞) <br>Для любого M ≤ N может быть или не быть выпуклый многоугольник, вершины которого равны P 0 … P M-1 в некотором порядке.
Примечание ребра не обязательно являются смежными парами в массиве.
Какой наиболее эффективный алгоритм для нахождения максимального значения M такой, чтоэтот выпуклый многоугольник существует?
Мой текущий алгоритм очень неэффективен.Я тестирую с M = 3, затем M = 4, M = 5 и т. Д., Вычисляю корпус, затем проверяю, что все P 0 … P M-1 являются вершинами корпуса, еслине тогда я вырываюсь из цикла и возвращаю M-1.
Пример # 1: [(-2,2), (2,2), (-2,-2), (-1,1)]
результат: 3 (потому что первые три точки образуют треугольник, но добавляяP 3 = (-1,1)
сделает полигон невыпуклым)
Пример № 2: [(-2,2), (2,2), (-2,-2), (1,-1)]
результат: 4 (потому что выпуклый четырехугольникможет быть построен из всех 4 точек массива)
Обновление Пример # 3: [(-3,3), (3,3), (2,-1), (-3,-3), (3,-3), (-2,1)]
результат: 4.
В этом примере демонстрируетсяпочему недостаточно взять выпуклую оболочку всех предоставленных точек и найти префикс, который является ее подмножеством.(3,-3)
не может быть частью выпуклого многоугольника, состоящего из первых пяти точек, потому что тогда предыдущая точка (2,-1)
больше не будет лежать на корпусе.Но это (3,-3)
, которое должно быть отклонено, даже если оно лежит на корпусе всех шести точек, а (2,-1)
- нет.
Примеры неверных входных данных:
[(-1,-1), (0,0)]
(слишком мало точек) [(-1,-1), (0,0), (1,1), (1, -1)]
(первые три точки коллинеарны: я не ожидал бы алгоритмчтобы справиться с этим.)