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

How can you tell if a given point is inside a STereoLithography (.stl) file object c++

本文关键字:文件 stl STereoLithography 对象 c++ 何判断 判断 是否      更新时间:2023-10-16

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

我希望避免对Matlab解决方案进行炮轰

这个问题的理论有点简单,当你从一个点到外面时,你必须通过奇数个面(三角形)。

一些伪码

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。

伪教授[ToDo:链接到具有更严格教授的文章]
简单的情况是一个盒子,如果我们在一个盒子里,如果我们遵循toOutside向量,就会有一个与边的交点。如果我们在一个多面体内部,那么如果我们穿过一个三角形,我们就在外部,如果我们再穿过两个三角形(向内和向外),我们仍然可以判断我们在内部。如果我们实际上在多面体之外,当遵循toOutside向量时,我们将通过偶数个三角形(或零)。

geometrictools的C++实现在数学->包容->多面体中的点->3D下查看.h和.inl文件。

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