在一个非凸多边形中,给定一组大量的顶点,如何找到边缘?

10

我有一组顶点(称为A),我想找到所有边界顶点,使得这些边界顶点集合是该形状的轮廓。

A中许多顶点是冗余的,因为它们在形状内部,我想摆脱这些顶点。

我的问题类似于Best Algorithm to find the edges (polygon) of vertices,但我需要它适用于非凸多边形情况。

编辑: 澄清:下面的图像是一个凹多边形。这就是我所说的非凸性。如果我在它上面运行凸包算法,它将无法保留多边形的凹部(除非我弄错了)。

concave polygon

我有一组多边形内部和边界上的顶点:[[x1,y1],[x2,y2] ...],我想缩小该集合,使得顶点仅为形状的边界轮廓。


“非凸多边形情况下工作”是什么意思?您链接的问题包括输入顶点形成凹多边形的情况,因此我不明白您的问题有何不同。 - outis
你如何区分哪些顶点在多边形内部,哪些在边缘上? - Marius Gedminas
4个回答

5
这似乎是一个热门话题..这篇论文看起来是最好的。Duckham等人在2008年发表了“高效生成简单多边形描述平面点集形状”的文章,其中提出了一种算法。您可以通过此链接阅读完整论文。如果您想了解凸包的定义、算法和实际应用,请查看此问题的讨论。

0

您的描述有些模糊,但可能是在寻找构建一组点的凸包算法。简单来说,凸包是将橡皮筋绕在所有顶点周围得到的形状。
编写2D凸包算法并不是非常困难,也有一些库可以实现,比如qhull

(这个答案也在您链接的问题中提供,似乎是您问题的特殊情况)


1
凸包会排除一些点,因为它只追踪凸多边形。我在答案中添加了一张图片来澄清形状。 - tommy chheng
1
它会生效,但你怎么知道该将哪个边分割以放置这两个额外的边呢? - shoosh

0

这是一个可能被遗弃的老问题,但它让我思考。你不是在寻找凸包,而是想要保持多边形的形状,只是摆脱沿着线条的“边缘”之间的点。

解决方法可以是逐步通过相邻点并计算第一点和第二点的线性斜率,然后保存该斜率值,计算第二个点和第三个点的斜率,如果pt1-pt2的斜率等于pt2-pt3的斜率,则pt2在形成该线路中是多余的,因此可以被删除。继续循环直到回到pt1。

这将确保保持您的凹形状,但无关的额外点将被移除。


0

您要查找的术语是凸包

与凸包不同,覆盖给定点的凹多边形并不唯一,因此最简单形式的问题并没有像凸包那样被很好地定义。然而,有许多好的方法。

其中最简单的方法之一是使用礼品包装算法,但在每个步骤中只考虑当前顶点的k个最近邻点,这里的k是您要调整的超参数。如果k太高,则会得到凸包。如果k太低,则所得到的多边形具有许多凹度。


这是一些相关链接:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接