【问题标题】:How do I triangulate a polygon with holes without extra points如何在没有额外点的情况下对带有孔的多边形进行三角剖分
【发布时间】:2021-05-13 03:02:45
【问题描述】:

我正在尝试对多个多边形进行三角剖分,以使三角形不会添加额外的点。为了保持问题简短,我将使用 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()

现在这会导致外圈和内圈都像这里显示 一样进行三角剖分,显然忽略了这个洞。但是,通过设置“qpa0.05”标志,我们可以使圆圈使用此处 中看到的孔。然而这样做会导致三角形被分割,添加许多不同的三角形,将 qpa 增加到更高的值确实会导致三角形的数量有所减少,但它们仍然存在。

请注意,我希望能够处理同一形状中的多个孔,并且这些形状最终可能是凹的。

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

【问题讨论】:

  • 请注意,我也愿意使用不同的库。
  • 您尝试过 GLU tesselator 吗?该 API 有点奇怪,因为它反映了 oldschool C,但它工作得很好并且非常健壮。看到这个stackoverflow.com/questions/38640395/…

标签: python opencv geometry triangulation


【解决方案1】:

您可以将孔(或多个孔)连接到外部周边,以便获得由单个点序列定义的单个“退化多边形”,该点序列连接所有点而没有自相交。

你进出同一个路段。如果您顺时针跟随外周边,则需要逆时针跟随孔周边,反之亦然。否则,它会自相交。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 2020-11-21
      • 2011-06-11
      • 1970-01-01
      • 2011-01-15
      • 2020-04-21
      • 2011-07-15
      • 2014-03-25
      • 2017-04-09
      相关资源
      最近更新 更多