Проверка точки в объеме / трехмерном пространстве - PullRequest
0 голосов
/ 20 июня 2011

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

Я что-то пробовалкак в случае с лучом.

Но проблема в том, что в моем алгоритме, чтобы проверить возможность, я проецирую точку на плоскость вдоль оси Z. Если проецируемая точка находится в пределах квад / три и значения zспроецированная точка больше, чем значение Z исходной точки, я буду считать лицо. Если нет, то если это не так. Если общий счет равен ODD, то это означает, что точка находится внутри трехмерного тома.

ispointinside3Dspace(point,facelist)
{
for faces in the object:
{
  project the point onto the face along Z axis;
  if( projected point is within the face):
  {
        if( projectedpoint->z > point->z ):
        {
           face_hit++;
        }
   }
}
if(face_hit%2==1)
{
   return(1);
}
else
{
   return(0);
}
}

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

1 Ответ

0 голосов
/ 20 июня 2011

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

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

...