Как я могу определить, находится ли ряд очков (или многоугольников) в прямоугольной области?

StackOverflow https://stackoverflow.com/questions/6068817

Вопрос

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

У меня есть набор точек, которые описывают непрямующую линию (иногда закрытый многоугольник). У меня есть прямоугольная область «вида». Мне нужно как можно эффективно определить, проходит ли какая-либо из сегментов линии (или границы многоугольника) через регион зрения.

Я не могу просто тестировать каждую точку, чтобы увидеть, находится ли он в пределах просмотра региона. Это возможно для прохождения через регион без какой-либо точки на самом деле внутри региона (т. Е. Линия нарисована по всей области).

Вот пример того, что я хочу определить (красный означает, что функция должна вернуть true для набора точек, синий означает, что он должен вернуть false, пример использует прямые линии и прямоугольники, потому что я не художник). .

красный указывает, что функция должна вернуть True, синий указывает, что он должен вернуть false

Другое состояние, которое я хочу иметь возможность объяснить (хотя метод / функция может быть отдельным), состоит в том, чтобы определить не только будь то граница многоугольника через прямоугольную область, но, полностью охватывает регион многоугольник. NUANCE вот в том, что в ситуации, впервые описанной выше, если я только обеспокоен рисованием границ, метод должен вернуть ложь. Но в ситуации, описанной здесь, , если мне нужно заполнить полигонскую область , то мне нужна функция, чтобы вернуть True. В настоящее время мне не нужно беспокоиться о тестировании полигонов «пончики» (слава Богу!).

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

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

Для «Есть ли какая-то сегмент линии или границы многоугольника, через экран?» Проблема, которую я знаю, я могу придумать решение (хотя и, возможно, не эффективный). Несмотря на то, что это более многословна, условия меня ясны. Но вторая «многоугольник на экране?» Проблема немного сложнее. Я надеюсь, что кто-то может иметь хорошее предложение для этого. И если один раствор легко реализован сверху другой, ну, Booya.

Как всегда, заранее спасибо за любую помощь или предложения.

PS У меня есть функция для определения линейного пересечения, но кажется, что излишки, чтобы использовать его для сравнения каждого сегмента на каждую сторону на экранной области, потому что на экранной области всегда является простой [0, 0, ширина , высота] прямоугольник. Нет какого-то короткого разреза?

Это было полезно?

Решение

PS У меня есть функция для определения линия пересечения, но кажется изложитель, чтобы использовать его, чтобы сравнить каждый сегмент на каждую сторону экрана регион, потому что на экранной области Всегда просто [0, 0, ширина, высота] прямоугольник.Нет какого-то короткозащитный?

Это не перенапряжение, его необходимый здесь.Единственным видом ярлыка, который я могу подумать, заключается в том, чтобы значения жесткого крепления [0, 0, ширина, высоту] в эту функцию и немного упростить его.

Другие советы

Что вы ищете названы a Алгоритм обнаружения столкновения A A Google Search приведет васдо множества реализации на разных языках, а также много теории

Есть много геометрической теории позади, от простейшего бисектора исчисления, чтобы ограничить триангуляцию Delaunay и диаграммы VoroNoi (которые являются лишь примерами).Это зависит от формы объекта, количества измерений и наверняка соотношение между точностью, необходимыми и вычислительным временем; -)

Хороший читал

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top