let coolorsurl = "https://coolors.co/c1cfda-20a4f3-59f8e8-941c2f-03191e"
let colors = ["#2E294E", "#541388", "#F1E9DA", "#FFD400", "#D90368"];
createCanvas(1000, 1000);
shadowCol = color("#000")
noShadowCol = color("#000")
drawingContext.shadowOffsetX = 10;
drawingContext.shadowOffsetY = 10;
drawingContext.shadowBlur = 20;
gui.add(this, "generate");
let colorStr = coolorsurl.slice(19).split('-');
for (let i = 0; i < colorStr.length; i++) {
colors[i] = "#".concat(colorStr[i].toUpperCase());
let output_string = "square_packing.svg";
board = new Array(columns);
for (let i = 0; i < columns; i++) {
board[i] = new Array(rows);
for (let i = 0; i < columns; i++) {
for (let j = 0; j < rows; j++) {
board[i][j] = new Spot(i,j)
function get1DArray(arr2d) {
return [].concat(...arr2d);
function checkNxN(i,j,n) {
if (i+n > columns || j+n > rows) {
for (let a = i; a < i+n; a++) {
for (let b = j; b < j+n; b++) {
if (board[a][b].occupied == true) {
function makeRect(i,j,n) {
let colIndex1 = floor(random(colors.length));
let colIndex2 = (colIndex1 + 1) % colors.length;
drawingContext.shadowColor = noShadowCol;
stroke(colors[colIndex1]);
drawingContext.shadowColor = shadowCol;
circle(i*w+w*n/2,j*w+w*n/2, w*n*0.8);
fill(colors[(colIndex1 + 2) % colors.length]);
circle(i*w+w*n/2,j*w+w*n/2, w*n*0.6);
fill(colors[(colIndex1 + 3) % colors.length]);
circle(i*w+w*n/2,j*w+w*n/2, w*n*0.4);
fill(colors[(colIndex1 + 4) % colors.length]);
circle(i*w+w*n/2,j*w+w*n/2, w*n*0.2);
for (let a = i; a < i+n; a++) {
for (let b = j; b < j+n; b++) {
board[a][b].occupied = true;
let free = get1DArray(board).filter(spot => spot.occupied == false);
while (free.length > 1) {
free = get1DArray(board).filter(spot => spot.occupied == false);
let randomSpot = free[floor(random(free.length))];
if (checkNxN(randomSpot.i, randomSpot.j, 4)) {
makeRect(randomSpot.i, randomSpot.j, 4);
} else if (checkNxN(randomSpot.i, randomSpot.j, 3)) {
makeRect(randomSpot.i, randomSpot.j, 3);
} else if (checkNxN(randomSpot.i, randomSpot.j, 2)) {
makeRect(randomSpot.i, randomSpot.j, 2);
makeRect(randomSpot.i, randomSpot.j, 1);