imagesSpiral = (parent, x0, y0, x1, y1) => {
const EAST = 0
const SOUTH = 1
const WEST = 2
const NORTH = 3
const aspectRatio = (x1-x0)/(y1-y0)
let nodes = [...parent.children]
let node = null
let k = (!parent.depth) ? nodes[0].data.k : 0
let [segW, segH, kH] = (!parent.depth) ? getSizes(k,x0,y0,x1,y1) : [(x1-x0)/2, (y1-y0)/2, 2]
let [innerX0, innerY0] = [segW, segH]
let [innerX1, innerY1] = (!parent.depth) ? [innerX0 + k * segW, innerY0 + (kH - 2) * segH] : [segW, segH]
let i = -1
let maxDirection = { 0: 1, 1: 1, 2: 1, 3: 1 }
if (!parent.depth) {
nodes[0].x0 = innerX0
nodes[0].y0 = innerY0
nodes[0].x1 = innerX1
nodes[0].y1 = innerY1
i = 0
maxDirection = { 0: k, 1: kH, 2: k, 3: kH }
}
let n = nodes.length
let direction = EAST
let segment = []
while (++i < n) {
node = nodes[i]
segment.push(node)
if (direction == EAST) {
if ( k > 0 ) {
node.x0 = (segment.length == 1) ? segW : segment[segment.length-2].x1
node.y0 = 0
node.x1 = node.x0 + segW
node.y1 = segH
} else {
node.x0 = (x1-x0)/2
node.y0 = 0
node.x1 = node.x0 + segW
node.y1 = (y1-y0)/2
}
} else if (direction == SOUTH) {
if (k > 0) {
node.x0 = innerX1
node.y0 = (segment.length == 1) ? 0 : segment[segment.length-2].y1
node.x1 = node.x0 + segW
node.y1 = node.y0 + segH
} else {
node.x0 = (x1-x0)/2
node.y0 = (y1-y0)/2
node.x1 = node.x0 + segW
node.y1 = node.y0 + segH
}
} else if (direction == WEST) {
if (k > 0) {
node.x0 = (segment.length == 1) ? innerX1 - segW : segment[segment.length-2].x0 - segW
node.y0 = y1 - y0 - segH
node.x1 = node.x0 + segW
node.y1 = node.y0 + segH
} else {
node.x0 = 0
node.y0 = (y1-y0)/2
node.x1 = (x1-x0)/2
node.y1 = node.y0 + segH
}
} else if (direction == NORTH) {
if (k > 0) {
node.x0 = 0
node.y0 = (segment.length == 1) ? innerY1 : segment[segment.length-2].y0 - segH
node.x1 = segW
node.y1 = node.y0 + segH
} else {
node.x0 = 0
node.y0 = 0
node.x1 = segW
node.y1 = segH
}
}
if (segment.length === maxDirection[direction]) {
direction = (direction + 1) % 4
segment.length = 0;
if (direction === EAST && i < nodes.length-1) {
const newK = nodes[i+1].data.k
const [newSegW, newSegH, newkH] = getSizes(newK,x0,y0,x1,y1)
segW = newSegW
segH = newSegH
kH = newkH
maxDirection = { 0: newK, 1: kH, 2: newK, 3: kH}
innerX0 = segW
innerY0 = segH
innerX1 = innerX0 + newK * segW
innerY1 = innerY0 + (kH - 2) * segH
const scaleX = d3.scaleLinear().domain([0, x1-x0]).range([segW, x1-x0-segW])
const scaleY = d3.scaleLinear().domain([0, y1-y0]).range([segH, y1-y0-segH])
for (let j=0; j<=i; j++) {
nodes[j].x0 = scaleX(nodes[j].x0)
nodes[j].y0 = scaleY(nodes[j].y0)
nodes[j].x1 = scaleX(nodes[j].x1)
nodes[j].y1 = scaleY(nodes[j].y1)
}
}
}
}
}