我有一组点(x,y),如果它形成一个封闭区域(在矩形2D栅格内),我想知道它。这似乎是一个简单的问题,但经过半小时的谷歌搜索,我无法找到解决此问题的算法。是否有针对此问题的已知算法?
用C ++或C#(甚至伪代码)编写的例程是理想的。
编辑: 我在这里讨论的具体问题是绘图程序,其中应用程序用户应该在感兴趣的区域周围绘制边界。我想警告用户他们绘制的边界是否形成一个封闭区域。
答案 0 :(得分:3)
您似乎想知道给定的一组点是否包含一个封闭区域。幸运的是,这是一个简单而灵活的答案:)
让我们说你给出的点集是在白色背景上绘制的一组黑色像素。 只需从已知外部点(例如(0,0))开始执行黑色填充填充。现在查看图像中是否还有白色像素。如果是这样,那么最初绘制的像素至少包含一个封闭区域。
如果您在粗略的位图绘画程序中使用鼠标绘制了任何内容,您就会知道小缺陷很容易形成 - 例如如果您正在绘制一条自由形状线,急转弯并沿不同方向继续该线,则可能是您不小心创建了一个1或2个白色像素的小气泡。幸运的是,这个算法可以很容易地考虑到这些:只计算洪水填充后剩余的白色像素数,然后返回" YES"仅当此计数超过某个选定的阈值大于1.时(您可能希望使阈值与集合中的点数成比例,以允许每个像素绘制给定数量的缺陷。)对于更多的控制,在洪水之后 - 填充,您可以识别并删除低于某些固定"缺陷阈值的所有白色像素岛"尺寸。可以通过暂时尝试从图像中的每个像素进行泛光填充,并在超过阈值大小时停止(和撤消)来进行检测。
所有这些操作,包括检测和去除小缺陷,只需要图像中像素数的线性时间。洪水填充是一种简单而快速的算法,但是如果你想要更高的速度,你可以只填充给定像素集的边界框,每边向外扩展1个像素。