【问题标题】:Algorithm to convert vertices of a triangular strip to polygon将三角形带的顶点转换为多边形的算法
【发布时间】:2011-04-01 16:37:13
【问题描述】:

我有一个顶点数组,表示三角形条带。 我需要将其转换为多边形。 有很多解决方案可以做相反的事情,但我没有找到解决上述问题的方法。 或者它可能太容易了,我只是看不到它。 请帮忙。

OpenGL=兼容,见 http://en.wikipedia.org/wiki/Triangle_strip

示例: 对于这个地带http://en.wikipedia.org/wiki/File:Triangle_Strip_Small.png 我需要输出 A B D F E C 或 A C E F D B

【问题讨论】:

  • “三角带”是什么意思?它是由三角形构成的任意形状吗?或者更具体的东西?
  • 这是一个“三角形带”,而不是“三角形带”。 tristrip 是一种数据格式,它指定仅使用 nTriangles + 2 个顶点的三角形列表,因为第一个三角形之后的每个三角形都使用前一个三角形的最后两个顶点。

标签: algorithm opengl polygon triangulation


【解决方案1】:

如果你的形状结构特别简单,可能会有捷径,但总的来说我认为你想做以下事情

  • 从三角形列表中创建顶点和边列表。这涉及检测共享点(希望它们是完全匹配的,因此您可以通过散列而不是需要某种模糊搜索来找到它们)和共享线(这很容易——只是不要在同一对共享顶点之间绘制两条边) .
  • 找到最左上角的点。
  • 找到尽可能左上角且逆时针方向移动的边。
  • 走到下一个顶点。
  • 尽可能找到与前一条边重叠的下一条边。
  • 继续前进,直到再次到达最左上角。

【讨论】:

    【解决方案2】:

    我相信以下应该可行:

    遍历顶点列表。将第一个点添加到多边形。将第二个点压入堆栈。将第三个点添加到多边形。继续在堆栈上的推入点之间交替并将它们添加到多边形,直到到达列表的末尾。当您到达列表的末尾时,弹出堆栈的点并将它们添加到多边形中。

    【讨论】:

    • @belisarius:如果这就是您的意思,它不会尝试“简化”多边形 - 即,它将创建一个与三角形带的轮廓完全匹配的多边形。如果(例如)你已经将一个表面镶嵌成一个长三角形带,它会绕很多圈,它会产生一个以完全相同的方式绕圈的多边形。至少如果您使用的是 3 维,那么您也无能为力——内部点通常具有需要保留的不同 Z 值。
    • 是的。我认为这是OP的意图。也许我错了。 Tnx。
    • 为了简化多边形,统一相等顶点的名称,然后遍历你的循环列表,将模式 ABA 替换为 A,直到无法再替换为止。
    • @belisarius - 三角带上没有内部点。
    • @dash-tom-bang 是的,我在发表评论后很久就明白了。谢谢。
    【解决方案3】:

    我假设你的三角形条总是以相同的方式连接(我相信这对于 OpenGL 来说是正确的)。

    • “底部”顶点总是两个 分开:A,C,E,...
    • “顶” 顶点总是分开两个:B,D, F,...

    获取“底部”列表并附加“顶部”列表的反面。 (以ACEFDB为例)


    或者,更直接地,使用从零开始的索引而不是字母:

    // do "bottom"
    for ( i = 0; i < N; i += 2 )
      addVertex( i )
    
    // do "top"
    largestOddNumberLessThanN = N % 2 == 0 ? N - 1 : N - 2;
    for ( i = largestOddNumberLessThanN; i >= 0; i -= 2 )
      addVertex( i )
    

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 2011-03-29
      • 2011-11-11
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 2014-07-06
      相关资源
      最近更新 更多