2011-02-10 10 views
4

Если у меня есть массив точек (x, y, z) и задана одна точка (x, y, z) , какой код я использую, чтобы определить, находится ли эта точка внутри формы, определенной массивом?Определить, находится ли точка (x, y, z) внутри формы, заданной массивом точек

Я рисую пустой на этом ...

Я использую C#

EDIT

Спасибо за ответы, ребята, из комментариев, которые я нашел эту ссылку (http://alienryderflex.com/polygon/), что объясняет процесс достаточно хорошо.

Спасибо!

FYI:

bool pointInPolygon() { 

     int  i, j=polySides-1 ; 
     boolean oddNodes=NO  ; 

     for (i=0; i<polySides; i++) { 
     if (polyY[i]<y && polyY[j]>=y 
     || polyY[j]<y && polyY[i]>=y) { 
      if (polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x) { 
      oddNodes=!oddNodes; }} 
     j=i; } 

     return oddNodes; } 

Это будет нужна работа, но вот внутренности его.

Еще раз спасибо

+1

Возможный дубликат [C# Point in polygon] (http://stackoverflow.com/questions/4243042/c-point-in-polygon) –

+1

Это хорошо известный значок. См. Http://en.wikipedia.org/wiki/Point_in_polygon –

+2

Ваша проблема не указана. Как массив определяет форму? Является ли это выпуклой оболочкой точек в массиве? Или существует какой-то порядок многогранного треугольника, который определяет многогранник? –

ответ

16

Используйте точку, что вы знаете, находится за пределами формы, и проверить, если линия от этой точки до данной точки проходит через поверхность формы. Если он проходит через нечетное число поверхностей, данная точка находится внутри формы.

+5

+1 потому что святое дерьмо. –

+2

Отличный ответ, но на самом деле это сложнее, чем кажется. – KeithS

+0

Так просто и очевидно сейчас. –

2

В дополнение к ответу Гуффа, это сложнее, чем кажется, чтобы определить, пересекает ли линия поверхность. Вот математика за этим: Intersection of lines and planes. Вы должны принять этот базовый алгоритм (который включает в себя поиск нормали каждой поверхности к этой точке, а затем определение угла между нормалью и строкой, чтобы сформировать правый треугольник, на который вы найдете третью точку; библиотека WPF Media3D имеет функции в точках и векторы, которые делают все это проще), затем определите, попала ли найденная вами точка пересекает плоскость поверхности в пределах этой поверхности. Для этого вы можете выполнить любую 2D-проекцию этой поверхности с областью> 0 и выполнить тест «точка в полигоне», которая представляет собой 2D-версию теста «точка в полиэдре», которую вы пытаетесь сделать.

Удачи.