let globalFlowerParticles = [];
constructor(size, position) {
this.angle = random(TWO_PI);
this.noiseOffset = random(1000);
this.sprite = SpriteFactory.getRandomFlowerSprite();
this.position = position;
this.angle += noise(this.noiseOffset + frameCount * 0.005) * 0.05 - 0.025;
constructor(size, position) {
this.angle = random(TWO_PI);
this.noiseOffset = random(1000);
this.sprite = SpriteFactory.getRandomLeafSprite();
this.position = position;
this.angle += noise(this.noiseOffset + frameCount * 0.005) * 0.05 - 0.025;
static flowerSprites = [];
static initializeSprites() {
for (let i = 0; i < flowerCount; i++) {
let petalSize = random(15, 30);
let sprite = createGraphics(petalSize * 3, petalSize * 3);
let baseHue = random(330, 360);
sprite.fill(baseHue, random(30, 60), random(80, 100), 230);
for (let j = 0; j < petalNum; j++) {
sprite.translate(petalSize * 1.5, petalSize * 1.5);
sprite.rotate(TWO_PI / petalNum * j);
sprite.ellipse(petalSize / 2, 0, petalSize, petalSize * 0.8);
sprite.fill((baseHue + 10) % 360, 40, random(90, 100), 250);
sprite.ellipse(petalSize * 1.5, petalSize * 1.5, petalSize * 0.6, petalSize * 0.6);
this.flowerSprites.push({ sprite, petalSize });
for (let i = 0; i < leafCount; i++) {
let size = random(10, 20);
let sprite = createGraphics(size * 2, size * 2);
sprite.fill(random(90, 150), random(140, 180), random(80, 110), 255);
sprite.ellipse(size, size, size * 1.2, size * 2);
this.leafSprites.push(sprite);
static getRandomFlowerSprite() {
return random(this.flowerSprites);
static getRandomLeafSprite() {
return random(this.leafSprites);
constructor(x, y, length, angle, depth) {
this.endX = this.x + cos(this.angle) * this.length;
this.endY = this.y + sin(this.angle) * this.length;
let left = new Branch(this.endX, this.endY, length * 0.8, angle + random(-PI / 6, PI / 6), depth - 1);
let right = new Branch(this.endX, this.endY, length * 0.8, angle + random(-PI / 6, PI / 6), depth - 1);
this.children.push(left, right);
stroke(120, 80, 40, 255);
strokeWeight(map(this.depth, 0, 6, 2, 10));
line(this.x, this.y, this.endX, this.endY);
for (let child of this.children) {
FlowerField.flowers = [];
let baseBranch = new Branch(width / 2, height - 80, 120, -PI / 2, 5);
this.branches.push(baseBranch);
this.createFlowerClusters();
function getEndBranches(branch) {
if (branch.children.length === 0) {
clusterCenters.push({ x: branch.endX, y: branch.endY });
for (let child of branch.children) {
for (let branch of this.branches) {
for (let center of clusterCenters) {
for (let i = 0; i < random(200, 300); i++) {
let offsetX = random(-80, 80);
let offsetY = random(-80, 80);
FlowerField.flowers.push(new Flower(random(15, 30), { x: center.x + offsetX, y: center.y + offsetY }));
for (let i = 0; i < 1; i++) {
let offsetX = random(-70, 70);
let offsetY = random(-70, 70);
FlowerField.leaves.push(new Leaf(random(10, 20), { x: center.x + offsetX, y: center.y + offsetY }));
for (let branch of this.branches) {
for (let flower of FlowerField.flowers) {
translate(flower.position.x, flower.position.y);
image(flower.sprite.sprite, 0, 0, flower.size, flower.size);
createCanvas(windowWidth, windowHeight);
SpriteFactory.initializeSprites();
flowerField = new FlowerField();
background(242, 239, 232);
rect(0, height - 100, width, 100);
for (let leaf of FlowerField.leaves) {
translate(leaf.position.x, leaf.position.y);
image(leaf.sprite, 0, 0, leaf.size, leaf.size);
function mousePressed() {
flowerField = new FlowerField();