let nRows, nColumns, rowHeight, columnWidth;
createCanvas(windowWidth, windowHeight);
colorMode(HSB, 360, 255, 255, 255);
backGroundColor=color(random(360), random(50), random(225,255));
background(backGroundColor);
background(backGroundColor);
if(windowWidth>windowHeight)nColumns=int(1.5*nRows);else nColumns=int(.75*nRows);
columnWidth=int(windowWidth/nColumns);
rowHeight=int(windowHeight/nRows);
for (nr=0; nr<nRows; nr++) {
for (nc=0; nc<nColumns; nc++) {
translate(nc*columnWidth, nr*rowHeight);
function deviceTurned() {
function newButterfly() {
for (k=0; k<aPoints.length-1; k++) {
mid1=new p5.Vector(0, 0);
for (i=0; i<aPoints[k].length; i++) {
w1Points[i]=aPoints[k][i];
mid1.div(aPoints[k].length);
fill(colors[(3*k)%ncolors]);
ellipse(columnWidth/2.03, rowHeight/5, .1*rowHeight, .1*rowHeight);
ellipse(columnWidth/1.97, rowHeight/5, .1*rowHeight, .1*rowHeight);
curveVertex(w1Points[0].x, w1Points[0].y);
for (let i=0; i<n1; i++) {
curveVertex(w1Points[i].x, w1Points[i].y);
curveVertex(columnWidth-w1Points[0].x, w1Points[0].y);
for (let i=0; i<n1; i++) {
curveVertex(columnWidth-w1Points[i].x, w1Points[i].y);
for (let j=0; j<nInner; j++) {
fill(colors[(3*k+j)%ncolors]);
curveVertex(w1Points[0].x, w1Points[0].y);
for (let i=0; i<n1; i++) {
curveVertex(w1Points[i].x, w1Points[i].y);
w11Points[i]=mid(w1Points[i], mid1, alpha);
curveVertex(w11Points[i].x, w11Points[i].y);
curveVertex(columnWidth-w1Points[0].x, w1Points[0].y);
for (let i=0; i<n1; i++) {
curveVertex(columnWidth-w1Points[i].x, w1Points[i].y);
curveVertex(columnWidth-w11Points[i].x, w11Points[i].y);
w1Points=w11Points.slice();
curveVertex(w11Points[0].x, w11Points[0].y);
for (let i=0; i<n1; i++) {
curveVertex(w11Points[i].x, w11Points[i].y);
curveVertex(mid1.x, mid1.y);
curveVertex(columnWidth-w11Points[0].x, w11Points[0].y);
for (let i=0; i<n1; i++) {
curveVertex(columnWidth-w11Points[i].x, w11Points[i].y);
curveVertex(columnWidth-mid1.x, mid1.y);
let n1=aPoints[k].length;
curveVertex(aPoints[k][0].x, aPoints[k][0].y);
for (let i=0; i<n1; i++) {
curveVertex(aPoints[k][i].x,aPoints[k][i].y);
curveVertex(columnWidth-aPoints[k][0].x, aPoints[k][0].y);
for (let i=0; i<n1; i++) {
curveVertex(columnWidth-aPoints[k][i].x,aPoints[k][i].y);
backGroundColor=color(random(360), random(50), random(225,255));
nInner=int(random(2, 10));
aPoints=[[ new p5.Vector(.5*columnWidth, .2*rowHeight), new p5.Vector(.45*columnWidth, .5*rowHeight), new p5.Vector(.5*columnWidth, .6*rowHeight)],
[ new p5.Vector(.5*columnWidth, .3*rowHeight), new p5.Vector(.45*columnWidth, .6*rowHeight), new p5.Vector(.35*columnWidth, .7*rowHeight), new p5.Vector(.25*columnWidth, .5*rowHeight)],
[new p5.Vector(columnWidth/2, rowHeight/3), new p5.Vector(columnWidth/2.5, rowHeight/6),
new p5.Vector(columnWidth/4, rowHeight/9), new p5.Vector(columnWidth/9, rowHeight/7), new p5.Vector(columnWidth/6, rowHeight/3), new p5.Vector(columnWidth/4, rowHeight/2)],
[new p5.Vector(columnWidth/2, .2*rowHeight),new p5.Vector(columnWidth/2.1, .01*rowHeight),new p5.Vector(columnWidth/2.3, .01*rowHeight)]];
for (col=0; col<ncolors; col++) {
colors[col]=color(random(360), random(255), random(255), random(255));
for (let k=0; k<aPoints.length; k++) {
for (i=1; i<aPoints[k].length-1; i++) {
if (k!=0 || i!=3)aPoints[k][i]=randomize(aPoints[k][i], randomFactor);
function randomize(a, b) {
return new p5.Vector(a.x*random(1-b, 1+b), a.y*random(1-b, 1+b));
return new p5.Vector(a.x+c*(b.x-a.x), a.y+c*(b.y-a.y));