{
const svg = d3.create("svg")
.attr("width", 300)
.attr("height", 300);
const rows = 7;
const cols = 7;
const r = 15;
const row_spacing = 7;
const hex_spacing = 4;
const dx = Math.cos(Math.PI / 6) * r * 2 + hex_spacing;
const dy = r * 1.5 + row_spacing;
const strokeMin = 0.5;
const strokeMax = 3;
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;
return `${x1},${y1} ${x2},${y2} ${x3},${y3} ${x4},${y4} ${x5},${y5} ${x6},${y6}`;
}
const gridGroup = svg.append("g")
.attr("transform", "translate(50, 20)");
for (let row = 0; row < rows; row++) {
const strokeWidth = strokeMin + (strokeMax - strokeMin) * (row / (rows - 1));
const y = row * dy;
for (let col = 0; col < cols; col++) {
const xOffset = (row % 2 === 0) ? 0 : dx / 2;
const x = col * dx + xOffset;
gridGroup.append("polygon")
.attr("points", hexagon(x, y, r))
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", strokeWidth);
}
}
return svg.node();
}