function drawKDTree(t, options = {}) {
let { size = 400, margin = 10 } = options;
let f = (x) =>
margin + ((x - range.min) / (range.max - range.min)) * (size - margin * 2);
let [viewmin, viewsz] = [
range.min - margin,
range.max - range.min + margin * 2
];
let svg = htl.svg`<svg width=${size} height=${size} >`;
svg.append(
htl.svg`<rect x=${f(range.min)} y=${f(range.min)} width=${
f(range.max) - f(range.min)
} height=${f(range.max) - f(range.min)} stroke=black fill=none >`
);
function draw(t, min, max) {
if (t.root) {
let { point, cutDim, left, right } = t.root;
if (cutDim == 0) {
svg.append(
htl.svg`<line x1=${f(point[0])} x2=${f(point[0])} y1=${f(
min[1]
)} y2=${f(max[1])} stroke=black >`
);
draw(left, min, [point[0], max[1]]);
draw(right, [point[0], min[1]], max);
} else {
svg.append(
htl.svg`<line x1=${f(min[0])} x2=${f(max[0])} y1=${f(
point[1]
)} y2=${f(point[1])} stroke=black >`
);
draw(left, min, [max[0], point[1]]);
draw(right, [min[0], point[1]], max);
}
svg.append(
htl.svg`<circle cx=${f(point[0])} cy=${f(point[1])} r=4 fill=blue >`
);
svg.append(
htl.svg`<text x=${f(point[0])} y=${
f(point[1]) - 8
} text-anchor=middle stroke=white stroke-width=0.5 fill=black style="font:bold 12px sans-serif;">${
point[0]
},${point[1]}</text>`
);
}
}
draw(t, [range.min, range.min], [range.max, range.max]);
return svg;
}