我正在寻找一种算法来获取由一组非重叠矩形创建的图形的轮廓。该图可以是任何形状,但它是简单连接的,即不包含任何孔。
我需要了解如何编写这样的函数:
IEnumerable<Point> GetContour( IEnumerable<Rect> rects )
算法的时间复杂度并不重要,只需要在合理的时间内执行。
答案 0 :(得分:2)
我可能会在两次传球中这样做。第一个将矩形转换为点的集合(按顺序排列),包括另一个矩形的角是沿边缘的点的点。这样你最终得到一个点图,你可以很容易地检测哪些点在哪个矩形之间共享。
这样,只需搜索你的图表,找到没有共享rects的第一个点,并沿着最多没有共享rects的点开始行走路径,或者在前一个点没有共享rects的情况下开始两个共享rects,直到你回到起点。
您需要为路线保留一个堆叠,以及先前探索过的点的地图。
我最近才这样做(虽然它不仅限于rects,我已经完成了第一次传球)并且它运作得非常好。我看到它能够在一秒钟内计算出一个大约30个点的路径,而不是一个int,所以性能似乎相当不错,尽管那是在C ++中。
答案 1 :(得分:1)
这似乎是凹壳问题的特定情况。许多算法确实存在以解决相反的凸壳问题:
这些是最简单的,至少还有3个,但它们只是优化性能,这不是您的主要目标之一。
我认为 Jarvis March 可以很容易地适应你的情况,你只有矩形。想想这样一个事实:在每个段落中,这个算法通常会在你正在计算的船体的最后2个点的线右边的第一个点上进行,所以有了更好的选择规则,你可以在特定的情况下使它适应凹陷矩形。