{
const numRows = 17;
const numTrianglesPerRow = 32;
const triangleWidth = 20;
const triangleHeight = Math.sqrt(3) / 2 * triangleWidth;
const horizontalSpacing = -6;
const verticalSpacing = 5;
const svgHeight = numRows * (triangleHeight + verticalSpacing) + 10;
const svgWidth = numTrianglesPerRow * (triangleWidth + horizontalSpacing) - horizontalSpacing - 15;
const svg = d3.create("svg")
.attr("width", svgWidth)
.attr("height", svgHeight);
const rowData = [...Array(numRows).keys()];
const triangleData = [...Array(numTrianglesPerRow).keys()];
const triangleUpPoints = `0,${-triangleHeight / 2} ${triangleWidth / 2},${triangleHeight / 2} ${-triangleWidth / 2},${triangleHeight / 2}`;
const triangleDownPoints = `0,${triangleHeight / 2} ${triangleWidth / 2},${-triangleHeight / 2} ${-triangleWidth / 2},${-triangleHeight / 2}`;
rowData.forEach((rowIndex) => {
const row = svg.append("g")
.attr("transform", `translate(0, ${rowIndex * (triangleHeight + verticalSpacing) + 5})`);
row.selectAll("polygon")
.data(triangleData)
.enter()
.append("polygon")
.attr("points", (d) => d % 2 === 0 ? triangleUpPoints : triangleDownPoints)
.attr("transform", (d) => `translate(${d * (triangleWidth + horizontalSpacing) + triangleWidth / 2 - 7}, ${triangleHeight / 2})`)
.style("fill", (d) => d % 2 === 0 ? "yellow" : "white")
.style("stroke", (d) => d % 2 === 0 ? "blue" : "red")
.style("stroke-width", 2);
});
return svg.node();
}