{
const width = 256;
const height = 256;
const svg = d3.create("svg")
.attr("width", width)
.attr("height", height);
const ladoTriangulo = 10;
const alturaTriangulo = 10;
const grosorBorde = 1;
const superposicionHorizontal = 0.25;
const espacioEfectivo = ladoTriangulo * (1 - superposicionHorizontal);
const factorEspaciadoVertical = 1.6;
const columnas = Math.floor(width / espacioEfectivo);
const filas = Math.floor(height / (alturaTriangulo * factorEspaciadoVertical));
const datosTriangulos = [];
for (let fila = 0; fila < filas; fila++) {
for (let columna = 0; columna < columnas; columna++) {
const x = columna * espacioEfectivo;
const y = fila * alturaTriangulo * factorEspaciadoVertical;
const haciaArriba = columna % 2 === 0;
datosTriangulos.push({ x, y, haciaArriba });
}
}
svg.selectAll("path")
.data(datosTriangulos)
.enter()
.append("path")
.attr("d", d => {
const inicioX = d.x;
const lado = ladoTriangulo;
if (d.haciaArriba) {
return `M ${inicioX},${d.y + alturaTriangulo} L ${inicioX + lado / 2},${d.y} L ${inicioX + lado},${d.y + alturaTriangulo} Z`;
} else {
return `M ${inicioX},${d.y} L ${inicioX + lado / 2},${d.y + alturaTriangulo} L ${inicioX + lado},${d.y} Z`;
}
})
.attr("fill", d => d.haciaArriba ? "yellow" : "white")
.attr("stroke", d => d.haciaArriba ? "blue" : "red")
.attr("stroke-width", grosorBorde);
return svg.node();
}