连接相邻的矩形
Connect Rectangles that are adjacent?
本文关键字:连接 更新时间:2023-09-26
我想连接Array中的矩形对象,它们并排(相邻)。例如:(结构:"{x:x-Postion,y:y-Postion,x1:width,y1:height}")
{x: 0, y: 0, x1: 3, y1: 2}, {x: 0, y: 2, x1: 3, y1: 2}
可以把(我想要的)放在一起:
{x: 0, y: 0, x1: 3, y1: 4}
到目前为止,我还找不到解决我问题的方法,所以我希望你能帮助我。这是我阵列的一部分,我想在那里找到这些并排的矩形,并将它们保存在一个新的阵列中:
[{x:0, y: 0, x1:3, y1:2},{x:0, y: 2, x1:3, y1:2},{x:0, y: 4, x1:3, y1:2},{x:0, y: 6, x1:3, y1:2},{x:0, y: 8, x1:3, y1:2},{x:0, y: 10, x1:3, y1:2},{x:0, y: 12, x1:3, y1:2},{x:0, y: 14, x1:3, y1:2},{x:0, y: 16, x1:3, y1:2},{x:0, y: 18, x1:3, y1:2},{x:0, y: 20, x1:3, y1:2},{x:0, y: 22, x1:3, y1:2},{x:0, y: 24, x1:3, y1:2},{x:0, y: 26, x1:3, y1:2},{x:0, y: 28, x1:3, y1:2},{x:0, y: 30, x1:3, y1:2}//[...]so on
这样就可以了。一开始我无法识别矩形是叠在一起的。我必须考虑各种情况。我相信,如果矩形的接触边大小相同,它会递归地搜索和合并矩形所在的位置。
var rects = [{x:0, y: 0, x1:3, y1:2},{x:0, y: 2, x1:3, y1:2},{x:0, y: 4, x1:3, y1:2},{x:0, y: 6, x1:3, y1:2},{x:0, y: 8, x1:3, y1:2},{x:0, y: 10, x1:3, y1:2},{x:0, y: 12, x1:3, y1:2},{x:0, y: 14, x1:3, y1:2},{x:0, y: 16, x1:3, y1:2},{x:0, y: 18, x1:3, y1:2},{x:0, y: 20, x1:3, y1:2},{x:0, y: 22, x1:3, y1:2},{x:0, y: 24, x1:3, y1:2},{x:0, y: 26, x1:3, y1:2},{x:0, y: 28, x1:3, y1:2},{x:0, y: 30, x1:3, y1:2}];
function rectsReduce(arr){
function mergeRects(r,sa,a,i){
function compare(r1,r2){
return r1.y == r2.y ? r1.x > r2.x ? r1.x - r2.x == r2.x1
: r2.x - r1.x == r1.x1
: r1.x == r2.x ? r1.y > r2.y ? r1.y - r2.y == r2.y1
: r2.y - r1.y == r1.y1
: false;
}
var fi = sa.findIndex(e => compare(r,e))+i+1,
r2 = ~fi ? a.splice(fi,1)[0] : void 0;
return !!r2 && { x : Math.min(r.x, r2.x),
y : Math.min(r.y, r2.y),
x1 : r.x == r2.x ? r.x1 : r.x1 + r2.x1,
y1 : r.y == r2.y ? r.y1 : r.y1 + r2.y1};
}
return arr.reduce((p,c,i,a) => { var mergedRect = {};
a.length > 1 && (mergedRect = mergeRects(c,p.slice(i+1),a,i),
!!mergedRect && (p[i] = mergedRect,
p = rectsReduce(p)));
return p},arr);
}
document.write("<pre>" + JSON.stringify(rectsReduce(rects)) + "</pre>");
O(n^2)解决方案如下:
foreach rect as rect1:
foreach rect as rect2:
// rect1 above rect2
if rect1.x == rect2.x && rect1.x1 + rect1.x == rect2.x1 + rect2.x && rect1.y1 + rect1.y == rect2.y:
outrect = {rect1.x, rect1.x1, rect1.y, rect2.y1+rect1.y1}
array.remove(rect1,rect2)
array.add(outrect)
// rect1 below rect2
else if rect1.x == rect2.x && rect1.x1 + rect1.x == rect2.x1 + rect2.x && rect1.y == rect2.y1 + rect2.y:
outrect = {rect1.x, rect1.x1 + rect1.x, rect2.y, rect2.y1+rect1.y1}
array.remove(rect1,rect2)
array.add(outrect)
// rect1 at right of rect2
else if rect1.y == rect2.y && rect1.y1 + rect1.y == rect2.y1 + rect2.y && rect1.x == rect2.x1 + rect2.x:
outrect = {rect2.x, rect1.x1 + rect2.x1, rect1.y, rect1.y1}
array.remove(rect1,rect2)
array.add(outrect)
// rect1 at left of rect2
else if rect1.y == rect2.y && rect1.y1 + rect1.y == rect2.y1 + rect2.y && rect2.x == rect1.x1 + rect1.x:
outrect = {rect1.x, rect1.x1 + rect2.x1, rect1.y, rect1.y1}
array.remove(rect1,rect2)
array.add(outrect)
(顺便说一句,这只是伪代码)
相关文章:
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 如何使用密码检测网络中的状态连接
- 如何处理node.js节点mongodb中的连接和查询队列
- Rails-JQueryUIAutcomplete和AJAX不工作,可以't连接到数据库
- Twilio-显示所有连接参与者的远程参与者视频
- 操作放置在画布上的元素之间的连接
- TypeError:_this.store.getState在使用来自Redux的连接时不是函数
- jQuery UI可排序-多连接列表拖动
- 如何使用offer/answer交换来自两个对等连接的流
- 在Qualtrics中,介绍如何动态连接两个滑块
- 使用优化器在慢速连接上加载main.js时需要js超时
- 如果连接类型为none,则Javascript Function Only警报
- GTK百老汇支持同时连接
- 在node.js中写入ECONNRESET错误和套接字连接检查
- 如何将所有JS文件连接到一个文件夹中
- 在cordova android应用程序中连接数据库
- Node.js上的WebSocket,并在所有连接的客户端之间共享消息
- 如何通过安全的https连接在javascript中使用基于soap xml的Web服务
- SignalR客户端启动连接时如何设置用户
- 我们如何在互联网断开连接或用户关闭选项卡/浏览器时调用注销servlet