寻找一种非“蛮力”算法来删除矩形集合的相交区域
-
25-10-2019 - |
题
我有一个n大小的矩形集合,其中大多数相互相交。我想删除交叉点,并将相交的矩形减少为较小的非相互作用矩形。
我可以轻松地强迫解决方案,但是我正在寻找有效的算法。
这是一个可视化:
原来的:
处理:
理想情况下,方法签名看起来像这样:
public static List<RectF> resolveIntersection(List<RectF> rects);
输出将更大或等于输入,其中输出可以解决上述视觉表示。
解决方案
这是我过去解决的问题。使用其中一个边的X或Y值对矩形进行排序的第一件事。假设您在Y方向上订购并使用顶部边缘。示例中最上方的矩形首先按顺序排序。对于每个矩形,您都知道其大小在y方向上。
现在,对于每个条目(将其称为当前条目,它对应于矩形),您可以通过列表向前搜索的排序列表中,直到您到达比当前条目 +相应的矩形大小的输入。 (称其为停止条目)
当前条目和此停止条目之间的分类列表中的任何条目将是潜在的交叉点。只需检查矩形X射线是否相交。
When choosing to sort in the x or y direction, it will be better to choose the dimension that is larger as this will imply fewer intersection on average so less checking.
这是一个例子。矩形定义为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进行排序
# y1 size
rectangle 1 0 4
rectangle 3 2 3
rectangle 4 3 4
rectangle 2 6 2
rectangle 5 9 6
因此,矩形1具有y1 + size = 0 + 4 = 4意味着它可能会相交矩形3(y1值= 3 <4)和矩形4(y1值= 3 <4),但不矩形2(y1值= 6>) 4)...不需要检查2之后列表中的任何矩形
矩形3具有y2 + size = 2 + 3 = 5,暗示它可能会与矩形4(y1值= 3 <5)相交,但不重现2(y1值= 6> 5)无需检查2之后列表中的任何矩形
矩形4具有y2 + size = 3 + 4 = 7意味着它可能会与矩形2(y1值= 6 <7)相交,但不重新出现5(y1值= 9> 7)
当然,使用大量矩形,您通常只需要检查可能对的一对以进行交叉即可。