我有一个包含n个Rect的集合,大部分相互交叉。我想要移除这些交叉部分,并将相交的Rect缩小为更小的不相交矩形。
我可以很容易地使用暴力方法解决,但我正在寻找一种高效的算法。
这里是一个示例图:
原始矩形:
处理后的结果:
理想情况下,该方法的签名应如下所示:
public static List<RectF> resolveIntersection(List<RectF> rects);
输出结果将大于或等于输入,其中输出结果解决了上述可视化表示。
我有一个包含n个Rect的集合,大部分相互交叉。我想要移除这些交叉部分,并将相交的Rect缩小为更小的不相交矩形。
我可以很容易地使用暴力方法解决,但我正在寻找一种高效的算法。
这里是一个示例图:
原始矩形:
处理后的结果:
理想情况下,该方法的签名应如下所示:
public static List<RectF> resolveIntersection(List<RectF> rects);
这是我过去解决的一个问题。首先,需要使用其中一条边的x或y值对矩形进行排序。假设您按y方向排序并使用顶部边缘,则您示例中最上面的矩形将首先按排序顺序排列。对于每个矩形,您知道它在y方向上的大小。
现在,针对排序后的列表中的每个条目(称其为当前条目,它对应一个矩形),向前搜索列表,直到找到一个大于当前条目+相应的矩形大小的条目(称其为停止条目)。
在当前条目和该停止条目之间的排序列表中的任何条目都将成为潜在的相交点。只需检查矩形的x范围是否相交即可。
在选择按x或y方向排序时,最好选择较大的维度,因为这将平均意味着更少的交点,从而减少检查次数。
以下是一个示例。矩形被定义为R(x1,x2,y1,y2),其中x1为左侧,x2为右侧,y1为顶部,y2为底部。
rectangle 1 (1,5,0,4)
rectangle 2 (7,9,6,8)
rectangle 3 (2,4,2,3)
rectangle 4 (3,6,3,7)
rectangle 5 (3,6,9,15)
# y1 size
rectangle 1 0 4
rectangle 3 2 3
rectangle 4 3 4
rectangle 2 6 2
rectangle 5 9 6