Мне не удается найти лучший способ решить следующую проблему. Я пробовал несколько способов их решения, но всегда сталкиваюсь с некоторыми угловыми случаями.
Проблема в следующем:
- У вас есть
List
координат (точки x и y), образующие замкнутый многоугольник. Этот список гарантированно образует многоугольник с точками, упорядоченными по часовой стрелке. - Вам дается
Set
координат (точки x и y), которые взяты изList
выше координат. - Вы должны определить начальную и конечную точки линии, сформированной с использованием всех точек в указанном выше
Set
.
Проблема, с которой я столкнулся, заключается в том, что я не могу понять, как найти «лучшие» начальную и конечную точки. Для многих сценариев вы можете выбрать первую и последнюю точку (используя индексы List
), чтобы сформировать начальную и конечную точки, однако это может привести к тому, что линия будет длиннее, чем должна быть.
Например, предположим, что у нас есть следующий многоугольник: 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 0
И следующие Set
координат, которые должен содержать наш линейный сегмент: 0, 7, 3
.
Если мы найдем минимальные и максимальные индексы, мы получим index(0)
, index(7)
, так что мы можем сформировать строку 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
, которая является допустимой строкой, но она длиннее, чем должна быть. Лучшим отрезком линии будет 7 -> 0 -> 1 -> 2 -> 3
.
Как я могу эффективно найти лучший (самый короткий, содержащий все точки Set
) отрезок линии?
Для контекста: я работаю над приложением, которое использует геометрию JTS для рисования фигур. Нарисованные формы сглаживаются с помощью кривых Безье, что приводит к «изогнутым краям». После рисования фигур (путем опускания точек) пользователи могут редактировать форму. Мы хотим определить начальную и конечную точки, используя точки, которые они изменяют (образует Set
выше), чтобы мы могли «сгладить» только затронутую область.