如何判断给定点是否在STereoLithography(.stl)文件对象c ++中

时间:2014-10-19 21:43:40

标签: c++ matlab

我正在尝试确定一个点位于从STereoLithography(.stl)文件导入的多面体内。我想知道是否存在已解决此问题的C ++解决方案/库。

我希望避免炮击Matlab solution

1 个答案:

答案 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文件。

可能会有一些更优化的测试使用外部的法向量 此外,如果您需要测试多个对象,请考虑为每个对象设置一个用于剔除的边界框,因为矢量测试可能很昂贵。