如何模拟以矩形交集开始的矩形联合

时间:2010-07-14 20:01:55

标签: algorithm graphics geometry

给定rectangle_A相交的rectangle_B,它有一个定义的并集,使得它是包含两个矩形的矩形,我想确定添加到rectangle_A以创建rectangle_A和rectangle_B的并集所需的(不重叠)矩形的坐标:

注意:这只是矩形解集的一种配置。上面的白色矩形可以配置不同,只要它们不重叠。

每个矩形交叉的情况都有简单的算法吗?我做了第一次传球,我错过了一些角落。显然不是我的强项。

为什么呢?在UI中进行平移时,我只想(i)更新画布的新部分(ii)跟踪绘制为矩形的内容(rectangle_A和rectangle_B的并集)。

3 个答案:

答案 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个以上的矩形,或者只需要一个,对吗?

我认为让含有其他人的矩形是微不足道的 - 但此时我想不出如何继续。 :)

编辑:此时我正在考虑填充填充算法,只需填写更大的矩形。但是我可以想象有两个问题:如何使用洪水填充输出从中生成反应?它会是正确的方法,还是有线性代数解决方案?