Performance 一般多面体内的长方体

Performance 一般多面体内的长方体,performance,algorithm,computational-geometry,Performance,Algorithm,Computational Geometry,我正在寻找一种有效的算法来确定长方体是完全在内部还是完全在外部,或者(不是在内部也不是在外部)是一个通用的(凹或凸)多面体。多面体由三维点列表和面列表定义。每个面由坐标轮廓点的子集定义,例如,实体外部的右侧法线点 有什么建议吗 谢谢对于一个多面体(长方体)完全位于另一个多面体的内部或外部,这两个面之间应该没有交点 检查任何多面体面是否与任何长方体面相交。若有交点,则长方体部分位于内侧。如果没有交点,检查是否有一个长方体角点。如果角点在内侧,则长方体完全在内侧,如果不在外侧,则长方体完全在外侧。与

我正在寻找一种有效的算法来确定长方体是完全在内部还是完全在外部,或者(不是在内部也不是在外部)是一个通用的(凹或凸)多面体。多面体由三维点列表和面列表定义。每个面由坐标轮廓点的子集定义,例如,实体外部的右侧法线点

有什么建议吗

谢谢

对于一个多面体(长方体)完全位于另一个多面体的内部或外部,这两个面之间应该没有交点


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

与强力检查每个面对的交点相比,可能会有改进: (我的假设是面检查非常昂贵)

  • 首先计算非凸多面体的凸包络
  • 通过内部检查顶点来检查是否在凸面封套中(相对便宜)
  • 对非凸多面体中的所有顶点执行内部性检查*
  • 如果所有顶点都完全位于非凸多边形的内部或外部,则必须进行镶嵌面相交检查,但仅限于不属于凸封套的镶嵌面

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

我的建议:实现多面体的切割算法。我的意思是用平面把多面体一分为二

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

依次考虑多面体的每个面,并用平面切割它。如果所有顶点位于平面的同一侧,则不存在交点。您将保留该面,或将其完全丢弃。如果两侧都有顶点,则将保持某些边的完整性,分割交叉的边并丢弃其他边。您将通过按正确顺序连接顶点(在沿相交线对穿透点进行排序后)来重建切割面

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

如果能够用平面切割多面体,则可以找到其与任意凸多面体(如立方体)的交点

我刚才描述的是对3D的一个概括

当多面体顶点都位于某些平面的相同大小时,这是一个令人高兴的情况。你可以通过做这个测试来开始这项工作。但对于其他情况,没有真正的捷径

您可以在体积、面和边上实施边界框测试,希望加快速度,但这样的测试越多,效率就越低


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

你认为,在某种程度上,我可以利用第一个多面体是长方体这一事实吗?也许在面相交处,长方体是凸的。它可以很容易地消除多面体面来测试相交。取一个长方体面,为每个多面体点找出该面的哪一侧。在外部有所有点的多面体面不与长方体相交。若整个多面体面位于长方体面的内侧,则它不会和该面相交。可以对所有长方体面执行此操作。此外,如果长方体是平行六面体,则对于两个相对的长方体面,可以更快地执行此检查。