fullscreen // Title: Fractal Flowers
// Description: Draws a recursively branching structure reminiscent of a flower blooming and folding
// Date Started: 2012 Jun
// Last Modified: 2012 Jun
// http://www.asymptoticdesign.org/
// This work is licensed under a Creative Commons 3.0 License.
// (Attribution - NonCommerical - ShareAlike)
// http://creativecommons.org/licenses/by-nc-sa/3.0/
//
// In summary, you are free to copy, distribute, edit, and remix the work.
// Under the conditions that you attribute the work to me, it is for
// noncommercial purposes, and if you build upon this work or otherwise alter
// it, you may only distribute the resulting work under this license.
//
// Of course, the conditions may be waived with permission from the author.
//-----------------Globals
String timestamp; //variable for naming saved frames
float theta;
float counter = 0;
float noPetals = 4; //number of petals the fractal flower has
float reductionFactor = 0.66; //by what factor should the next branch get reduced by? 0.5 = each branch is half the size of the previous one.
float cutOff = 7; //what is the minimum branch length? the fractal will continue to be drawn until this minimum size is reached.
float branchFactor = 2 ; //number of branches at each level
//-----------------Setup
void setup() {
size(400, 400);
smooth();
frameRate(30);
stroke(255);
}
//-----------------Main Loop
void draw() {
background(0);
//increase the angle by one
counter += 1;
theta = radians(counter);
//move our origin to the center of the screen
translate(width/2, height/2);
//draw the requisite number of petals, rotating by PI / (noPetals/2) each time to draw the right number of petals
for(int i = 0; i < noPetals; i++) {
drawPetal();
rotate(PI / (noPetals/2.0));
}
}
//-----------------Defined Functions
void branch(float h) {
//Altered from Daniel Shiffman's fractal tree sketch
//Decrease the size of the branches
h *= reductionFactor;
//if our branch size is large enough to continue,
if (h > cutOff) {
//for each branch that we want to draw
for(int i = 0; i < branchFactor; i++) {
//rotate the coordinate frame and draw a line.
pushMatrix();
rotate(branchFactor*theta/2);
line(0, 0, 0, -h);
//then move our origin to the end of the line we just drew
translate(0, -h);
//and branch from there
branch(h);
popMatrix();
//repeat for the negative direction
pushMatrix();
rotate(-branchFactor*theta/2);
line(0, 0, 0, -h);
translate(0, -h);
branch(h);
popMatrix();
//if our branching factor is odd, draw a branch without a rotation
if (branchFactor % 2 != 0) {
pushMatrix();
line(0, 0, 0, -h);
translate(0, -h);
branch(h);
popMatrix();
}
}
}
}
void drawPetal() {
line(0, 0, 0, -height/8);
translate(0, -height/8);
branch(height/8);
translate(0, height/8);
}
//-----------------Interactions
void keyPressed() {
if (key == ' ') {
timestamp = year() + nf(month(),2) + nf(day(),2) + "-" + nf(hour(),2) + nf(minute(),2) + nf(second(),2);
saveFrame(timestamp+".png");
}
if (key == CODED) {
if (keyCode == UP) {
noPetals++;
}
if (keyCode == DOWN) {
noPetals--;
}
if (keyCode == LEFT) {
branchFactor--;
}
if (keyCode == RIGHT) {
branchFactor++;
}
}
}
A sketch based off of the ubiquitous fractal tree (with the branching code borrowed from Daniel Shiffman's implementation).
The tree is rotated around to create a shape reminiscent of a flower, which blooms and folds back in repeatedly.
UP/DOWN control the number of petals in the flower (default is 4)
LEFT/RIGHT control the number of branches at each layer (default is 2)