Patrón Urbano

Subject
Creative Coding
Year
2023

Click and hold to resize the pattern based on your cursor. Press A to start a color-shifting animation, S to change its tint, D to reset.

Interactive composition inspired in a pattern of a men's underpants.

Sketch code

let r=315; //variable con su valor inicial para la rotación
let c; // variable para cambiar el color celeste del rombo
var on = true; //variable booleana para activar los botones. En true permanece apagado.

function setup() { //función para definir variables. Corre una sola vez.

  let cnv = createCanvas(960, 540); //ancho y alto del canvas
  cnv.parent('p5-sketch-holder'); // contiene el canvas dentro de la página en vez de flotar en el body
  cnv.style('width', '100%'); // p5 pone width/height fijos en línea por defecto, lo que le gana al CSS del contenedor — esto lo reemplaza para que escale responsive
  cnv.style('height', 'auto');
  c=color(71,168,189); // definimos el color para la variable c
}


function draw() { //función que corre en loop

  background(35,61,77); // color para el background

  for (let i=-1; i<10; i++){ //variable i para recorrer en filas
    for(let j=-1; j<10; j++){ //variable j para recorrer en columnas

  if (mouseIsPressed){ //cuando el mouse está apretado

      rombo(i*120, j*120, mouseX, r, c); //aumenta el tamaño dependiendo de                                          donde esté el mouse en el eje x
      rombo(60+i*120, 60+j*120, mouseY,r, c); //aumenta el tamaño                                        dependiendo de donde esté el mouse en el eje y

  }else{ //sino
      rombo(i*120, j*120, 80, r, c); // Que el rombo permanezca con un solo                                         tamaño y quieto
      rombo(60+i*120, 60+j*120, 80, r, c); //Que el rombo permanezca con un solo                                    tamaño y quieto
     }

  if(on && key == 'a'){ //si se aprieta un botón y es la "a"
    c = color(71+i*30,168+i*30,189+i*30); //cambia el color                                         mediante la variable i
    r=r+i*0.5+j; //rota constantemente y en diferentes grados según                    "j" e "i"
  }

  if(keyIsPressed && key == 's'){ //si se aprieta un botón y es la "s"
    c = color(71+j*50,168+j*50,189+j*50); //cambia el color mediante la                                                variable j
    r=r-0.05; //rota constantemente
  }

  if(keyIsPressed && key == 'd'){ //si se aprieta un botón y es "d"
    c = color(71,168,189); //vuelve al color original
    r=315; //vuelve al valor original de r y no rota
      }
    }
  }
}



function rombo(x,y,tam,r,c){ //función para un solo módulo. *Módulo: el rombo con sus rombos internos. Agrego variables "x" para la ubicación en el eje x, "y" para la ubicación en el eje y, "tam" para el tamaño del rombo, "r" para los grados de rotación del rombo y "c" para variar el color celeste del rombo.

  push(); //creo un push pop para que la rotación se realice en el lugar que quiero. Para eso me ayudará "translate" que trasladará el "x" e "y" originales del rombo a otro punto para hacer la rotación desde ahí.
  translate(x,y); //traslado el punto (0,0) a (x,y)
  rotate(radians(r)); //Transformo los radianes en grados y roto el rombo.
  noStroke(); //para que no tenga borde el rombo
  fill(c); //relleno de color "c"
  rect(0, 0, tam); //creo el rombo en (0,0) de tamaño "tam"
  fill(255); //relleno de color blanco
  rect(0,0,tam-5);
  fill(c);
  rect(0,0,tam-20);
  fill(254,127,45);
  rect(0,0,tam-25);
  fill(c);
  rect(0,0,tam-35);
  fill(255);
  rect(0,0,tam/2);
  fill(c);
  rect(0,0,35);
  pop();
}

function keyPressed(){ //función para cuando aprieto una tecla

    if(on){ //si aprieto la tecla
     on = false; //la variable "on" cambia su valor a "falso" y se activa                     la animación. Esta se mantiene constante sin tener que                      mantener el botón apretado.
    } else{ //sino la aprieto
      on = true; // la variable "on" se mantiene o vuelve a su estado                          inactivo.
    }
}

Daniela Masihy Kowoll