2016-07-07 2 views
1

У меня есть простой двумерный многоугольник с вершинами 3..n. Мне нужно найти произвольную точку внутри (не на границе) этого многоугольника. Как его найти? Эта проблема тривиальна для выпуклых многоугольников: просто возьмите три смежные точки, которые не лежат на одной линии (поэтому они образуют треугольник). Середина этого треугольника гарантированно лежит внутри многоугольника. Но этот подход не работает для невыпуклых многоугольников.Найти точку в полигоне

class Point 
    { 
     public double X, Y; 
    } 

    Point GetPointInPolygon(Point[] polygon) 
    { 
     ..... 
    } 
+0

Вы даже попробовали что-нибудь? SO не является кодовым сервисом. Так в чем твоя идея? Какие шаги следует предпринять, чтобы получить то, что вы хотите, может быть, какой-нибудь псевдо-код? – HimBromBeere

+0

Если вы хотите, чтобы какая-либо точка в полигоне задавалась ее вершинами, тогда просто верните первую вершину. Если вы хотите, чтобы какая-либо внутренняя точка, исключая вершины, затем использовала уравнение линии двумя точками (x0, y0), (x1, y1) https://en.wikipedia.org/wiki/Linear_equation#Two-point_form и получала очки от x0 до x1. Чтобы узнать, не является ли какой-либо вопрос внутренним, прочитайте эту статью http://stackoverflow.com/questions/4243042/c-sharp-point-in-polygon, но это больше, чем вам нужно. – derloopkat

+0

Вы читали статью wiki? https://en.wikipedia.org/wiki/Point_in_polygon – jdweng

ответ

4

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

Вы найдете четное количество перекрестков. Отсортируйте их, увеличив абсцисс и выберите любую точку между четным и нечетным пересечением.

Для этого требуется время O (N), которое является оптимальным.

enter image description here

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

Опечатка:

В худшем случае, может быть O (N) перекрестки и сортировка будет принимать O (N Log (N)) операций. На практике это редко встречается.


Примечание стороны:

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

Возможные расстояния смещения ограничены, но я понятия не имею, как эта граница может быть найдена. Это будет соответствовать «самым глубоким» точкам.

+0

Удивительный, спасибо – NMO

Смежные вопросы