Skip to content

Stochastic Tree ​

A recursive tree whose branches grow at random angles, so every tree is different. After The Nature of Code.

js
const regenerate = Inputs.button("Regenerate");
js
regenerate;

const width = 640;
const height = 300;
const branches = [];

function branch(start, end, strokeWidth) {
  const length = cm.vecDist(start, end);
  if (length < 2) return;
  branches.push({start, end, strokeWidth});
  const dir = cm.vecSub(end, start).angle();
  for (let i = 0; i < 2; i++) {
    const a = dir + (Math.random() - 0.5) * Math.PI;
    branch(end, cm.vecAdd(end, cm.vecFromAngle(a).mult(length * 0.67)), strokeWidth * 0.75);
  }
}

branch(cm.vec(width / 2, height), cm.vec(width / 2, height - 100), 8);

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

root.data(branches).append(cm.link, {
  x: (d) => d.start.x,
  y: (d) => d.start.y,
  x1: (d) => d.end.x,
  y1: (d) => d.end.y,
  stroke: "black",
  strokeWidth: (d) => d.strokeWidth,
  strokeCap: "round",
});

root.render();

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