Skip to content

Instantly share code, notes, and snippets.

@jhubley
Last active June 25, 2016 22:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jhubley/3cc23bf95bb5acaaad09152878a13d3b to your computer and use it in GitHub Desktop.
Save jhubley/3cc23bf95bb5acaaad09152878a13d3b to your computer and use it in GitHub Desktop.
Fractal trees created with L-systems in p5.js
<!doctype html>
<html>
<head>
<style>
body,html{
margin:0;
padding:0;
}
</style>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.2/p5.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.2/addons/p5.dom.js"></script>
<script>
var w = window.innerWidth;
var h = window.innerHeight;
var axiom = "F";
var axiomB = "X";
var len = 135;
var len2 = 305;
var len3 = 4;
var sentence = axiom;
var sentence2 = axiom;
var sentence3 = axiomB;
var angle;
// variables: F+-[]
// axiom: F
// rules: F-> FF+[+F-F-F]-[-F+F+F]
var rules = [];
rules[0] = {
a: "F",
b: "FF+[+F-F-F]-[-F+F+F]"
}
var rulesB = [];
rulesB[0] = {
a: "F",
b: "FF+[+F]-[-F++]"
}
var rulesC = [];
rulesC[0] = {
a: "F",
b: "FF"
}
rulesC[1] = {
a: "X",
b: "F-[[X]+X]+F[+FX]-X"
}
function setup() {
createCanvas(w,h);
background('#151c19');
turtle();
angle = radians(25);
angle2 = radians(22.5);
angle3 = radians(45);
angle4 = radians(15);
angle5 = radians(24.7);
for (i = 0; i < 4; i++){
generate();
}
for (p = 0; p < 7; p++){
generate2();
}
for (p = 0; p < 6; p++){
generate3();
}
}
function turtle(){
resetMatrix();
translate(width/2, height);
for (var i = 0; i < sentence.length; i++){
var current = sentence.charAt(i);
if (current == "F"){
stroke("#3fb57c");
line(0, 0, 0, -len);
translate(0, -len);
}else if (current == "+"){
rotate(angle5);
}else if (current == "-"){
rotate(-angle);
}else if (current == "["){
push();
}else if (current == "]"){
pop();
}
}
}
function turtle2(){
resetMatrix();
translate(width/3, height);
for (var n = 0; n < sentence2.length; n++){
var current = sentence2.charAt(n);
if (current == "F"){
stroke("#2b8a79");
line(0, 0, 0, -len2);
translate(0, -len2);
}else if (current == "+"){
rotate(angle4);
}else if (current == "-"){
rotate(-angle4);
}else if (current == "["){
push();
}else if (current == "]"){
pop();
}
}
}
function turtle3(){
resetMatrix();
translate(width/6, height);
for (var n = 0; n < sentence3.length; n++){
var current = sentence3.charAt(n);
if (current == "F"){
stroke("#28b232");
line(0, 0, 0, -len3);
translate(0, -len3);
}else if (current == "X"){
stroke("#024d08");
line(0, 0, -len3, 0);
translate(0, -len3);
}else if (current == "+"){
rotate(angle2);
}else if (current == "-"){
rotate(-angle2);
}else if (current == "["){
push();
}else if (current == "]"){
pop();
}
}
}
function generate(){
len *= .5;
var nextSentence = "";
for (var i = 0; i < sentence.length; i++){
var current = sentence.charAt(i);
var found = false;
for (var j = 0; j < rules.length; j++ ){
if (current == rules[j].a){
found = true;
nextSentence += rules[j].b;
break;
}
}
if (!found){
nextSentence += current;
}
}
sentence = nextSentence;
// createP(sentence);
turtle();
}
function generate2(){
len2 *= .5;
var nextSentence2 = "";
for (var i = 0; i < sentence2.length; i++){
var current2 = sentence2.charAt(i);
var found2 = false;
for (var j = 0; j < rulesB.length; j++ ){
if (current2 == rulesB[j].a){
found2 = true;
nextSentence2 += rulesB[j].b;
break;
}
}
if (!found2){
nextSentence2 += current2;
}
}
sentence2 = nextSentence2;
turtle2();
}
function generate3(){
len2 *= .5;
var nextSentence3 = "";
for (var i = 0; i < sentence3.length; i++){
var current3 = sentence3.charAt(i);
var found3 = false;
for (var j = 0; j < rulesC.length; j++ ){
if (current3 == rulesC[j].a){
found3 = true;
nextSentence3 += rulesC[j].b;
break;
}
}
if (!found3){
nextSentence3 += current3;
}
}
sentence3 = nextSentence3;
turtle3();
}
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment