【发布时间】:2020-06-04 14:15:36
【问题描述】:
我将以下对象堆叠在一维数组中:
var colors = ["#FF0000", "#00FF00", "#0000FF", "#FF00FF", "#00FFFF"];
var array1D = [
{ level: 1, x: 0, y: 0 },
{ level: 1, x: 0, y: 1 },
{ level: 1, x: 1, y: 0 },
{ level: 4, x: 8, y: 8 },
{ level: 4, x: 8, y: 9 },
{ level: 5, x: 18, y: 16 },
{ level: 5, x: 18, y: 17 },
{ level: 5, x: 19, y: 16 },
{ level: 5, x: 19, y: 17 },
{ level: 5, x: 18, y: 18 },
{ level: 5, x: 18, y: 19 },
{ level: 5, x: 19, y: 18 },
{ level: 5, x: 19, y: 19 },
{ level: 4, x: 8, y: 10 },
{ level: 4, x: 8, y: 11 },
{ level: 5, x: 18, y: 20 },
{ level: 5, x: 18, y: 21 },
{ level: 5, x: 19, y: 20 },
{ level: 5, x: 19, y: 21 },
{ level: 4, x: 9, y: 11 },
{ level: 5, x: 20, y: 16 },
{ level: 5, x: 20, y: 17 },
{ level: 5, x: 21, y: 16 },
{ level: 5, x: 21, y: 17 },
{ level: 5, x: 20, y: 18 },
{ level: 5, x: 20, y: 19 },
{ level: 5, x: 21, y: 18 },
{ level: 5, x: 21, y: 19 },
{ level: 4, x: 11, y: 8 },
{ level: 5, x: 22, y: 18 },
{ level: 5, x: 22, y: 19 },
{ level: 5, x: 23, y: 18 },
{ level: 5, x: 23, y: 19 },
{ level: 5, x: 20, y: 20 },
{ level: 5, x: 20, y: 21 },
{ level: 5, x: 21, y: 20 },
{ level: 5, x: 21, y: 21 },
{ level: 4, x: 10, y: 11 },
{ level: 5, x: 22, y: 20 },
{ level: 5, x: 22, y: 21 },
{ level: 5, x: 23, y: 20 },
{ level: 5, x: 23, y: 21 },
{ level: 4, x: 11, y: 11 },
{ level: 2, x: 2, y: 3 },
{ level: 2, x: 3, y: 2 },
{ level: 2, x: 3, y: 3 }
];
它基本上是一个四叉树结构,所以你不需要验证是否可以从中构建一棵树。
在视觉上它看起来像下面的插图:
viz 的代码很简单:
quad.sort(function(a_, b_){ return a_.level - b_.level; })
var canvas = document.createElement("canvas");
document.body.appendChild(canvas)
canvas.width = 512;
canvas.height = 512;
var ctx = canvas.getContext("2d");
quad.forEach(function(node_){
ctx.fillStyle = colors[node_.level - 1];
var w = 256;
for(var i = 0; i < node_.level; i++) { w /= 2; }
var x = 256;
for(var i = 0; i < node_.level; i++) { x /= 2; }
x *= node_.x;
var y = 256;
for(var i = 0; i < node_.level; i++) { y /= 2; }
y *= node_.y;
ctx.fillRect(x + 1, y + 1, w - 2, w - 2);
});
任务是以尽可能快的方式从这些节点中构建一棵树,以获得如下结果:
var result = [
{id: "0.1", children: null },
{id: "0.2", children: null },
{id: "0.3", children: null },
{id: "0.4", children: [
{ id: "0.1.1", children: [
...
] },
{ id: "0.1.2", children: [] },
{ id: "0.1.3", children: [] },
{ id: "0.1.4", children: [] },
] }
];
更新:
ID 是由这个逻辑生成的——左上角是 1,右上角是 2,左下角是 3,右下角是 4。
所以,即底部左边的绿色方块是 4.3,它右边的邻居是 4.4。第一个洋红色正方形是 4.1.1。
在初始一维数组级别中,x 和 y 值负责定位和缩放分区,因此您始终可以通过这些值获取其级别和父级。
我只需要使用这些级别、x 和 y 值将一维数组转换为二维树。
【问题讨论】:
-
我不明白你的问题,哪一个是你想要从一维数组转换为二维数组的实际数组结构,以及二维数组中的项目是什么样的?还有这个 ID
{id: "0.1", children: null }是从哪里来的?你需要给我们更多的自信和信息丰富的问题。 -
已更新此问题。
-
似乎是一个有趣的问题(我想解决它)。我之前没有听说过四叉树(i2.wp.com/static.notdot.net/uploads/quadtree.png)。我不完全理解您的图片是否或如何是有效的四叉树 - 您能解释一下吗?从我看到的所有示例中,也许它应该看起来更像这样 - i.stack.imgur.com/kDNAe.png? (即,在我看来,您总是必须先分成 4 个相等的区域,然后再继续递归执行此操作,还是我理解错误?)
-
你说得对,它不是经典的四叉树,但结构非常相似。
-
不过没关系,因为level,x和y决定了树上每个节点的位置。
标签: javascript arrays tree structure