sierpinskiTriangle = (n, start = 0, step = 1) => {
const makeGraphFromTriangle = triangle => {
return {
nodes: [
{ id: `${triangle[0]}` },
{ id: `${triangle[1]}` },
{ id: `${triangle[2]}` },
],
links: [
{ source: `${triangle[0]}`, target: `${triangle[1]}` },
{ source: `${triangle[1]}`, target: `${triangle[2]}` },
{ source: `${triangle[2]}`, target: `${triangle[0]}` },
],
}
};
const makeGraphFromTriangles = triangles => {
return triangles.map(makeGraphFromTriangle).reduce(merge, empty());
};
const splitTriangle = triangle => {
return [
[`${triangle[0]}`, `(${[triangle[0], triangle[1]].sort()})`, `(${[triangle[0], triangle[2]].sort()})`],
[`${triangle[1]}`, `(${[triangle[0], triangle[1]].sort()})`, `(${[triangle[1], triangle[2]].sort()})`],
[`${triangle[2]}`, `(${[triangle[0], triangle[2]].sort()})`, `(${[triangle[1], triangle[2]].sort()})`],
];
};
const splitTriangles = triangles => {
return triangles.flatMap(triangle => splitTriangle(triangle));
};
let triangles = [
[
offset(0, start, step),
offset(1, start, step),
offset(2, start, step),
],
];
if (n === 0) {
return makeGraphFromTriangles(triangles);
}
for (let i = 0; i < n; i++) {
triangles = splitTriangles(triangles);
}
return makeGraphFromTriangles(triangles);
}