【问题标题】:Cuboid inside generic polyhedron通用多面体内的长方体
【发布时间】:2014-06-12 09:27:02
【问题描述】:

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

有什么建议吗?

谢谢

【问题讨论】:

    标签: performance algorithm computational-geometry


    【解决方案1】:

    对于一个多面体(长方体)完全在另一个多面体内部或完全在另一个多面体外部,它们的面之间应该没有相交。

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

    【讨论】:

    • 你认为,在某种程度上,我可以利用第一个多面体是长方体的事实吗?也许在方面相交算法中
    • 长方体是凸的。它可用于轻松消除多面体面以测试相交。取一个长方体面,对于每个多面体点,找出该面的哪一侧。所有点都在外面的多面体面不与长方体相交。如果整个多面体面位于长方体面的内侧,则它不会与该面相交。这可以对所有长方体面进行。此外,如果长方体是平行六面体,则可以更快地检查两个相对的长方体面。
    【解决方案2】:

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

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

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

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

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

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

    当多面体顶点都在某些平面的相同大小上时,有一个很好的例子。你可以通过做这个测试来开始工作。但对于其他情况,没有真正的捷径。

    您可以在体积、面和边缘上实施边界框测试,希望能够加快速度,但是您进行的此类测试越多,效率就越低。

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

    【讨论】:

      【解决方案3】:

      对每个 facet-pair 检查相交的蛮力检查的可能改进: (我的假设是 facet-facet 检查非常昂贵)

      • 首先计算非凸多面体的凸包络。
      • 通过内部检查顶点来检查您是否在凸包内(相对便宜)。
      • 对非凸多面体中的所有顶点进行内部检查*
      • 如果所有顶点完全在完全在非凸多边形之外,你必须做一个小平面交叉检查但是只在的小平面上不是凸包络的一部分。

      *此步骤需要捕获您完全位于两个表面之间的情况。

      【讨论】:

        猜你喜欢
        • 2012-07-21
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 2011-05-29
        • 1970-01-01
        • 2014-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多