var colors = ["#FFC30F", "#581845", "#900C3F", "#C70039", "#FF5733", "#1AC7C4"];
const GRID_SIZE = Math.min(innerWidth, innerHeight) / GRID_UNITS;
colors.forEach((str, i) => colors[i] = color(str));
sliderNumberOfTypes = createSlider(2, 10, 2, 1);
sliderNumberOfTypes.position(10, 30);
sliderNumberOfTypes.size(80);
sliderNumberOfTypes.input(() => startGrid());
createCanvas(GRID_SIZE*GRID_UNITS, GRID_SIZE*GRID_UNITS);
grid = new Grid(GRID_SIZE, width, height, sliderNumberOfTypes.value());
shapes = grid.shapes.map(shape => grid.shrinkPolygon(shape, GRID_SIZE/8));
shapes = [...shapes, ...grid.shapes.map(shape => grid.shrinkPolygon(shape, GRID_SIZE/8*2))];
shapes = [...shapes, ...grid.shapes.map(shape => grid.shrinkPolygon(shape, GRID_SIZE/8*3))];
shapes = [...shapes, ...grid.shapes.map(shape => grid.shrinkPolygon(shape, GRID_SIZE/8*4))];
shapes.forEach(shape => {
for(var i = 0; i < shape.length-1; i++){
shape.colors.push(random(colors));
shape.colors.push(shape.colors[0]);
strokeWeight(GRID_SIZE/16);
shapes.forEach(shape => {
for(var i = 1; i <= shape.length; i++){
var coord2 = shape[i%shape.length];
for(var j = 1; j <= RESOLUTION; j++){
var x1 = lerp(coord1.x, coord2.x, (j-1)/RESOLUTION);
var y1 = lerp(coord1.y, coord2.y, (j-1)/RESOLUTION);
var x2 = lerp(coord1.x, coord2.x, j/RESOLUTION);
var y2 = lerp(coord1.y, coord2.y, j/RESOLUTION);
var pct = (((i-1)*RESOLUTION+(j-1))/(shape.length*RESOLUTION));
pct = (pct+100-(frameCount/100)%100)%1;
var c = lerpColors(pct, shape.colors);
function lerpColors(t, colors)
let i = Math.floor(t*(colors.length-1));
if(i < 0) return colors[0];
if(i >= colors.length-1) return colors[colors.length-1];
let percent = (t - i / (colors.length-1)) * (colors.length-1);
colors[i]._getRed() + percent*(colors[i+1]._getRed()-colors[i]._getRed()),
colors[i]._getGreen() + percent*(colors[i+1]._getGreen()-colors[i]._getGreen()),
colors[i]._getBlue() + percent*(colors[i+1]._getBlue()-colors[i]._getBlue())