{
const svg = d3.create("svg")
.attr("width", 512)
.attr("height", 512);
const rows = 10;
const cols = 8;
const radius = 20;
const spacingFactor = 1.2;
const dx = radius * Math.sqrt(3) * spacingFactor;
const dy = radius * 1.5 * spacingFactor;
function hexagon(x, y, r) {
var x1 = x;
var y1 = y - r;
var x2 = x + Math.cos(Math.PI / 6) * r;
var y2 = y - Math.sin(Math.PI / 6) * r;
var x3 = x + Math.cos(Math.PI / 6) * r;
var y3 = y + Math.sin(Math.PI / 6) * r;
var x4 = x;
var y4 = y + r;
var x5 = x - Math.cos(Math.PI / 6) * r;
var y5 = y + Math.sin(Math.PI / 6) * r;
var x6 = x - Math.cos(Math.PI / 6) * r;
var y6 = y - Math.sin(Math.PI / 6) * r;
var path = x1 + ',' + y1 + " " + x2 + ',' + y2 + " " + x3 + ',' + y3 + " " +
x4 + ',' + y4 + " " + x5 + ',' + y5 + " " + x6 + ',' + y6;
return path;
}
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
const offsetX = (row % 2) * (dx / 2);
const cx = col * dx + offsetX + 32;
const cy = row * dy + 32;
const strokeWidth = 0.5 + (row / (rows - 1)) * 3;
svg.append("polygon")
.attr("points", hexagon(cx, cy, radius))
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", strokeWidth);
}
}
return svg.node();
}