function plotFractalPlant(ctx, w, h, position, data, angle, scale) {
const center = [Math.floor(w / 2), Math.floor(h / 2)];
const unit = scale;
const rot = (radians) => {
ctx.translate(...center);
ctx.rotate(radians);
ctx.translate(...center.map((d) => -d));
};
const scaleColor = d3
.scaleSequential(d3.interpolateGreens)
.domain([-data.length / 2, data.length]);
const angleRadians = (angle * Math.PI) / 180;
const stack = [];
ctx.translate(-center[0] + position[0], h / 2 - position[1]);
rot(angleRadians);
data.forEach((d, i) => {
switch (d) {
case "F":
ctx.beginPath();
ctx.moveTo(center[0], center[1]);
ctx.lineTo(center[0], center[1] - unit);
ctx.translate(0, -unit);
ctx.strokeStyle = scaleColor(i);
ctx.stroke();
break;
case "[":
stack.push(ctx.getTransform());
break;
case "]":
ctx.setTransform(stack.pop());
break;
case "+":
rot(angleRadians);
break;
case "-":
rot(-angleRadians);
break;
}
});
}