======Oliver Wang's Generative Flower======
by [[oliver-wang|oliver wang]]
let myWidth = 1700;
let myHeight = 800;
function setup() {
createCanvas(myWidth, myHeight);
noLoop();
}
function randomRange(min, max) {
return min + (max - min) * Math.random();
}
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
move(xDistance, yDistance) {
return new Point(this.x + xDistance, this.y + yDistance);
}
moveByAngle(angle, distance) {
let r = (-1 * (angle + 180) * Math.PI) / 180;
return new Point(
this.x + distance * Math.sin(r),
this.y + distance * Math.cos(r)
);
}
}
function randomPoint(xMin, xMax, yMin, yMax) {
return new Point(randomRange(xMin, xMax), randomRange(yMin, yMax));
}
function buildArray(n, fillFunction) {
let outputArray = [];
for (let i = 0; i < n; i++) {
outputArray.push(fillFunction(i));
}
return outputArray;
}
function shapeFromPoints(pointArray) {
beginShape();
pointArray.forEach((p) => vertex(p.x, p.y));
endShape(CLOSE);
}
function pointsForConvexShape(
centerPoint,
noOfPoints,
minDistance,
maxDistance,
minRotation,
maxRotation
) {
let angles = low2HighSort(
buildArray(noOfPoints, (x) => randomRange(minRotation, maxRotation))
);
let distances = buildArray(noOfPoints, (x) =>
randomRange(minDistance, maxDistance)
);
let points = angles.map((x, i) => {
return centerPoint.moveByAngle(x, distances[i]);
});
return points;
}
function buildArray(n, fillFunction) {
let outputArray = [];
for (let i = 0; i < n; i++) {
outputArray.push(fillFunction(i));
}
return outputArray;
}
function pick(inputArray) {
return inputArray[Math.floor(inputArray.length * Math.random())];
}
class FantasticFlower {
constructor(x, y, size, randomOrNot, inputColor) {
this.shape = ["ellipse", "circle", "square", "rect"];
this.colors = ["lightGreen", "yellow", "white", "pink", "lavender"];
this.x = x;
this.y = y;
this.size = size;
this.petal = Math.floor(Math.random() * 10);
this.randomOrNot = randomOrNot;
this.inputColor = inputColor;
}
draw(flowerPoint) {
translate(flowerPoint.x, flowerPoint.y);
circle(0, 0, 50);
stroke(0);
let shapeSelector = pick(this.shape);
let colorSelector = pick(this.colors);
let rotation = 0;
if (colorSelector == "red" && this.x < 600) {
this.petal = 5;
} else if (colorSelector == "lavender" || this.x >= 600) {
this.petal = 9;
} else if (colorSelector != "yellow" || this.x >= 1200) {
this.petal = 7;
}
if (this.petal == 1) {
this.petal += 1;
}
switch (this.petal) {
case 10:
rotation = 4;
break;
case 9:
rotation = 3.5;
break;
case 8:
rotation = 3.25;
break;
case 7:
rotation = 3;
break;
case 6:
rotation = 2.75;
break;
case 5:
rotation = 2.5;
break;
case 4:
rotation = 2;
break;
case 3:
rotation = 1.75;
break;
case 2:
rotation = 1.5;
break;
}
translate(this.x, this.y);
let r = 255;
let g = 255;
let b = 255;
for (let i = 0; i < this.petal; i++) {
if (this.randomOrNot != "random" && this.randomOrNot == "notRandom") {
let c = this.inputColor;
fill(c);
} else if (colorSelector == "lavender") {
fill(204, 153, 255);
} else {
let c = color(colorSelector);
fill(c);
}
switch (shapeSelector) {
case "rect":
rect(0, 0, this.size, this.size / 2);
fill(g, b, r);
rect(5, 4, this.size / 2, this.size / 3);
break;
case "square":
square(0, 0, this.size);
fill(b, r, g);
square(10, 5, this.size / 2);
rect(50, 0, this.size / 2, this.size / 3);
break;
case "circle":
circle(10, 0, this.size);
fill(r, b, g);
circle(10, -10, this.size / 2);
break;
case "ellipse":
ellipse(0, 0, this.size, this.size / 2);
fill(r, g, b);
ellipse(0, 0, this.size / 1.4, this.size / 2);
}
rotate(PI / rotation);
fill("yellow");
circle(0, 0, this.size / 2);
fill("orange");
circle(0, 0, this.size / 3);
r -= 20;
b -= 40;
g -= 20;
}
resetMatrix();
}
}
let greenFlowers = buildArray(
90,
(i) => new FantasticFlower(0, 0, 30, "notRandom", "lightGreen")
);
let redFlowers = buildArray(
90,
(i) => new FantasticFlower(0, 0, 30, "notRandom", "red")
);
let randomFlowers = buildArray(
36,
(i) =>
new FantasticFlower(
0,
0,
40,
"random",
"haha"
)
);
let last5RedFlowers = redFlowers.slice(295);
last5RedFlowers.forEach((x) => (x.size = x.size * 2));
let allFlowers = redFlowers.concat(randomFlowers, last5RedFlowers);
let p1 = new Point(myWidth / 3, myHeight / 2);
let p2 = p1.moveByAngle(0, 300);
let anglePoints1 = buildArray(90, (i) => {
return p1.moveByAngle(i * 10, 10+(3 * i));
});
let anglePoints2 = buildArray(90, (i) => {
return p1.moveByAngle(i * 10, 350);
});
let anglePoints3 = buildArray(90, (i) => {
return p1.moveByAngle(i * 10, -5-(3 * i));
});
console.log(anglePoints2);
function specialFlower (x, y){
let colors = ["lightBlue", "lightGreen", "aqua", "darkRed", "lightPink", "purple", "khaki", "gray", "orange", "red"]
translate(x, y)
for(let i = 0 ; i < colors.length ; i++){
let colorPicker = colors[i]
fill(colorPicker)
square(0, 0, 50)
rotate(PI/5)
}
fill(115, 94, 38)
circle(0, 0, 20)
resetMatrix()
}
let number = 1
function draw() {
let X = (0.01) * frameCount % (-10 + height/2);
let x = 1000
background(11, 17, 107);
fill("white")
textSize(20)
text("please click it", 10, 20)
}
function mouseClicked(){
switch(number){
case 1:
randomFlowers.forEach((x, i) => {
x.draw(anglePoints2[i]);
});
number += 1
break;
case 2:
redFlowers.forEach((x, i) => {
x.draw(anglePoints3[i]);
});
number +=1
break;
case 3:
greenFlowers.forEach((x, i) => {
x.draw(anglePoints1[i]);
});
number+=1
break;
case 4:
specialFlower(width/3, height/2)
number-=3
break;
}
}