【发布时间】:2014-06-12 09:27:02
【问题描述】:
我正在寻找一种有效的算法来确定一个长方体是完全在内部还是完全在外部,或者(不在内部和外部)一个通用的(凹面或凸面)多面体。多面体由 3D 点列表和小平面列表定义。每个小平面由纵坐标的轮廓点的子集定义,例如实体外的右侧法线点。
有什么建议吗?
谢谢
【问题讨论】:
标签: performance algorithm computational-geometry
我正在寻找一种有效的算法来确定一个长方体是完全在内部还是完全在外部,或者(不在内部和外部)一个通用的(凹面或凸面)多面体。多面体由 3D 点列表和小平面列表定义。每个小平面由纵坐标的轮廓点的子集定义,例如实体外的右侧法线点。
有什么建议吗?
谢谢
【问题讨论】:
标签: performance algorithm computational-geometry
对于一个多面体(长方体)完全在另一个多面体内部或完全在另一个多面体外部,它们的面之间应该没有相交。
检查是否有任何多面体面与任何长方体面相交。如果存在交叉点,则长方体部分位于内部。如果没有相交,检查一个长方体角点是inside polyhedron。如果角点在内部,则长方体完全在内部,如果不是,则长方体完全在外部。
【讨论】:
我的建议:实现多面体的切割算法。我的意思是用一个平面把一个多面体一分为二。
对于每个顶点,您可以计算到平面的代数距离。
依次考虑多面体的每个面,并用平面切割它。如果所有顶点都在平面的同一侧,则没有相交。您将保持原样或完全丢弃它。如果两边都有顶点,那么您将保持一些边完整,分割那些交叉的边并丢弃其他边。您将通过以正确的顺序连接顶点来重建切割面(在沿着相交线对穿孔点进行排序之后)。
完成此操作后,您将有一组新的面形成一个多面体,但缺少一个覆盖面。您将通过连接穿孔点来重建它,使用与闭合面相同的边。 (实际上,您可能最终会形成多个面,因为横截面可以由多个部分组成。)
当您能够用平面切割多面体时,您就能够找到它与任意凸多面体(例如立方体)的交点。
我刚才描述的是对Sutherland–Hodgman clipping algorithm 3D 的概括。
当多面体顶点都在某些平面的相同大小上时,有一个很好的例子。你可以通过做这个测试来开始工作。但对于其他情况,没有真正的捷径。
您可以在体积、面和边缘上实施边界框测试,希望能够加快速度,但是您进行的此类测试越多,效率就越低。
与凸多面体相交的情况更容易实现,因为所有面都保持凸面并且拓扑变化更简单。
【讨论】:
对每个 facet-pair 检查相交的蛮力检查的可能改进: (我的假设是 facet-facet 检查非常昂贵)
*此步骤需要捕获您完全位于两个表面之间的情况。
【讨论】: