获取矩形集的轮廓

时间:2010-02-18 15:59:08

标签: c# algorithm geometry

我正在寻找一种算法来获取由一组非重叠矩形创建的图形的轮廓。该图可以是任何形状,但它是简单连接的,即不包含任何孔。

我需要了解如何编写这样的函数:

IEnumerable<Point> GetContour( IEnumerable<Rect> rects )

算法的时间复杂度并不重要,只需要在合理的时间内执行。

2 个答案:

答案 0 :(得分:2)

我可能会在两次传球中这样做。第一个将矩形转换为点的集合(按顺序排列),包括另一个矩形的角是沿边缘的点的点。这样你最终得到一个点图,你可以很容易地检测哪些点在哪个矩形之间共享。

这样,只需搜索你的图表,找到没有共享rects的第一个点,并沿着最多没有共享rects的点开始行走路径,或者在前一个点没有共享rects的情况下开始两个共享rects,直到你回到起点。

您需要为路线保留一个堆叠,以及先前探索过的点的地图。

我最近才这样做(虽然它不仅限于rects,我已经完成了第一次传球)并且它运作得非常好。我看到它能够在一秒钟内计算出一个大约30个点的路径,而不是一个int,所以性能似乎相当不错,尽管那是在C ++中。

答案 1 :(得分:1)

这似乎是凹壳问题的特定情况。许多算法确实存在以解决相反的凸壳问题:

这些是最简单的,至少还有3个,但它们只是优化性能,这不是您的主要目标之一。

我认为 Jarvis March 可以很容易地适应你的情况,你只有矩形。想想这样一个事实:在每个段落中,这个算法通常会在你正在计算的船体的最后2个点的线右边的第一个点上进行,所以有了更好的选择规则,你可以在特定的情况下使它适应凹陷矩形。

在任何情况下,此处都有一个特定的凹壳算法:link,您也可以下载它们的API here(这应该是描述算法:link