包含一组点的多边形

Posted

技术标签:

【中文标题】包含一组点的多边形【英文标题】:Polygon enclosing a set of points 【发布时间】:2010-10-24 03:43:43 【问题描述】:

我有一组点 S(2D:由 x 和 y 定义),我想找到 P,最小的(意思是:点数最少的)多边形包围该组的所有点,P 是S 的有序子集。

是否有任何已知的算法来计算这个? (我在这个领域缺乏文化令人惊讶......)

感谢您的帮助

【问题讨论】:

嗨,我需要在我的应用程序中实现相同的功能。你能和我分享一下算法吗? 我使用了 QuickHull。参考这里:en.wikipedia.org/wiki/Quickhull 【参考方案1】:

有很多算法可以解决这个问题。它被称为“minimum bounding box”。您也可以通过搜索“convex hull”找到解决方案,尤其是here。

一种方法是找到最左边的点,然后重复搜索所有其他点都位于线 p(n-1)p(n) 右侧的点。

【讨论】:

谢谢,这正是我想要的。通过在 google 上输入“jarvis march java”或“quick hull java”,我什至找到了 java 的实现。 “最小边界框”是……一个框。不是通用多边形。其他链接可能很好。 不确定“最小边界框”与它有什么关系,考虑到 P 必须是 S 的子集。【参考方案2】:

这是一个简单的解决方案...

从任意三个点开始组成一个三角形。使用以下操作将每个附加点添加到多边形:

将边分成两条连续的路径,在一条路径中,每条边的线将要添加的点与多边形的其余部分分开(我们称之为“分离路径”),在另一条路径中,线每条边的点都与多边形在同一侧。

(注意:只要你的形状保持凸面,这是必须的,这两条路径将是连续的并形成整个形状)

如果分隔路径没有边,则该点在多边形内部,应忽略,否则,从多边形中删除分隔路径。将其替换为两段,将分隔路径的每个端点连接到新点。

哒哒! :)

【讨论】:

【参考方案3】:

你可能是说你想要最小的区域,也就是凸包。

如果你真的想要最少的,你可以只用超大顶点位置制作一个三角形,这样你的所有点都被包围了。

【讨论】:

大三角形中的点 P 不是 S 的子集,这是要求之一。 @DanielDaranas 如何获取这个超大三角形的顶点? 凸包不是包含每个点的最小多边形。有非凸多边形(例如星形)可以包含每个点并且仍然小于凸包。它们的周长比凸包长,但面积更小。【参考方案4】:

这里有一个关于凸包算法的好资源:The Convex Hull of a 2D Point Set or Polygon (by Dan Sunday)

【讨论】:

URL 不起作用 :-( 算法的名称应该足以找到 c 的解决方案。

以上是关于包含一组点的多边形的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 在一组点上绘制多边形(部分向内弯曲)边缘?

python+opencv2快速找出一组点包围的区域中的所有点

将点列表排序为多边形

地图上绘制多边形

计算给定(x,y)坐标的多边形面积

如何在Scatter Series谷歌图表上绘制自定义多边形?