Подтвердить что ты не робот

Алгоритм нахождения наибольшей вписанной хорды замкнутой полилинии

Я ищу алгоритм, чтобы найти самый длинный аккорд ( "диаметр" ) замкнутой полилинии. К сожалению, полилиния не должна быть выпуклой, но аккорд должен лежать целиком внутри кривой. Вот пример:

введите описание изображения здесь

Решение, которое я ищу, - это разбитый красный сегмент.

Можете ли вы предложить эффективный алгоритм для этого? Самое лучшее, что нам удалось достичь до сих пор, - это алгоритм N², который пробует все пары вершин, но даже это кажется неправильным, поскольку хорда не обязательно проходит через две вершины (или делает это?).

Меня также интересует связанная с этим проблема, когда мы ищем самый большой сегмент, соединяющий две вершины (или самую длинную часть этого сегмента, которая лежит внутри кривой, если сегмент не полностью вписан). В этом случае алгоритм N² работает, но медленен для большого количества точек.

4b9b3361

Ответ 1

Я думаю, что решение всегда будет включать как минимум две вершины. Таким образом, вычисляя список всех сегментов линий между всей вершиной, , включая ту, которая распространяется на другой сегмент линии полигонов, сделает трюк.

Чтобы вычислить, будет ли какой-либо отрезок линии, преобразованный в лучу, пересекаться с другим сегментом линии, см. ответ: Как вы проверяете пересечение между сегментом линии и линейным лучом, исходящим от точки под углом от горизонтали?

После этого проверьте, полностью ли наш список сегментов линии находится внутри полигона. Следующий ответ позволит вам проверить это, исключив те, которые выходят за пределы. определить, находится ли сегмент линии внутри полигона

Теперь самым длинным из оставшихся должен быть ответ.