Относится к: Разложение многоугольника - удаление вогнутых точек для образования выпуклых многоугольников < / а>
Я ищу алгоритм, чтобы сделать следующее:
Входными данными является массив двумерных точек (P 0… P N-1). Длина N массива варьируется (3 ≤ N ‹∞).
Для любого 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)]
(первые три точки коллинеарны: я не ожидал, что алгоритм сможет справиться с этим.)