xxxxxxxxxx
123
let rules = {
X: [
{ rule: "F[+X][-X]FX", prob: 0.5 },
{ rule: "F[-X]FX", prob: 0.05 },
{ rule: "F[+X]FX", prob: 0.05 },
{ rule: "F[++X][-X]FX", prob: 0.1 },
{ rule: "F[+X][--X]FX", prob: 0.1 },
{ rule: "F[+X][-X]FA", prob: 0.1 },
{ rule: "F[+X][-X]FB", prob: 0.1 }
],
F: [
{ rule: "FF", prob: 0.85 },
{ rule: "FFF", prob: 0.05 },
{ rule: "F", prob: 0.1 },
]};
const len = 4;
let ang = 20;
const numGens =6;
let drawRules;
let word = "X+F";
function setup()
{
createCanvas(600, 600);
strokeWeight(2);
drawRules =
{
"A": () => {
noStroke();
fill("#E0B499");
circle(0, 0, len*2);
},
"B": () => {
noStroke();
//fill("#FCA17D");
fill("#FFEB3B");
circle(0, 0, len*2.2);
},
"F": () => {
stroke(100,50,0,250);
line(0,0,0,-len);
translate(0,-len);
},
"-" : () => {rotate(PI/180 * ang);
},
"+" : () => {rotate(PI/180 * - ang);
},
"[" : push,
"]" : pop,
}
noLoop();
}
function draw() {
//background(255, 121, 92);
background(250);
word = "X";
for(let i = 0; i < numGens; i ++) {
word = generate();
}
push();
translate(width/3,height);
rotate (PI/180* ang);
for (let i=0; i<word.length;i++)
{
let c = word [i];
if (c in drawRules)
{
drawRules[c]();
}
}pop();
}
function mouseReleased() {
draw();
}
function generate ()
{
let next = "";
for (let i =0; i< word.length; i++)
{
let c = word[i];
if(c in rules)
{let rule = rules[c];
if(Array.isArray(rule)) {
next += chooseOne(rule);
} else {
next += rules[c];
}} else
{
next += c;
}
}
return next;
}
function chooseOne(ruleSet) {
let n = random();
let t = 0;
for(let i = 0; i < ruleSet.length; i++) {
t += ruleSet[i].prob;
if(t > n) {
return ruleSet[i].rule;
}
}
return "";
}