Skip to content

Sierpiński Triangle ​

The Sierpiński triangle: a triangle split into three at its edges' midpoints, again and again, drawn with triangles. After The Nature of Code.

js
const levels = Inputs.range([0, 7], {label: "Levels", step: 1, value: 5});
js
const width = 640;
const padding = 10;
const height = Math.round(((width - padding * 2) / 2) * Math.sqrt(3) + padding * 2);
const triangles = [];

function split(p0, p1, p2, level) {
  if (level === levels) return triangles.push([p0, p1, p2]);
  const m01 = cm.vecAdd(p0, p1).div(2);
  const m12 = cm.vecAdd(p1, p2).div(2);
  const m20 = cm.vecAdd(p2, p0).div(2);
  split(p0, m01, m20, level + 1);
  split(m01, p1, m12, level + 1);
  split(m20, m12, p2, level + 1);
}

split(cm.vec(width / 2, padding), cm.vec(padding, height - padding), cm.vec(width - padding, height - padding), 0);

const renderer = cm.canvas({width, height});
const root = cm.flow().renderer(renderer);

root.data(triangles).append(cm.triangle, {
  x: ([p]) => p.x,
  y: ([p]) => p.y,
  x1: ([, p]) => p.x,
  y1: ([, p]) => p.y,
  x2: ([, , p]) => p.x,
  y2: ([, , p]) => p.y,
  fill: "black",
});

root.render();

document.body.append(renderer.node());