通用多面体内的长方体

时间:2014-06-12 09:27:02

标签: performance algorithm computational-geometry

我正在寻找一种有效的算法来查找长方体是完全位于内部还是完全位于外部或(不在内部而非外部)的通用(凹面或凸面)多面体。多面体由3D点列表和构面列表定义。每个方面由等距轮廓点的子集定义,例如右侧法线点向外的实体。

有什么建议吗?

谢谢

3 个答案:

答案 0 :(得分:2)

如果一个多面体(长方体)完全在其他多面体的内部或完全在其他多面体之外,那么它们之间就不应该有交叉点。

检查任何多面体面是否与任何长方体面相交。如果有交叉点,则长方体部分位于内部。如果没有交叉点,请检查一个长方体角点inside polyhedron。如果角点在里面,则长方体完全在里面,如果不是长方体完全在外面。

答案 1 :(得分:1)

我的建议:为多面体实施切割算法。我的意思是通过平面将多面体分成两部分。

对于每个顶点,您可以计算到平面的代数距离。

依次考虑多面体的每个面并用平面切割它。如果所有顶点都在平面的同一侧,则没有交叉点。你会保持脸部或完全丢弃它。如果两边都有顶点,那么你将保持一些边缘不变,将那些边交叉并丢弃其他边。您将通过以正确的顺序连接顶点来重建切割面(在沿着交叉线对穿孔点进行排序之后)。

完成此操作后,您将有一组新的面形成一个多面体,缺少一个盖面。您将通过使用用于闭合面的相同边连接穿孔点来重建它。 (实际上,你最终可能会形成几个面,因为横截面可以由几个部分组成。)

当您能够使用平面切割多面体时,您可以找到与任意凸多面体(例如立方体)的交点。

我刚才描述的是Sutherland–Hodgman clipping algorithm的3D概括。

当多面体顶点与某些平面的大小相同时,有一种快乐的情况。您可以通过此测试开始工作。但对于其他情况,没有真正的捷径。

您可以对卷,面和边缘实施边界框测试,希望获得加速,但是您进行此类测试的次数越多,效率就越低。

与凸多面体交叉的情况更容易实现,因为所有面都保持凸面并且拓扑变化更简单。

答案 2 :(得分:0)

对于交叉点的每个方面对检查强力的可能改进: (我的推测是分面检查非常昂贵)

  • 首先计算非凸多面体的凸包络。
  • 通过内部检查顶点检查你是否处于凸包络(相对便宜)。
  • 对非凸多面体*
  • 中的所有顶点进行内部检查
  • 如果所有顶点完全在内部完全位于非凸多边形之外,则必须在面上执行facet-facet交叉检查不是凸包络的一部分。

*这一步需要抓住你完全在两个表面之间的情况。