At each step, all turtles either step forward with pen down, step forward with pen up, or make two copies of themselves.
Log in to post a comment.
// Parameters
Canvas.setpenopacity(1);
const numSteps = 20;
const initialStepSize = 24;
const stepSizeDecay = 0.9;
const branchAngle = 120;
const numTurtles = 2;
const initialAngle = 30;
const stepWeight = 2;
const cloneWeight = 1;
const drawWeight = 2;
let actionSequence = "";
function setup() {
let turtles = [...Array(numTurtles)].map(n => new Turtle());
for (var i = 0; i < turtles.length; i++) {
let turtle = turtles[i];
turtle.penup();
turtle.goto(0, 0);
turtle.seth((360 * i / numTurtles) + initialAngle);
turtle.pendown();
}
return turtles;
}
function weightedRandomSelection(choices, weights) {
let weightSum = 0.0;
for (var i = 0; i < weights.length; i++) { weightSum += weights[i]; }
let rand = Math.random() * weightSum;
let cumulativeSum = 0.0;
let idx = 0;
while (cumulativeSum < rand) {
idx++;
cumulativeSum += weights[idx];
}
return choices[idx - 1];
}
function generateActionSequence() {
let sequence = "";
for (var i = 0; i < numSteps; i++) {
let choices;
let weights;
if (sequence.length == 0 || sequence[sequence.length - 1] == "0") {
choices = [1, 2];
weights = [drawWeight, stepWeight];
} else {
choices = [0, 1, 2];
weights = [cloneWeight, drawWeight, stepWeight];
}
sequence += weightedRandomSelection(choices, weights);
}
return sequence;
}
let stepSize = initialStepSize;
let turtles = setup();
actionSequence = actionSequence || generateActionSequence();
console.log(actionSequence);
function step(n) {
let newTurtles = [];
for (var i = 0; i < turtles.length; i++) {
let turtle = turtles[i];
let currentAction = actionSequence[n % actionSequence.length];
if (currentAction == 0) {
let newTurtle1 = turtle.clone();
newTurtle1.right(branchAngle);
newTurtles.push(newTurtle1);
let newTurtle2 = turtle.clone();
newTurtle2.left(branchAngle);
newTurtles.push(newTurtle2);
} else if (currentAction == 1) {
turtle.forward(stepSize);
} else if (currentAction == 2) {
turtle.penup();
turtle.forward(stepSize);
turtle.pendown();
}
}
turtles = turtles.concat(newTurtles);
stepSize *= stepSizeDecay;
}
function walk(i) {
step(i);
return i < numSteps;
}