Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 验证体积/三维空间中的点_Python_C_Graphics_3d_Mesh - Fatal编程技术网

Python 验证体积/三维空间中的点

Python 验证体积/三维空间中的点,python,c,graphics,3d,mesh,Python,C,Graphics,3d,Mesh,我一直在开发一个网格库。我想添加一个功能,这样它可以检测一个点是否位于三维网格内 我试过像光线投射算法这样的东西 但问题是。, 在我的算法中,为了测试这种可能性,我沿着Z轴将点投影到平面上。如果投影点在四元/三元范围内,并且投影点的Z值大于原始点的Z值,我将计算面。如果不是,我不会。如果总计数为奇数,则表示该点位于3D体积内 ispointinside3Dspace(point,facelist) { for faces in the object: { project the point

我一直在开发一个网格库。我想添加一个功能,这样它可以检测一个点是否位于三维网格内

我试过像光线投射算法这样的东西

但问题是。, 在我的算法中,为了测试这种可能性,我沿着Z轴将点投影到平面上。如果投影点在四元/三元范围内,并且投影点的Z值大于原始点的Z值,我将计算面。如果不是,我不会。如果总计数为奇数,则表示该点位于3D体积内

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个四边形/多个三角形共享。是否有更好的算法。
如何避免这种过度计算???如果我忽略投影点是面上顶点的可能性,我将无法得到正确的结果。

这种情况的通常方法是对整个系统应用一个小的变换(旋转或剪切变换)。在某些情况下(至少在2d中),您甚至不需要知道变换的确切数量,但您可以象征性地这样做,并相应地调整算法


在您的情况下,我可能会首先检查光线是否击中顶点(或边缘,这会造成相同的问题,因为此击中至少会被计数两次)。如果是这样的话,我会稍微修改你的投影方向,然后再做一次测试。由于更改投影方向可能需要对算法进行重大更改,因此您也可以通过对系统的所有点应用小旋转(使用预先计算的旋转矩阵)来执行此操作。

我必须变换计数为百万的顶点!!!我正在尽最大努力避免这种转变。甚至我也想过这样做,但仅仅是一个程序来运行整个列表就会显示出相当大的滞后。你的第二个选择也是我一直在考虑的,但是,即使在这样的变换之后,如果光线不幸击中另一个顶点???所有的变换都将白费。我真的很感谢你考虑我的问题。@GSreeTejaSimha很抱歉我没有回答你的评论:除非你在你的邮件中加上“@MartinStettner”(或者给我一个向上的投票权;)…),否则我不会被通知对我的回答有任何反应。还有什么悬而未决的问题吗?