【问题标题】:Algorithm to flatten a 3D triangle strip扁平化 3D 三角形带的算法
【发布时间】:2017-02-09 07:39:47
【问题描述】:

我有一个 3D 三角形带(见图)。三角形不在一个平面内。

我想展平三角形条带,使所有三角形都位于第一个三角形的平面内。

计划是围绕与第一个三角形的连接边旋转第二个三角形,使其与第一个三角形在同一平面内。然后我对其他三角形继续这个方法,直到它们都在平面上。

  1. 我正在寻找一种快速算法来做到这一点。
  2. 还有其他方法可以压平三角条吗?

【问题讨论】:

  • 我猜这个问题是分解你之前关于这个主题的有趣问题的一部分 (stackoverflow.com/questions/39691737/…)。如果是这样,我认为这是一个合理的想法,但不会导致最短路径。
  • 另外,在你解决这个问题之前,你需要找到合适的条带来展平。这也不容易。
  • @danh 感谢您的 cmets。是的,最后我需要最短路径。我查看了不同的书籍、论文和 stackoverflow 讨论。看起来这不是一件容易的事。然而,由于我可以将我的问题从一个完整的网格减少到一个带有几个三角形(小于 20 个)的三角形条带,我认为将条带弄平是一个解决方案。还是有更好的方法?
  • @danh 你认为它不会导致最短路径吗?这是为什么呢?
  • 是的,如果您已经知道最短路径带,那么将该带展平的最短 2D 路径(然后用原始旋转转换回来)对于最短测地线路径来说似乎是一个合理的想法。这也可以使用证明,但似乎非常合理。

标签: algorithm graphics 3d geometry computational-geometry


【解决方案1】:

最快的方法是 1) 计算第一个三角形定义的平面方程 2)将所有休息点投影到这个平面上

【讨论】:

  • 感谢您的回答。您能解释一下您将如何进行投影吗?
  • 我认为 OP 希望旋转,而不是投影网格。如果其中一个三角形的平面与第一个三角形成 90 度角,则投影将产生一条线段,而不是三角形
  • 我认为 danh 是对的。投影可能会产生不需要的结果。
【解决方案2】:

请记住,您一次只能移动一个点。由于每个三角形与前一个三角形共享两个点,因此只有远点需要移动,并且将围绕其他两个点创建的轴移动,直到它位于所需的平面上。重复这个过程直到完成。

【讨论】:

    【解决方案3】:

    如果您只是旋转每个三角形,则必须旋转所有下一个三角形以保持几何形状不变 - 这种缓慢的方式具有二次复杂性。

    您可以存储三角形顶点的相互位置并在平面上恢复它们​​。

    可能的方式(我认为顶点编号是顺序的):

    对于第 N 个点 C=P[N] 计算并存储 Len - 它投影到 AB 线的长度 (A=P[N-2], B=P[N-1])

       Len = VectorLength(VectorProduct(UnitAB, AC))
    

    以及该投影在该行的位置(作为参数 t)。

     t = DotProduct(AC, AB) / DotProduct(AB, AB)
    

    在平面上构建C'=P'[N],计算

    C' = A' + t * A'B'  + Len * VectorProduct(UnitPlaneNormal, UnitA'B')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      相关资源
      最近更新 更多