Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何模拟从矩形交点开始的矩形并集_Algorithm_Graphics_Geometry - Fatal编程技术网

Algorithm 如何模拟从矩形交点开始的矩形并集

Algorithm 如何模拟从矩形交点开始的矩形并集,algorithm,graphics,geometry,Algorithm,Graphics,Geometry,给定矩形_A相交矩形_B,其定义的并集是包含两个矩形的矩形,我想确定添加到矩形_A以创建矩形_A和矩形_B并集所需的(不重叠)矩形的坐标: 注意:这只是矩形解决方案集的一种配置。上面的白色矩形可以进行不同的配置,只要它们不重叠 矩形相交的每种情况都有简单的算法吗?我第一次传球就错过了一些角球。显然不是我的城堡 为什么??在UI中平移时,我只想(I)更新画布的新部分(ii)跟踪绘制为矩形的内容(矩形a和矩形B的并集)。假设我们用一对x,y坐标对表示矩形:x1,y1表示左上角,x2,y2表示左下角。

给定矩形_A相交矩形_B,其定义的并集是包含两个矩形的矩形,我想确定添加到矩形_A以创建矩形_A和矩形_B并集所需的(不重叠)矩形的坐标:

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

矩形相交的每种情况都有简单的算法吗?我第一次传球就错过了一些角球。显然不是我的城堡


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

假设我们用一对x,y坐标对表示矩形:x1,y1表示左上角,x2,y2表示左下角。我们还假设y坐标向下增加,x坐标从左向右增加

现在,假设A和B的并集形成的矩形(根据你对并集的定义)是U

所以

现在我们有了更大的矩形U,我们可以用它来计算必须添加到A(左/上矩形)以使其成为U的更小的右矩形和下矩形。让我们称它们为Rt和Bot

(这次我假设A是左上角的矩形,如果它不是交换A和B。也假设布局与图片相似。如果不是这样,你可以很容易地调整)


很抱歉,我不能给出有效的解决方案,但是

一开始,我会尝试为你能想象到的每一个不同的情况画出这样漂亮的图像。在很多情况下,你需要两个以上的矩形,或者只有一个,对吗

我认为获取包含其他内容的rect很简单,但此时我想不出如何继续


编辑:现在我正在考虑洪水填充算法,只需填充你的大矩形。但我可以想象,这有两个问题:如何使用泛洪填充输出从中生成矩形?这是正确的方法,还是有线性代数解决方案或其他什么?

如果您不关心最小化返回的矩形数量,您可以将思考过程简化为始终返回不超过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,在最坏情况下(当A包含在B中时)将返回8。

您总是一次正好有两个矩形吗?是,始终只有两个原始矩形:A和B。这两个矩形可以是完全不同的大小。我发现在最后一张图像中这一点并不清楚,哪些规则决定了结果矩形的大小?你的3。图像,将其切换为白色矩形是否也有效?还是“不重叠”是唯一的限制?它们是否总是相交?一个在另一个里面会发生吗?矩形B的x范围是否完全包含在A的x范围内(即B位于A的“下方”,但宽度较小)?类似地,B是否可以位于A的右侧(相交,但不在上方或下方延伸),但高度较小?您是否需要提供尽可能少的矩形数的解决方案?如果不是的话,一个总是返回8个(可能是零面积)矩形的解决方案是微不足道的。我很确定这只会覆盖给定的问题(在图像中),但在很多情况下,您需要2个以上的矩形,或者只需要1个添加矩形。问题仍然是如何在所有情况下找到REC,硬编码在这里肯定不是一个好方法。@InsertNickHere:正如我在回答中所写的,我假设布局是上半年图表中显示的布局。只有当B比A大并且实际上覆盖A并在所有边上延伸时,才需要多于2个。在这种情况下,U=B,简单地从中推导出额外的矩形。如果需要的额外矩形少于2个,我的方法将返回面积为0的矩形。检查一下,没错!关于A和B如何相交的讨论似乎无关紧要。您始终可以将1,2,3合并到一个矩形中,将6,7,8合并到另一个矩形中,以获得不超过4个矩形(如果A完全位于外矩形中,这将提供最佳效果)。如果A接触其中一条边,它也会给出2或3的最佳值。+1这种技术相对容易实现,它处理矩形A,不管它与B的关系在哪里。考虑到并集的工作方式,你应该始终有3-5个可以忽略的矩形(它们的面积为零)。在剩下的矩形中,合并相邻的矩形并减少需要处理的多边形数量应该是相对简单的。
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
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