【问题标题】:Triangulation of concave polygon using Triangle library使用三角形库对凹多边形进行三角剖分
【发布时间】:2016-09-28 15:25:58
【问题描述】:

我正在使用a C++ wrapper of the Triangle library,但无法摆脱多边形之外的三角形。

这是我想要的:


这就是我用三角形得到的:


(我故意没有填充三角形以表明多边形中有一些三角形)

我尝试使用光线投射算法(找到三角形边缘的中心并查看它是否在多边形中。如果至少有一个不存在则不要绘制这个三角形)但它非常慢出于我的目的(多边形每帧都会更新)。我错过了什么?我应该将哪些参数传递给 Triangle 以对凹多边形进行三角剖分?

如果无法用三角形做我想做的事,有人可以建议我一种快速绘制多边形的方法(我的程序使用 Qt Quick Scene Graph,而且我仅限于绘制三角形或凸多边形,因为 OpenGL 需要)?目前我想尝试使用 GLU 的镶嵌方法并使用模板缓冲区进行绘图。我也打算试试this library

【问题讨论】:

  • ear clipping 技术易于实现。
  • @j-p 我尝试了 [this library] (github.com/ivanfratric/polypartition) 的耳剪实现,但它没有产生正确的结果。我还担心剪耳的 O(n^2) 复杂性。
  • 你必须处理渲染完全通用的凹多边形吗?或者它总是像你在照片中展示的那样简单的形状?对于这种形状,直接生成三角几何是很容易的。
  • @RetoKoradi 直接生成几何图形是什么意思?

标签: c++ qt opengl graphics triangulation


【解决方案1】:

一般凹多边形的绘制至少有两种方式:

  1. 应用三角测量算法。这就是你一直在尝试的。应该有大量关于该主题的文献,以及您可以使用的源代码。

  2. 使用模板缓冲区。这在我对这些老问题的回答中得到了说明:Black out everything outside a polygonHow to force openGL to draw a non-convex filled polygon

但是,如果您只需要绘制示例中使用的半月形形状,而不是任意的凹多边形,那么这一切似乎比必要的复杂得多。您可以轻松构建一个三角形条带来表示此形状。

你当前的半月可能是用一个看起来像这样的顶点序列渲染的,它按照(凹)多边形所需的顺序定义了顶点:

0                                              9
  17                                        10
  1   16                                11   8
            15                    12
      2             14    13             7

            3                      6
                    4      5

您可以直接使用基本类型GL_TRIANGLE_STRIP 渲染此形状,方法是对顶点进行不同的排序,以便底部弧的顶点与顶部弧的顶点交替:

0                                             17
   2                                        16
  1    4                                14   15
             6                    12
      3              8    10             13

            5                      11
                    7      9

【讨论】:

    【解决方案2】:

    您可以尝试使用hit-test 的隐藏位图,但它只对输出起作用。我为等高线图做了这个:https://cntm.codeplex.com/。或者你可以尝试 alpha 形状。定义为去除超过 alpha 的边缘。

    【讨论】:

      【解决方案3】:

      GLU 细分解决了这个问题。它显示出高性能和良好的三角测量质量,并且在我的笔记本电脑以及 Android 平板电脑 Nexus 7 上运行良好。您可以找到 GLU libtess here 的独立版本。

      【讨论】:

        猜你喜欢
        • 2020-04-21
        • 2011-07-15
        • 2016-09-27
        • 1970-01-01
        • 2011-01-14
        • 2014-07-12
        • 2012-09-28
        • 2015-03-19
        • 2012-09-06
        相关资源
        最近更新 更多