====== Steve's Fields of Generative Flowers ======
by [[steve-wang|Steve Wang]]
This is a flower field generated with Javascript. The code for the field has been written by [[steve-wang|Steve Wang]], and the code for the individual flowers has been written by the [[generative_flowers|whole class]]. I made some code that could arrange different objects into different patterns. Those patterns are 'circle', 'grid', 'cross' and 'random'. I also tried to make it modular so I could carry it over into my future projects. Making this code and improving it took a couple of months, and I am happy with it. However, it is a little messy because everyone made their flowers in different ways and putting it all together makes it a little of a mess. From this project, I feel like I have learnt a lot. I think that now, I am better better at working with other people's code, can now make code easily usable and I am also better at dealing with complex codes. One of the issues I have faced is, I would do what Dr.Bell suggested I do but when he came to check my code, there were always problems I did not think of. Another problem is communication. For example, Dr.Bell would tell me to do something that changes my code significantly and I learnt the importance of having a clear specification at the start of the project. So I feel like I have to try to make my code clearer in some way. This has been really interesting and I look forward to taking on more programming projects.
這是一個用 Javascript 生成的花田。 字段的代碼由 [[steve-wang|Steve Wang]] 編寫,單個花的代碼由 [[generative_flowers|全班]] 編寫。我編寫了一些代碼,可以將不同的對象排列成不同的模式。這些圖案是“圓形”、“網格”、“十字”和“隨機”。我還嘗試將其模塊化,以便我可以將其帶到我未來的項目中。編寫這段代碼並改進它花了幾個月的時間,我對此很滿意。然而,這有點亂,因為每個人都以不同的方式製作他們的花,把它們放在一起會讓它有點亂。從這個項目中,我覺得我學到了很多東西。我認為現在,我更擅長處理其他人的代碼,現在可以使代碼易於使用,我也更擅長處理複雜的代碼。我面臨的一個問題是,我會按照 Dr.Bell 的建議去做,但是當他來檢查我的代碼時,總是有我沒有想到的問題。另一個問題是溝通。例如,Dr.Bell 會告訴我做一些顯著改變我的代碼的事情,我了解到在項目開始時有一個清晰的規範的重要性。所以我覺得我必須嘗試以某種方式使我的代碼更清晰。這真的很有趣,我期待著承擔更多的編程項目。
===== Code =====
let colors = ["black", "gray", "red", "white"];
let shapes = ["ellipse", "rect", "triangle"];
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 = (angle * Math.PI) / 180;
return new Point(
this.x + distance * Math.sin(r),
this.y + distance * Math.cos(r)
);
}
}
class LucasFantasticFlower {
constructor (position,scale,color)
{ this.color = color;
//pick(colors)
this.xposition = position.x;
this.yposition = position.y;
this.size = randomRange(10,200);
this.scale=scale
}
draw () {
strokeWeight(1)
scale(this.scale)
fill(this.color)
ellipse(this.xposition + 56,this.yposition + 42,36,34)
ellipse(this.xposition + 56,this.yposition + 71,36,34)
ellipse(this.xposition + 80,this.yposition + 80,36,34)
ellipse(this.xposition + 107,this.yposition + 65,36,34)
ellipse(this.xposition + 107,this.yposition + 42,36,34)
ellipse(this.xposition + 80,this.yposition + 25,36,34)
fill("white")
ellipse(this.xposition + 76,this.yposition + 55,33,34)
}
}
class YilerFantasticFlower {
constructor(position,scale,color) { this.size = 40.5;
this.space = 22.5;
this.leafSpace = 23
this.pColor = color
this.mColor = "undifined"
this.scale=scale
this.positionx=position.x
this.positiony=position.y
}
draw() {
scale(this.scale)
this.mColor = "green";
noStroke();
fill(this.mColor);
ellipse(
this.positionx,
this.positiony + this.leafSpace,
75,
25);
fill(this.pColor);
ellipse(
this.positionx + this.space,
this.positiony,
this.size
);
ellipse(
this.positionx - this.space,
this.positiony,
this.size
);
ellipse(
this.positionx,
this.positiony - this.space,
this.size
);
ellipse(
this.positionx,
this.positiony + this.space,
this.size
);
fill(this.mColor);
ellipse(
this.positionx,
this.positiony,
this.size + 10,
this.size + 10
);
}
}
class RonFantasticFlower{
constructor (position,scale,color)
{this.color = color;
this.fantasticflowersize=scale/2;
this.fantasticflower=color;
this.xposition = position.x;
this.yposition = position.y;
this.petalNumber=randomRange(30,50)
}
draw(){
scale(this.fantasticflowersize);
translate(this.xposition,this.yposition)
for (let i = 0; i < this.petalNumber ; i++) {
rotate(27)
fill("white")
ellipse(50,20,20,150)
fill(this.color)
rect(40,0,20,70)}
resetMatrix() }
}
class RexFantasticFlower {
constructor(position,scale,color) {
this.color = color;
this.xposition = position.x;
this.yposition = position.y;
this.size = 40;
this.scale=scale
}
draw() {
translate(this.xposition, this.yposition+10);
scale(this.scale)
fill(191, 170, 191);
rect(35, 20, 14, 135, 20);
rect(5, 64, 55, 25, 20);
rect(30, 64, 55, 25, 20);
fill(this.color);
rect(0, 20, this.size, this.size, 20);
rect(30, 20, this.size, this.size, 20);
fill(191, 170, 191);
rect(30, 35, 25, 25, 10);
resetMatrix();
}
}
class IngramFantasticFlower {
constructor (position,scale,color)
{ this.color = color;
this.xposition = position.x;
this.yposition = position.y;
this.size = randomRange(150,200);
this.scale=scale/5
}
draw () {
fill(this.color);
translate(this.xposition,this.yposition);
scale(this.scale)
rotate(radians(40));
ellipse(75, 0, this.size, 50);
rotate(radians(40));
ellipse(75, 0, this.size, 50);
rotate(radians(40));
ellipse(75, 0, this.size, 50);
rotate(radians(40));
ellipse(75, 0, this.size, 50);
rotate(radians(40));
ellipse(75, 0, this.size, 50);
rotate(radians(40));
ellipse(75, 0, this.size, 50);
rotate(radians(40));
ellipse(75, 0, this.size, 50);
rotate(radians(40));
ellipse(75, 0, this.size, 50);
rotate(radians(40));
ellipse(75, 0, this.size, 50);
resetMatrix()
}
}
class BrendanFantasticFlower {
constructor(position,size,color){
this.x = position.x;
this.y = position.y;
this.size=size/4;
this.color=color
}
draw(){
translate(this.x, this.y);
scale(this.size);
stroke("blue")
fill(this.color)
for (var i = 0; i < 10; i ++) {
ellipse(50, 80, 20, 80);
rotate(PI/5);
circle(50, 50, 50);
}
resetMatrix();
stroke("black")
}
}
class ZoeyFantasticFlower {
constructor(position,scale,color) {
this.xposition = position.x;
this.size = 50
this.scale=scale
this.flowerColor = color;
this.yposition = position.y
this.petalN = Math.floor(randomRange(5,10));
}
draw() {
noStroke();
translate(this.xposition, this.yposition);
scale(this.scale)
fill(this.flowerColor)
for (let i = 0; i < this.petalN; i++) {
ellipse(0, 0, this.size, this.size/2);
rotate(PI / 5);
}
fill(255);
circle(0, 0, this.size/3);
resetMatrix();
stroke(1)
}}
class YunaFantasticFlower {
constructor (position,scale,color)
{ this.size = randomRange(25, 45);
this.color = color;
this.positionX = position.x;
this.positionY = position.y;
this.scale=scale
}
draw () {
strokeWeight(2);
fill(this.color)
scale(this.scale)
ellipse(this.positionX+180-155, this.positionY+0, this.size,this.size);
ellipse(this.positionX+165-155, this.positionY+180-130, this.size,this.size);
ellipse(this.positionX+0, this.positionY+150-130, this.size,this.size);
ellipse(this.positionX+197-155, this.positionY+181-130, this.size,this.size);
ellipse(this.positionX+205-155, this.positionY+150-130, this.size,this.size);
fill(245, 233, 203);
ellipse(this.positionX+180-155, this.positionY+160-130, 40, 40);
fill("black")
ellipse(this.positionX+172-155, this.positionY+156-130, 5, 15);
ellipse(this.positionX+185-155, this.positionY+156-130, 5, 15);
resetMatrix();
}
}
class LarissaFantasticFlower {
constructor (position,scale,color)
{ this.color = color;
this.shape=['ellipse', 'rect','circle']
this.shape = pick(this.shape);
this.xposition = position.x;
this.yposition = position.y;
this.size = scale;
}
draw() {
translate(this.xposition-20,this.yposition)
scale(this.size)
fill(this.color);
if (this.shape == 'circle')
{for(let i = 0; i < 7; i++){
circle(0,60,80);rotate(PI/3)
}}
if (this.shape == 'rect')
{for(let i = 0; i < 7; i++){rect(0,60,80,80);rotate(PI/3)
}}
if(this.shape=="ellipse") {for(let i = 0; i < 7; i++){ellipse(0,60,80,160);rotate(PI/3)
}}
fill(252, 252, 144)
circle(0, 0, 80);
resetMatrix()
}
}
class AnnaFantasticFlower {
constructor(point,individualObjectSize, patternColor) {
this.xPosition = point.x;
this.yPosition = point.y;
this.individualObjectSize=individualObjectSize
this.colorsArray = [
"lightCoral",
"salmon",
"coral",
"tomato",
"lavender",
"orange",
"yellowGreen",
"cornsilk",
"navajoWhite",
"wheat",
"white",
"gainsboro",
"mistyRose",
];
this.shape = ["ellipse", "rect"];
this.color = patternColor;
this.shape = pick(this.shape);
this.stroke = 1;
if (this.shape == "rect") {
this.stroke = 5;
}
}
draw() {
scale(this.individualObjectSize)
translate(this.xPosition, this.yPosition);
fill(this.color);
for (let i = 0; i < 9; i++) {
rotate(40);
rect(2, 0, 20, 10);
}
resetMatrix();
}
}
class OliverFantasticFlower {
constructor(position, size, inputColor) {
this.shape = ["ellipse", "circle", "square", "rect"];
this.colors = ["green", "blue", "black", "pink", "lavender"];
this.scale = size;
this.x = position.x;
this.y = position.y;
this.size = 1.02 * 22;
this.petal = Math.floor(Math.random() * 10);
this.choice = ["random"];
this.randomOrNot = pick(this.choice);
this.inputColor = inputColor;
this.shapeSelector = pick(this.shape);
this.colorSelector = pick(this.colors);
this.rotation = 0;
if (this.colorSelector == "red" && this.x < 600) {
this.petal = 5;
} else if (this.colorSelector == "lavender" || this.x >= 600) {
this.petal = 9;
} else if (this.colorSelector != "yellow" || this.x >= 1200) {
this.petal = 7;
}
if (this.petal == 1) {
this.petal += 1;
}
switch (this.petal) {
case 10:
this.rotation = 4;
break;
case 9:
this.rotation = 3.5;
break;
case 8:
this.rotation = 3.25;
break;
case 7:
this.rotation = 3;
break;
case 6:
this.rotation = 2.75;
break;
case 5:
this.rotation = 2.5;
break;
case 4:
this.rotation = 2;
break;
case 3:
this.rotation = 1.75;
break;
case 2:
this.rotation = 1.5;
break;
}
this.r = 255;
this.g = 255;
this.b = 255;
if (this.randomOrNot != "random" && this.randomOrNot == "notRandom") {
this.c = this.inputColor;
} else {
this.c = this.colorSelector;
}
}
draw() {
scale(this.scale);
translate(this.x, this.y);
for (let i = 0; i < this.petal; i++) {
fill(this.c);
if (this.colorSelector == "lavender") {
fill(204, 153, 255);
} else {
fill(this.c);
}
switch (this.shapeSelector) {
case "rect":
rect(0, 0, this.size, this.size / 2);
fill(this.g, this.b, this.r);
rect(5, 4, this.size / 2, this.size / 3);
break;
case "square":
square(0, 0, this.size);
fill(this.b, this.r, this.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(this.r, this.b, this.g);
circle(10, -10, this.size / 2);
break;
case "ellipse":
ellipse(0, 0, this.size, this.size / 2);
fill(this.r, this.g, this.b);
ellipse(0, 0, this.size / 1.4, this.size / 2);
}
rotate(PI / this.rotation);
fill("yellow");
circle(0, 0, this.size / 2);
fill("orange");
circle(0, 0, this.size / 3);
this.r = 250 - 20 * i;
this.b = 250 - 40 * i;
this.g = 250 - 20 * i;
}
resetMatrix();
}
}
var canvasSize = new Point(1700, 1700);
class OliviaFantasticFlower {
constructor(x, individualObjectSize, patternSize) {
this.position = x;
this.shape = "Flower";
this.colors = ["white", "yellow", "green", "darkgreen"];
this.color = patternSize;
this.size = randomRange(10, 35);
this.width = this.size;
this.height = this.size;
this.individualObjectSize = individualObjectSize;
this.petalN = 8;
this.flowerA = [];
}
draw() {
scale(this.individualObjectSize);
fill(this.color);
this.flowerA = oliviaCircularPositions(
this.position.x,
this.position.y,
this.petalN,
10
);
this.flowerA.forEach((x) => circle(x.x, x.y, this.size));
circle(this.position.x, this.position.y, this.size);
}
}
function pick(inputArray) {
return inputArray[Math.floor(inputArray.length * Math.random())];
}
function randomRange(min, max) {
return min + (max - min) * Math.random();
}
function setup() {
noLoop();
createCanvas(canvasSize.x, canvasSize.y);
frameRate(20);
}
function buildArray(n, fillFunction) {
let outputArray = [];
for (let i = 0; i < n; i++) {
outputArray.push(fillFunction(i));
}
return outputArray;
}
function gridPattern(nOfRows, nInRow, itemX, itemY, startX, startY) {
let yP = startY;
let returnA = [];
for (let i = 0; i < nOfRows; i++) {
yP += itemY + 2;
for (let b = 0; b < nInRow[i]; b++) {
returnA.push(new Point((itemX + 5) * b + startX, yP));
}
}
return returnA;
}
function randomPattern(nOfItems, minX, minY, maxX, maxY) {
let returnA = [];
for (let i = 0; i < nOfItems; i++) {
returnA.push(new Point(randomRange(minX, maxX), randomRange(minY, maxY)));
}
return returnA;
}
function crossPatterns(nOfCrosses, crossPosition, widthOfCross, shapeSize) {
let realShapeSize = shapeSize + 2;
let returnArray = [];
let angle = 0;
for (let i = 0; i < nOfCrosses; i++) {
returnArray.push(new Point(crossPosition[i].x, crossPosition[i].y));
for (let b = 0; b < 4; b++) {
angle += 90;
if (b == 0) {
angle = 0;
}
for (let a = 0; a <= widthOfCross[i]; a++) {
returnArray.push(
crossPosition[i].moveByAngle(angle, realShapeSize * a)
);
}
}
}
return returnArray;
}
function oliviaCircularPositions(startingX, startingY, numberOfShapes, cSize) {
let positionArray = buildArray(
numberOfShapes,
(i) => new Point(startingX, startingY)
);
let testCircle = circlePattern(cSize, positionArray);
return testCircle;
}
function circularPositions(nOfCircle, positions, nOfShapes, cSize) {
let arrayToReturn = [];
for (let i = 0; i < nOfCircle; i++) {
let positionArray = buildArray(
nOfShapes[i],
(b) => new Point(positions[i].x, positions[i].y)
);
let testCircle = circlePattern(cSize, positionArray);
arrayToReturn = arrayToReturn.concat(testCircle);
}
return arrayToReturn;
}
function circlePattern(cSize, cPosition) {
let angle = 360 / cPosition.length;
return cPosition.map((p, i) => {
return p.moveByAngle(i * angle, cSize);
});
}
function duplicateArray(times, arrayToCopy) {
let returnArray = [];
for (let i = 0; i < times; i++) {
returnArray.push(arrayToCopy);
}
return returnArray;
}
//Replace in arrow function in 156
let reducer = (previousValue, currentValue) => previousValue + currentValue;
function addingWholeArray(arrayToAdd) {
return arrayToAdd.reduce(reducer);
}
let i = 0;
class fantasticFlower {
constructor(flowerXY, individualObjectSize, patternColor) {
this.flowerX = flowerXY.x;
this.flowerY = flowerXY.y;
this.flowerColor = patternColor;
this.petalsColor = patternColor;
this.flowerSize = randomRange(10, 40);
this.petalWidth = randomRange(10, 30);
this.petalHeight = randomRange(10, 30);
this.nOfPetals = randomRange(1, 10);
this.individualObjectSize = individualObjectSize;
}
draw() {
scale(this.individualObjectSize);
if (this.flowerColor == "black") {
this.flowerColor = "white";
}
if (this.petalsColor == "black") {
this.petalsColor = "white";
}
i += 1;
translate(this.flowerX, this.flowerY);
rotate(i);
if (this.petalsColor == "black") {
this.petalsColor = "white";
}
fill(this.petalsColor);
let petalsRotate = 360 / this.nOfPetals;
for (let a = 0; a < this.nOfPetals; a++) {
rotate(petalsRotate);
ellipse(0, -10, 10 + this.petalWidth, 20 + this.petalHeight);
}
fill(this.flowerColor);
circle(0, 0, this.flowerSize);
resetMatrix();
}
}
function arrayRandomPicker(arraytoPickFrom1, arraytoPickFrom2) {
if (arraytoPickFrom1.length != arraytoPickFrom2.length) {
return "The legnth of both arrays are not the same", false;
}
let returnArray = [];
let pick = 0;
for (let b = 0; b < arraytoPickFrom1.length; b++) {
pick = randomRange(0, 2);
if (pick == 0) {
returnArray.push(arraytoPickFrom1[b]);
} else {
returnArray.push(arraytoPickFrom2[b]);
}
}
return returnArray;
}
function iInLoopedArray(shorterArray, longerArray) {
let returnArray = [];
for (let a = 0; a < longerArray.length; a++) {
returnArray.push(shorterArray[a % shorterArray.length]);
}
return returnArray;
}
class FlowerField {
constructor(
patternName,
positionArray,
itemSize,
widthArray,
individualObjectSize,
patternColor
) {
if (positionArray.length != widthArray.length) {
if (positionArray.length < widthArray.length) {
this.widthArray = widthArray;
this.positionArray = iInLoopedArray(positionArray, widthArray);
} else {
this.widthArray = iInLoopedArray(widthArray, positionArray);
this.positionArray = positionArray;
}
} else {
this.positionArray = positionArray;
this.widthArray = widthArray;
}
this.itemSize = itemSize;
this.newPositions = this.adjustPosition(
patternName,
canvasSize,
this.positionArray,
this.itemSize,
this.widthArray
);
this.flowersArray = this.newPositions.map(
(x) => new fantasticFlower(x, individualObjectSize, patternColor)
);
this.LucasNow = this.newPositions.map(
(x) => new LucasFantasticFlower(x, individualObjectSize, patternColor));
this.YilerNow = this.newPositions.map(
(x) => new YilerFantasticFlower(x, individualObjectSize, patternColor));
this.RonNow = this.newPositions.map(
(x) => new RonFantasticFlower(x, individualObjectSize, patternColor));
this.RexNow = this.newPositions.map(
(x) => new RexFantasticFlower(x, individualObjectSize, patternColor));
this.IngramNow = this.newPositions.map(
(x) => new IngramFantasticFlower(x, individualObjectSize, patternColor));
this.BrendanNow = this.newPositions.map(
(x) => new BrendanFantasticFlower(x, individualObjectSize, patternColor));
this.YunaNow = this.newPositions.map(
(x) => new YunaFantasticFlower(x, individualObjectSize, patternColor)
);
this.LarissaNow = this.newPositions.map(
(x) => new LarissaFantasticFlower(x, individualObjectSize/5, patternColor)
);
this.ZoeyNow = this.newPositions.map(
(x) => new ZoeyFantasticFlower(x, individualObjectSize/5, patternColor)
);
this.AnnaNow = this.newPositions.map(
(x) => new AnnaFantasticFlower(x, individualObjectSize, patternColor)
);
this.OliviaNow = this.newPositions.map(
(x) => new OliviaFantasticFlower(x, individualObjectSize, patternColor)
);
this.OliverNow = this.newPositions.map(
(x) => new OliverFantasticFlower(x, individualObjectSize, patternColor)
);
this.flowersArray = arrayRandomPicker(this.flowersArray, this.OliviaNow);
this.flowersArray = arrayRandomPicker(this.flowersArray, this.LucasNow);
this.flowersArray = arrayRandomPicker(this.flowersArray, this.YilerNow);
this.flowersArray = arrayRandomPicker(this.flowersArray, this.RonNow);
this.flowersArray = arrayRandomPicker(this.flowersArray, this.RexNow);
this.flowersArray = arrayRandomPicker(this.flowersArray, this.IngramNow);
this.flowersArray = arrayRandomPicker(this.flowersArray, this.BrendanNow);
this.flowersArray = arrayRandomPicker(this.flowersArray, this.YunaNow)
this.flowersArray = arrayRandomPicker(this.flowersArray, this.ZoeyNow);
this.flowersArray = arrayRandomPicker(this.flowersArray, this.LarissaNow);
this.flowersArray = arrayRandomPicker(this.flowersArray, this.AnnaNow);
this.flowersArray = arrayRandomPicker(this.flowersArray, this.OliverNow);
return this.flowersArray;
}
help(patternName) {
console.log("patternHelp Output:");
console.log(
"If unsure what format to type arguments in here are the formats for arguments: (string, Point class, array filled with Point class, number, number, array)"
);
console.log(
"These are the instructions for:",
patternName,
"Instructions will alow you to understand what to type for each argument"
);
if (patternName.includes("cross")) {
console.log(
"(Specify Pattern name,totalItems(number), Positon of crosses, Position between each shape, itemSize, Width of cross"
);
} else if (patternName.includes("circle")) {
console.log(
"(Specify Pattern name, totalItems, Positon of circles, Position between the shapes that outline circle, itemSize, An array with the amount of items that will outline each circle"
);
} else if (patternName.includes("random")) {
console.log(
"(Specify Pattern name, totalItems, Invalid because random positions,Invalid because randomPosition, itemSize, Invalid because each item will be on their own"
);
} else if (patternName.includes("grid")) {
console.log(
"(Specify Pattern name, totalItems, where to start drawing grid (array with a point class), the size of each item (number), nO amount of items on each row"
);
} else {
console.log(
"Invalid pattern name: the only patterns are cross, circle, grid, random",
"End of pattenHelp"
);
return false;
}
return "End of pattenHelp";
}
adjustPosition(
patternName /*(string)*/,
canvasSize /*(Point class)*/,
midPoints /*(array filled with Point class)*/,
itemSize /*(number)*/,
PatternWidth /*(array)*/
) {
if (
patternName.includes("cross") ||
patternName.includes("circle") ||
patternName.includes("random") ||
patternName.includes("grid")
) {
if (patternName.includes("cross")) {
let nOfCrosses = midPoints.length;
let totalWidths = addingWholeArray(PatternWidth);
let shapeSize = itemSize;
let returnArray = [];
return crossPatterns(nOfCrosses, midPoints, PatternWidth, shapeSize);
}
if (patternName.includes("circle")) {
let arrayToReturn = [];
let shapeSize = itemSize;
let nOfCircle = midPoints.length;
let nOfShapes = PatternWidth;
let ps = circularPositions(
nOfCircle,
midPoints,
PatternWidth,
shapeSize
);
for (let b = 0; b < ps.length; b++) {
arrayToReturn = arrayToReturn.concat(ps[b]);
}
return arrayToReturn;
}
if (patternName.includes("random")) {
let arrayToReturn = [];
for (let i = 0; i < midPoints.length; i++) {
let minXY = new Point(midPoints[i].x, midPoints[i].y);
let maxX = 0;
let maxY = 0;
maxX = midPoints[i].x + itemSize;
maxY = midPoints[i].y + itemSize;
if (itemSize > canvasSize.x || itemSize > canvasSize.y) {
if (itemSize > canvasSize.x) {
maxX = canvasSize.x;
}
if (itemSize > canvasSize.y) {
maxY = canvasSize.y;
}
}
let maxXY = new Point(maxX, maxY);
let arrayToJoin = randomPattern(
PatternWidth[i],
minXY.x,
minXY.y,
maxXY.x,
maxXY.y
);
arrayToReturn = arrayToReturn.concat(arrayToJoin);
}
return arrayToReturn;
}
if (patternName.includes("grid")) {
let arrayToReturn = [];
for (let i = 0; i < midPoints.length; i++) {
let rowNumber = PatternWidth[i];
let gridInfo = duplicateArray(rowNumber, PatternWidth[i]);
let itemXYsizes = new Point(itemSize, itemSize);
let startXY = new Point(midPoints[i].x, midPoints[i].y);
let arrayToJoin = gridPattern(
gridInfo.length,
gridInfo,
itemXYsizes.x,
itemXYsizes.y,
startXY.x,
startXY.y
);
arrayToReturn = arrayToReturn.concat(arrayToJoin);
}
return arrayToReturn;
} else {
console.log(
"Invalid patternName",
"If help needed please type: patternHelp(patternName)"
);
return false;
}
}
}
XYSet(i) {
return new Point(
randomRange(0, canvasSize.x),
randomRange(0, canvasSize.y)
);
}
}
let widthArray = [3];
//Flowers are made here
//Making flowers
let flowersArray = buildArray(4, (b) =>
buildArray(20, (i) =>
arrayOfFlowerFields(
10,
280,
"horizontal",
i,
200 + 400 * b,
widthArray,
0.5,
"cross"
)
)
);
let flowersArray2 = buildArray(4, (b) =>
buildArray(20, (i) =>
arrayOfFlowerFields(
10,
280,
"horizontal",
i,
2000 + 400 * b,
widthArray,
0.5,
"cross"
)
)
);
flowersArray = flowersArray.concat(flowersArray2);
function arrayOfFlowerFields /*Call with forEach*/(
amountOfPatterns,
distanceBetween,
direction,
counter,
linePosition,
widthArray,
individualObjectSize /*will times this amount*/,
specificOrRandomPattern
) {
let patternColor = "";
let spaceforPattern = 0;
let spaceForPatternX = 0;
let spaceForPatternY = 0;
let rangeOfPattern = [];
let patterns = ["random", "circle", "cross", "grid"];
if (specificOrRandomPattern == "random") {
let drawPattern = pick(pattern);
}
let drawPattern = specificOrRandomPattern;
if (direction == "horizontal") {
let position = [new Point(distanceBetween * counter, linePosition)];
spaceForPatternX = canvasSize.x / amountOfPatterns;
if (spaceForPatternX != 0) {
spaceForPatternY = canvasSize.y;
} else {
spaceForPatternX = canvasSize.x;
}
if (spaceForPatternX > spaceForPatternY) {
spaceforPattern = spaceForPatternY;
} else {
spaceforPattern = spaceForPatternX;
}
if (direction == "horizontal") {
rangeOfPattern = [
new Point(distanceBetween * counter, linePosition),
new Point(distanceBetween * counter + spaceforPattern, linePosition),
];
} else {
rangeOfPattern = [
new Point(linePosition, distanceBetween * counter),
new Point(linePosition, distanceBetween * counter + spaceforPattern),
];
}
let midPoint = distanceBetween * counter + spaceforPattern / 2;
if (drawPattern == "random") {
if (direction == "horizontal") {
position = [new Point(midPoint, linePosition)];
itemSize = spaceforPattern;
patternColor = pick(colors);
}
}
if (drawPattern == "circle") {
position = [new Point(midPoint, linePosition)];
itemSize = (spaceforPattern / amountOfPatterns) * 4;
patternColor = pick(colors);
}
if (drawPattern == "grid") {
position = [new Point(distanceBetween * counter, linePosition - 200)];
itemSize = rangeOfPattern[0].y / 4;
patternColor = pick(colors);
}
if (drawPattern == "cross") {
position = [new Point(midPoint, linePosition)];
itemSize = 50;
patternColor = pick(colors);
}
return new FlowerField(
drawPattern,
position,
itemSize,
widthArray,
individualObjectSize,
patternColor
);
} else {
let position = [new Point(linePosition, distanceBetween * counter)];
spaceForPatternY = (canvasSize.y - 100) / amountOfPatterns;
if (spaceForPatternY != 0) {
spaceForPatternY = canvasSize.y - 100;
} else {
spaceForPatternY = canvasSize.y - 100;
}
if (spaceForPatternX > spaceForPatternY) {
spaceforPattern = spaceForPatternY;
} else {
spaceforPattern = spaceForPatternX;
}
rangeOfPattern = [
new Point(linePosition, distanceBetween * counter),
new Point(linePosition, distanceBetween * counter + spaceforPattern),
];
let midPoint = distanceBetween * counter + spaceforPattern / 2;
if (drawPattern == "random") {
position = [new Point(linePosition, midPoint)];
itemSize = spaceforPattern;
patternColor = pick(colors);
}
if (drawPattern == "circle") {
position = [new Point(linePosition, midPoint)];
itemSize = (spaceforPattern / amountOfPatterns) * 4;
patternColor = pick(colors);
}
if (drawPattern == "grid") {
position = [new Point(linePosition, distanceBetween * counter)];
itemSize = rangeOfPattern[0].y / 3;
patternColor = pick(colors);
}
if (drawPattern == "cross") {
position = [new Point(linePosition, midPoint)];
itemSize = 30;
patternColor = pick(colors);
}
return new FlowerField(
drawPattern,
position,
itemSize,
widthArray,
individualObjectSize,
patternColor
);
}
}
function draw() {
background(54, 166, 85);
stroke(2);
//shapesNow.forEach((x) => x.draw());
// flowersArray.forEach((x) => x.draw());
//flowersArray.forEach((x) => x.forEach((y) => y.draw()));
flowersArray.forEach((z) => z.forEach((x) => x.forEach((y) => y.draw())));
}
function shapeFromPoints(pointArray) {
beginShape();
pointArray.forEach((p) => vertex(p.x, p.y));
endShape(CLOSE);
}
function buildArray2(n, fillFunction) {
let outputArray = [];
for (let i = 0; i < n; i++) {
outputArray.push(fillFunction);
}
return outputArray;
}
function randomRange(min, max) {
return Math.floor(min + (max - min) * Math.random());
}
function head(array) {
return array.splice(0, 1)[0];
}
//Last item of array
function last(array) {
return array.splice(array.length - 1, 1)[0];
}