我正在尝试确定一个点位于从STereoLithography(.stl)文件导入的多面体内。我想知道是否存在已解决此问题的C ++解决方案/库。
我希望避免炮击Matlab solution
答案 0 :(得分:0)
问题的理论有点简单,当你从一个点到外面时,你将不得不传递奇数个面(三角形)。
一些伪代码
Vector3d toOutside { point, pointOutside }; // !!! how do we know a point is outside ?!?
for_each(triangleList, [&count, =toOutside](Triangle& triangle) {
if (Intersect(triangle, toOutside) // some fussiness with edges and triangle points.
++count;
}
if (count %2 == 1)
isInside = true;
else
isOutside = false;
在多面体外找到一个点,找到最高的x,y,z并向它们添加1.0。
Pseudo prof [ToDo:链接到更严格的教授的文章]
简单的情况是一个盒子,如果我们在一个盒子里面,如果我们按照toOutside向量,将会有一个交叉点。
如果我们在多面体内部,那么如果我们通过一个三角形,我们在外面,如果我们再经过2个三角形(进出),我们仍然可以告诉我们在里面。如果我们实际上在多面体之外,那么当跟随toOutside向量时,我们将通过偶数个三角形(或零)。
geometrictools处的C ++实现在数学 - >包含 - >点多面体 - > 3D中查看.h和.inl文件。
可能会有一些更优化的测试使用外部的法向量 此外,如果您需要测试多个对象,请考虑为每个对象设置一个用于剔除的边界框,因为矢量测试可能很昂贵。