【发布时间】:2021-11-26 08:36:49
【问题描述】:
我需要一种方法来合并矩形对象数组(具有x,y,w,h 属性的对象),仅当它们相交时。比如:
merge([{x:0, y:0, w:5, h:5}, {x:1, y:1, w:5, h:5}])
将返回:[{x:0, y:0, w:6, h:6}]
merge([{x:0, y:0, w:1, h:1}, {x:5, y:5, w:1, h:1}])
将返回:[{x:0, y:0, w:1, h:1}, {x:5, y:5, w:1, h:1}]
merge([{x:0, y:0, w:5, h:5}, {x:1, y:1, w:5, h:5}, {x:15, y:15, w:1, h:1}])
将返回:[{x:0, y:0, w:6, h:6}, {x:15, y:15, w:1, h:1}]
如果两个矩形相交,则应以最小边界矩形代替这两个矩形。合并后需要再次检查列表,以防新的 MBR 导致与其他矩形相交。对于我的生活,我无法弄清楚。
【问题讨论】:
-
这一点都不清楚。您正在传递相同的矩形。如果传递两个相交的不同矩形会发生什么?例如
{x:0, y:0, w:2, h:2}, {x:1, y:1, w:2, h:2}要最小包围矩形,交叉点包含的最大矩形,第一个矩形,第二个矩形吗? -
在这个例子中,两个对象是相同的,因此实际上不需要合并任何东西。你的要求是什么?对象 b 是否应该覆盖对象 a 中的属性?反之亦然?还是应该是二进制 AND、OR、XOR ?
-
我是个白痴。更新。它应该通过创建一个最小边界矩形来合并它。
-
好的,好多了,但还是有一些问题。您正在采用最小的封闭矩形。按顺序执行此操作可能会创建以前没有的交叉点。那你想发生什么?像
{x:0, y:0, w:10, h:10}, {x:9, y:9, w: 11, h:11}, {x:11, y:0, h:2, w:20}这样的东西。最后一个应该被视为与前两个相交吗?它不是开始的,但是在将它们合并到封闭的矩形中之后,它会与它相交。 -
OK 将清除它。它将需要再次解析列表以查看是否创建了任何新的交叉点并因此合并它们。
标签: javascript algorithm merge intersection