给定rectangle_A相交的rectangle_B,它有一个定义的并集,使得它是包含两个矩形的矩形,我想确定添加到rectangle_A以创建rectangle_A和rectangle_B的并集所需的(不重叠)矩形的坐标:
注意:这只是矩形解集的一种配置。上面的白色矩形可以配置不同,只要它们不重叠。
每个矩形交叉的情况都有简单的算法吗?我做了第一次传球,我错过了一些角落。显然不是我的强项。
为什么呢?在UI中进行平移时,我只想(i)更新画布的新部分(ii)跟踪绘制为矩形的内容(rectangle_A和rectangle_B的并集)。
答案 0 :(得分:5)
如果您不关心最小化返回的矩形数量,您可以将思维过程简化为总是返回不超过8个矩形的过程:
U
+----------+----+-------+
| | | |
| 1 | 2 | 3 |
+----------+----+-------+
| | | |
| 4 | A | 5 |
| | | |
+----------+----+-------+
| 6 | 7 | 8 |
+----------+----+-------+
U.x1 = min(A.x1,B.x1)
U.x2 = max(A.x2,B.x2)
U.y1 = min(A.y1,B.y1)
U.y2 = max(A.y2,B.y2)
R1.x1 = R4.x1 = R6.x1 = U.x1
R2.x1 = R7.x1 = R1.x2 = R4.x2 = R6.x2 = A.x1
R2.x2 = R7.x2 = R3.x1 = R5.x1 = R8.x1 = A.x2
R3.x2 = R5.x2 = R8.x2 = U.x2
R1.y1 = R2.y1 = R3.y1 = U.y1
R1.y2 = R2.y2 = R3.y2 = R4.y1 = R5.y1 = A.y1
R4.y2 = R5.y2 = R6.y1 = R7.y1 = R8.y1 = A.y2
R6.y2 = R7.y2 = R8.y2 = U.y2
如果您愿意,可以快速检查每个矩形以查看是否r.x1 == r.x2 || r.y1 == r.y2
(即它是否为零区域),如果是,则将其丢弃。在大多数情况下,超过一半的矩形可以通过这种方式抛出。
例如,在你的三个例子中,这个解决方案将返回3个,1个和5个矩形,并且在最好的情况下(当B包含在A中时)返回0,在最坏的情况下返回8(当包含A时在B)。
答案 1 :(得分:0)
假设我们用一对x,y坐标对表示矩形:左上角为x1,y1,左下角为x2,y2为左下角。我们还假设y坐标向下增加,x坐标从左向右增加。
现在,假设由A和B的并集形成的矩形(根据你的union的定义)是矩形是U.
所以,
U.x1=min(A.x1,B.x1), U.y1=min(A.y1,B.y2) --- top-left corner, take the lowest values
U.x2=max(A.x2,B.x2), U.y2=max(A.y2,B.y2) --- bottom-right corner, take the highest values
现在我们有了更大的矩形U,我们可以使用它来计算必须添加到A(左/顶部矩形)的较小的右和底部矩形,使其成为U.让我们称之为Rt和Bot。
(这次我假设A是左上角的矩形,如果它不是交换A和B.也假设布局与你的图片类似。如果不是这样的话,你可以很容易适应这一点。
Rt.x1=A.x2, Rt.y1=A.y1
Rt.x2=A.x2, Rt.y2=B.y2
Bot.x1=A.x1, Bot.y1=A.y2
Bot.x2=A.x2, Bot.y2=B.y2
答案 2 :(得分:0)
对不起,我无法提供有效的解决方案,但是......
首先,我会尝试为您可以想象的每种不同情况绘制这样漂亮的图像。会有很多情况,你需要2个以上的矩形,或者只需要一个,对吗?
我认为让含有其他人的矩形是微不足道的 - 但此时我想不出如何继续。 :)
编辑:此时我正在考虑填充填充算法,只需填写更大的矩形。但是我可以想象有两个问题:如何使用洪水填充输出从中生成反应?它会是正确的方法,还是有线性代数解决方案?