{
const width = 256;
const height = 256;
const r = 14;
const rows = 7;
const cols = 7;
const hexHeight = 2.4 * r;
const hexWidth = Math.cos(Math.PI / 6) * 2.4 * r;
const vertSpacing = 0.75 * hexHeight;
const horizSpacing = hexWidth;
const svg = d3.create("svg")
.attr("width", width)
.attr("height", height);
const offsetX = (width - (cols - 1) * horizSpacing) / 2;
const offsetY = (height - (rows - 1) * vertSpacing) / 2;
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}`;
}
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
const x = offsetX + col * horizSpacing + (row % 2 === 1 ? horizSpacing / 2 : 0);
const y = offsetY + row * vertSpacing;
const strokeWidth = 0.4 + 0.2 * (col + row);
svg.append("polygon")
.attr("points", hexagon(x, y, r))
.attr("fill", "white")
.attr("stroke", "black")
.attr("stroke-width", strokeWidth);
}
}
return svg.node();
}