是否存在一种算法来确定二维空间中的一组点是否形成一个封闭区域

Is there an algorithm for determining if a set of points in 2D space forms a closed region?

本文关键字:是否 一组 一个 区域 二维 算法 一种 存在 空间      更新时间:2023-10-16

我有一组点(x, y),我想知道它是否形成一个封闭区域(在矩形二维光栅内)。这似乎是一个简单的问题,但在谷歌上搜索了半个小时后,我找不到解决这个问题的算法。有已知的算法来解决这个问题吗?

用c++或c#(甚至伪代码)编写的例程将是理想的。

编辑:我在这里处理的具体问题是一个绘图程序,其中应用程序用户应该在感兴趣的区域周围绘制边界。我想警告用户,如果他们绘制的边界没有形成一个封闭区域

似乎你想知道一个给定的点集合是否包含一个封闭区域。幸运的是,有一个简单而灵活的答案:)

假设给定的点集是在白色背景上绘制的黑色像素集。简单地从已知的外部点(例如(0,0))开始执行黑色洪水填充。现在看看图像中是否还有白色像素。如果是,则原始绘制的像素包含至少1个封闭区域。

如果你曾经在一个粗糙的位图绘画程序中用鼠标画过任何东西,你就会知道小缺陷很容易形成——例如,如果你画一条自由形状的线,急剧转弯,并在不同的方向上继续这条线,可能是你不小心创造了一个1或2个白色像素的小气泡。幸运的是,这个算法可以很容易地考虑到这些:只计算洪水填充后剩余的白色像素的数量,只有当这个计数超过大于1的某个选择的阈值时才返回"YES"。(您可能希望使阈值与集合中的点数量成比例,以允许每个像素绘制给定数量的缺陷。)为了更好的控制,在洪水填充之后,您可以识别并删除所有低于某个固定"缺陷阈值"大小的白色像素岛。检测可以通过试探性地对图像中的每个像素进行洪水填充来完成,一旦超过阈值大小就停止(并取消)。

所有这些操作,包括检测和去除小缺陷,在图像中像素的数量上只需要线性的时间。洪水填充是一种简单而快速的算法,但如果你想要更快一点的速度,你可以只对给定像素集的边界框进行洪水填充,每边向外扩展1个像素。