如何在没有额外点的情况下对带孔的多边形进行三角剖分

问题描述

我正在尝试对多个多边形进行三角剖分,以使三角形不会添加额外的点。为了使问题简短,我将使用 2 个圆圈,实际上这些圆圈是 opencv 轮廓,但是两者之间的转换非常复杂,圆圈也显示了问题。

所以我有以下代码based on the example),以便首先获取圆圈,然后使用 triangle project 对它们进行三角测量

import matplotlib.pyplot as plt
import numpy as np

import triangle as tr


def circle(N,R):
    i = np.arange(N)
    theta = i * 2 * np.pi / N
    pts = np.stack([np.cos(theta),np.sin(theta)],axis=1) * R
    seg = np.stack([i,i + 1],axis=1) % N
    return pts,seg


pts0,seg0 = circle(30,1.4)
pts1,seg1 = circle(16,0.6)
pts = np.vstack([pts0,pts1])
seg = np.vstack([seg0,seg1 + seg0.shape[0]])
print(pts)
print(seg)
A = dict(vertices=pts,segments=seg,holes=[[0,0]])
print(seg)
B = tr.triangulate(A) #note that the origin uses 'qpa0.05' here
tr.compare(plt,A,B)
plt.show()

在这会导致外圆和内圆都被三角化,就像这里显示

2 circles

一样,显然忽略了洞。但是,通过设置“qpa0.05”标志,我们可以使圆使用此处

enter image description here

中看到的孔。但是这样做会导致三角形分裂,添加许多不同的三角形,将 qpa 增加到更高的值确实会导致三角形的数量有所减少,但它们仍然存在。

请注意,我希望能够处理同一形状的多个孔,而这些形状最终可能会凹入。

有人知道如何在不添加额外三角形的情况下让三角测量使用这些孔吗?

解决方法

您可以将一个(或多个)洞连接到外周,这样您就可以得到一个由连接所有点而没有自相交的单点序列定义的“退化多边形”。

您通过同一路段进出。如果您顺时针遵循外周长,则需要逆时针遵循孔周长,反之亦然。否则,它会自相交。

,

我想通了 "qpa0.05" 应该是一个 'p',p 是孔中的代码因子,a 设置三角形的最大面积,这会导致添加额外的点。

B = tr.triangulate(A,'p')