将多边形分成多个部分

时间:2019-10-11 07:44:29

标签: java opengl split polygon

在我的应用程序中,我使用OpenGL和大量数据。

我需要做的一件事情是我收到多个可以凸或凹的“简单”多边形。简单来说,我是指几何定义-没有孔和相交边缘的多边形。

我以点(顶点)的链接环的形式收到此政例,其中每个Vi都连接到Vi-1和Vi + 1点,而没有其他连接。最后一点也与第一个点相连,因此给了我们一个循环。

我现在要说的是我想出了多边形三角剖分法,它的工作原理就像一种魅力(我现在使用了削耳方法)。

但是,我需要为这些多边形(数百万个)建立LOTS。为了最大程度地减少工作量,我决定将自己的世界分成“块”,就像在《我的世界》中一样。然后,我使用视锥剔除和其他优化方法来渲染或丢弃/简化这些块和网格。

所以,我想做的是:如果我收到的多边形位于几个不同的块中,那么我想将其拆分为每个块的网格。基本上,我想创建在块边界上划分的多个多边形,然后对它们进行三角剖分并创建用于渲染的网格。

因此,我想要一个(或几个)轮廓,然后可以对其进行三角测量。

这是我的任务的照片:

enter image description here

我自己创建了一个算法分割算法,以为可以工作,但是我发现,只有在任何给定块的轮廓不破裂的情况下,它才有效,如您在示例中看到的(换句话说,如果只有任何给定块中的一个数字)。

我想问一下,是否有人知道该任务有什么好的算法?我可能会自己提出一些建议,但实践表明,几乎总是有一个更好,更简单的现成解决方案。如果有人可以给我一个有用的链接或文章(如果没有解决方案本身,那么我可以提供一些想法),我将非常感激。

2 个答案:

答案 0 :(得分:0)

这是编写某些可能有效的伪代码的黑暗之路。随意实施它,并在可行的情况下使用实际代码选择自己的答案。


首先,将您的顶点数组转换为从最后一个元素到第一个元素循环的双链表。或者,最好将其建模为无向图,因为一个点可能缺少邻居。

然后对每个象限应用以下算法,每次从完整的多边形开始。您可以通过选择位于象限以外与切线交叉的边至少1相邻的顶点来减小该多边形的大小。

// We need to keep track of the points that we insert on the cutting lines
let LIX = List of X-Cut-Line Intersection Points
let LIY = List of Y-Cut-Line Intersection Points

foreach Edge AB in Poly where A is inside the quadrant, B outside
    // Insert points into the polygon that intersect the X-Cut-Line
    if AB Intersects X-Cut-Line
        let Ix = Intersection Point
        Insert Ix between AB so that A<->B becomes A<->Ix
        B can be removed from the polygon now
        Add Ix to LIX
    // Insert points into the polygon that intersect the Y-Cut-Line
    if AB.Intersects Y-Cut-Line
        let Iy = Intersection Point
        Insert Iy between AB so that A<->B becomes A<->Iy
        B can be removed from the polygon now
        Add Iy to LIY

// Then iterate pairs of points along each cutting line to join them
sort LIX by X Ascending
while (LIX.Length > 0)
    let P0 = LIX[0]
    let P1 = LIX[1]
    Link P0 and P1
    Remove P0 and P1 from LIX

sort LIY by Y Ascending
while (LIY.Length > 0)
    let P0 = LIY[0]
    let P1 = LIY[1]
    Link P0 and P1
    Remove P0 and P1 from LIY

最后,您可以在生成的链接列表/图形中寻找循环,以查找新的多边形。从理论上讲,每个循环不应包含已检测到的其他循环中的点,因此它是一个单独的多边形。

答案 1 :(得分:0)

我现在不在工作,因为它是周末,所以我将在星期一尝试/测试。

但是,我目前想出的是一个非常简单的解决方案。

1)测试轮廓中的所有点。

2)如果点i和点i + 1不属于同一块(我可以轻松对其进行测试):

3)然后找到块边界与这两点所形成的线之间的交点。

4)将此新点添加到原始两个点之间的轮廓中。

5)当像这样测试多边形的每个边缘时-对其进行三角测量。

6)因为我们在块的边缘上有点-然后在三角剖分期间,三角形将完全适合块的边界

7)为每个三角形确定属于哪个块,并在THAT块中生成网格。

我不会详细介绍一些优化想法-例如,如果初始图形适合同一块,则不需要评估生成的三角形。