Определите, находится ли точка (x, y, z) внутри фигуры, определенной массивом точек - PullRequest
5 голосов
/ 11 февраля 2011

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

Я рисую пробел на этом ...

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

РЕДАКТИРОВАТЬ

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

Спасибо!

К вашему сведению:

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; }

Это потребует некоторой работы, но в этом вся сила.

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

Ответы [ 2 ]

16 голосов
/ 11 февраля 2011

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

2 голосов
/ 11 февраля 2011

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

Удачи.

...