(TVC) 1970-1973

Catarina Maçãs


Based on: The Cube Theme and Variation by Edward Zajec, 1976

Category: direct


Description:

Work made in the Generative Art course from the Master's degree in Design and Multimedia of the University of Coimbra, Portugal.

Sketch made according top the rules in: https://digitalartmuseum.org/zajec/zajec70-73_002.html

and to create digital artworks similar to: https://digitalartmuseum.org/zajec/1970-73-tvc.html

This sketch is running in the browser. This sketch does not run in the browser.






/* 
Part of the ReCode Project (http://recodeproject.com)
Based on "The Cube Theme and Variation" by Edward Zajec
Originally published in "Computer Graphics and Art" v1n2, 1976
Copyright (c) 2021 Catarina Maçãs - OSI/MIT license (http://recodeproject/license).
*/

/* @pjs pauseOnBlur="true"; */

ArrayList<Modulo> grelha = new ArrayList<Modulo>();

float lado = 40;
int res = 20;

int valor_anterior;
int repetidos=0;


void settings(){
  size(round(res*lado), round(res*lado));
}

void setup() {
  
  //noLoop();
  definirGramatica();
  definirInicio();
}


void draw() {
  background(255);

  //desenha a grelha
  for (Modulo mod : grelha) {
    //mod.update_modulo();
    mod.desenha();
  }
}





void mousePressed() {
  
  
  grelha = new ArrayList<Modulo>();
  repetidos=0;
  definirInicio();
  
  /*
  int col_x = floor(mouseX/lado);
  int lin_y = floor(mouseY/lado);
  int aux2 = floor(random(0, 7));
  
  for(Modulo m : grelha){
    if(m.posicao == lin_y*res+col_x){
      m.update_modulo();
      break;
    }
  }*/
  
//  puzzle(grelha.set(lin_y*res+col_x, aux2), (float)col_x*lado, (float)lin_y*lado);
//  mudaModulos(col_x, lin_y);
  
}


void set_elemento_grelha(int posicao, int newValor){
  
  for(Modulo mod : grelha){
    if(mod.posicao == posicao){
      mod.valor = newValor;
      break;
    }
  }
}


int grelha_contem(int posic){
  int res = -1;
  
  for(Modulo m : grelha){
    if (m.posicao == posic){
      res = grelha.indexOf(m);
    }
  }
  
  return res;
  
}


ArrayList<Integer> apenas_comuns(Integer[] a, Integer[] b) {
  ArrayList<Integer> resultado = new ArrayList<Integer>();

  for (int i = 0; i < a.length; i++) {
    for (int j = 0; j < b.length; j++) {
      if (a[i] == b[j]) {
        resultado.add(b[j]);
      }
    }
  }
  return resultado;
}

boolean contem(Integer[] a, int b){
  boolean res=false;
  
  for(Integer m : a){
    if(m == b){
      res = true;
      break;
    }
  }
  
  return res;
}


ArrayList<Integer> removeElem(Integer[] a, Integer r) {
  ArrayList<Integer> result = new ArrayList<Integer>();

  for (Integer item : a) {
    if (!r.equals(item)) {
      result.add(item);
    }
  }
  return result;
}

ArrayList<Integer> apenas_iguais(ArrayList<Integer> f){
  
  ArrayList<Integer> res = new ArrayList<Integer>();
  
  res.add(f.get(0));
  
  for(Integer i : f){
    if(!res.contains(i)){
      res.add(i);
    }
  }
  
  return res;
  
}



ArrayList<Integer> toArrayList(Integer[] a) {
  ArrayList<Integer> result = new ArrayList<Integer>();

  for (Integer item : a) {
    result.add(item);
  }
  return result;
}


class Modulo{
  
  int posicao, valor;
  float pos_x, pos_y;
  boolean mudado;
  
  Modulo(int pos, float p_x, float p_y, int v){
    posicao = pos;
    pos_x = p_x;
    pos_y = p_y;
    valor = v;
    mudado = false;
  }
  
    
  void desenha(){
    switch(valor) {
    case 0: 
      noStroke();
      fill(255);
      rect(pos_x, pos_y, lado, lado);
      break;
    case 1: 
      stroke(0);
      for (float d=0; d<=0.99; d+=0.1) {
        float y_o = lerp(pos_y, pos_y+lado, d);
        float x_o = lerp(pos_x+lado, pos_x, d);
        line(pos_x, y_o, x_o, y_o);
      }
      noStroke();
      fill(0);
      triangle(pos_x+lado, pos_y, pos_x, pos_y+lado, pos_x+lado, pos_y+lado);
      break;
    case 2: 
      stroke(0);
      for (float d=0; d<=0.75; d+=0.25) {
        float y_o = lerp(pos_y, pos_y+lado, d);
        float x_o = lerp(pos_x, pos_x+lado, d);
        line(x_o, pos_y+lado, pos_x+lado, y_o);
      }
      noStroke();
      fill(0);
      triangle(pos_x, pos_y, pos_x, pos_y+lado, pos_x+lado, pos_y);
      break;
    case 3: 
      stroke(0);
      for (float d=0.25; d<=1; d+=0.25) {
        float y_o = lerp(pos_y, pos_y+lado, d);
        float x_o = lerp(pos_x, pos_x+lado, d);
        line(pos_x, y_o, x_o, pos_y);
      }
      for (float d=0.1; d<=1; d+=0.1) {
        float y_o = lerp(pos_y, pos_y+lado, d);
        float x_o = lerp(pos_x+lado, pos_x, d);
        line(x_o, y_o, pos_x+lado, y_o);
      }
  
      break;
    case 4: 
      fill(0);
      rect(pos_x, pos_y, lado, lado);
      break;
    case 5: 
      stroke(0);
      for (float d=0; d<=0.99; d+=0.1) {
        float y_o = lerp(pos_y, pos_y+lado, d);
        line(pos_x, y_o, pos_x+lado, y_o);
      }
      break;
    case 6:
      stroke(0);
      for (float d=0.25; d<=1; d+=0.25) {
        float y_o = lerp(pos_y, pos_y+lado, d);
        float x_o = lerp(pos_x, pos_x+lado, d);
        line(pos_x, y_o, x_o, pos_y);
      }
      for (float d=0.25; d<=1; d+=0.25) {
        float y_o = lerp(pos_y, pos_y+lado, d);
        float x_o = lerp(pos_x, pos_x+lado, d);
        line(x_o, pos_y+lado, pos_x+lado, y_o);
      }
      break;
    case 7: 
      stroke(0);
      for (float d=0; d<=0.99; d+=0.1) {
        float y_o = lerp(pos_y, pos_y+lado, d);
        float x_o = lerp(pos_x+lado, pos_x, d);
        line(x_o, y_o, pos_x+lado, y_o);
      }
      noStroke();
      fill(0);
      triangle(pos_x, pos_y, pos_x+lado, pos_y, pos_x, pos_y+lado);
      break;
    }
  }
  
  void update_modulo(){
    //muda_valor_r();
    
    // ver o de cima se nao tiver ja sido mudado e se existir
    int cima = grelha_contem(posicao-res);
    if(cima > -1){
      if(!grelha.get(cima).mudado){
        println(posicao+" - o mod(C): "+cima+ " esta "+ grelha.get(cima).mudado);
        grelha.get(cima).muda_valor();
      }
    }
    
    // ver o da esquerda se nao tiver ja sido mudado e se existir
    int esquerda = grelha_contem(posicao-1);
    if(esquerda > -1){
      if(!grelha.get(esquerda).mudado){
        println(posicao+" - o mod(E): "+esquerda+ " esta "+ grelha.get(esquerda).mudado);
        //grelha.get(cima).muda_valor();
      }
    }
    
    // ver o de baixo se nao tiver ja sido mudado e se existir
    int baixo = grelha_contem(posicao+res);
    if(baixo > -1){
      if(!grelha.get(baixo).mudado){
        println(posicao+" - o mod(B): "+baixo+ " esta "+ grelha.get(baixo).mudado);
        //grelha.get(cima).muda_valor();
      }
    }
    
    // ver o da direita se nao tiver ja sido mudado e se existrir
    int direita = grelha_contem(posicao+1);
    if(direita > -1){
      if(!grelha.get(direita).mudado){
        println(posicao+" - o mod(D): "+direita+ " esta "+ grelha.get(direita).mudado);
        //grelha.get(cima).muda_valor();
      }
    }
  }
  
  void muda_valor(){
    
    ArrayList<Integer> possibilidades = new ArrayList<Integer>();
        
    //ver vizinho de cima e se existir acrescentar as possibilidades
    int cima = grelha_contem(posicao-res);
    if(cima > -1){
      int v_cima = grelha.get(cima).valor;
      for(Integer val : dados.get(v_cima).get(2)){
        possibilidades.add(val);
      }      
    }
    
    //ver vizinho da direita e se existir acrescentar as possibilidades
    int direita = grelha_contem(posicao+1);
    if(direita > -1){
      int v_direita = grelha.get(direita).valor;
      for(Integer val :dados.get(v_direita).get(3)){
        possibilidades.add(val);
      }
    }
    
    //ver vizinho de baixo e se existir acrescentar as possibilidades
    int baixo = grelha_contem(posicao+res);
    if(baixo > -1){
      int v_baixo = grelha.get(baixo).valor;
      for(Integer val :dados.get(v_baixo).get(0)){
        possibilidades.add(val);
      }
    }
    
    
    //ver vizinho da esquerda e se existir acrescentar as possibilidades
    int esquerda = grelha_contem(posicao-1);
    if(esquerda > -1){
      int v_esquerda = grelha.get(esquerda).valor;
      for(Integer val :dados.get(v_esquerda).get(1)){
        possibilidades.add(val);
      }
    }
    
    possibilidades = apenas_iguais(possibilidades);
    
    println(possibilidades);
    
  }
  
  
  
  
}




void definirInicio() {
  for (int linha=0; linha < res; linha++) {
    for (int col=0; col < res; col++) {

      int valor = 0;
      Integer[] possibilidades_ant, possibilidades_cima;      
      int posicao_actual = linha*res+col;
      ArrayList<Integer> possibilidades = new ArrayList<Integer>();

      //primeira linha (não tem vixinhos em cima)
      if (linha == 0) {
        if (col == 0) {
          //posicao(0,0)
          int aux = floor(random(0, 7));
          possibilidades.add(aux);
        }
        else {
          // ver quais as possibilidades consoante o anterior
          possibilidades = toArrayList(dados.get(grelha.get(posicao_actual-1).valor).get(1));
        }
      }

      // restantes linhas
      else if (linha != 0) {
        if (col == 0) { 
          possibilidades = toArrayList(dados.get(grelha.get(posicao_actual-res).valor).get(2));
        }
        else {

          possibilidades_ant = dados.get(grelha.get(posicao_actual-1).valor).get(1);
          possibilidades_cima = dados.get(grelha.get(posicao_actual-res).valor).get(2);
          possibilidades = apenas_comuns(possibilidades_ant, possibilidades_cima);
        }
      }

      if (possibilidades.size() == 0) {
        valor = 6;
      }
      else {
        valor = possibilidades.get(floor(random(0, possibilidades.size())));
      } 
      if (valor == valor_anterior) {
        repetidos++;
      }
      
      // correcçoes =X
      if (linha!=0) {
        if (grelha.get(posicao_actual-res+1).valor == 2 && valor == 0) {
          set_elemento_grelha(posicao_actual-res+1, 4);
        }
        if (grelha.get(posicao_actual-res+1).valor == 4 && valor == 6) {
          set_elemento_grelha(posicao_actual-res+1, 2);
        }
      }
      valor_anterior = valor;
      grelha.add( new Modulo(posicao_actual, col*lado, linha*lado, valor));
    }
  }
}


ArrayList<ArrayList<Integer[]>> dados = new ArrayList<ArrayList<Integer[]>>();


void definirGramatica() {
  
  // 0
  dados.add(new ArrayList<Integer[]>());
  dados.get(dados.size()-1).add(new Integer[] {0, 5, 3, 7});
  dados.get(dados.size()-1).add(new Integer[] {0, 2, 4, 7});
  dados.get(dados.size()-1).add(new Integer[] {1, 0, 5, 6});
  dados.get(dados.size()-1).add(new Integer[] {0, 6, 7});
  
  // 1
  dados.add(new ArrayList<Integer[]>());
  dados.get(dados.size()-1).add(new Integer[] {5, 6, 7});
  dados.get(dados.size()-1).add(new Integer[] {0, 4, 6, 7});
  dados.get(dados.size()-1).add(new Integer[] {4, 2, 5, 7});
  dados.get(dados.size()-1).add(new Integer[] {5, 7});
  
  // 2
  dados.add(new ArrayList<Integer[]>());
  dados.get(dados.size()-1).add(new Integer[] {1, 4});
  dados.get(dados.size()-1).add(new Integer[] {0, 6});
  dados.get(dados.size()-1).add(new Integer[] {1, 6});
  dados.get(dados.size()-1).add(new Integer[] {0, 4});
  
  // 3
  dados.add(new ArrayList<Integer[]>());
  dados.get(dados.size()-1).add(new Integer[] {0, 6});
  dados.get(dados.size()-1).add(new Integer[] {5});
  dados.get(dados.size()-1).add(new Integer[] {0,5});
  dados.get(dados.size()-1).add(new Integer[] {6});
  
  // 4
  dados.add(new ArrayList<Integer[]>());
  dados.get(dados.size()-1).add(new Integer[] {1, 4});
  dados.get(dados.size()-1).add(new Integer[] {0, 2, 4, 6, 7});
  dados.get(dados.size()-1).add(new Integer[] {1, 2, 4, 7});
  dados.get(dados.size()-1).add(new Integer[] {0, 1, 4});
  
  // 5
  dados.add(new ArrayList<Integer[]>());
  dados.get(dados.size()-1).add(new Integer[] {5, 6, 7});
  dados.get(dados.size()-1).add(new Integer[] {1, 5});
  dados.get(dados.size()-1).add(new Integer[] {1, 0, 5});
  dados.get(dados.size()-1).add(new Integer[] {3, 5, 7});
  
  // 6
  dados.add(new ArrayList<Integer[]>());
  dados.get(dados.size()-1).add(new Integer[] {0, 2, 6});
  dados.get(dados.size()-1).add(new Integer[] {3, 6, 0});
  dados.get(dados.size()-1).add(new Integer[] {1, 3, 5, 6});
  dados.get(dados.size()-1).add(new Integer[] {2, 4, 6});
  
  // 7
  dados.add(new ArrayList<Integer[]>());
  dados.get(dados.size()-1).add(new Integer[] {0, 4});
  dados.get(dados.size()-1).add(new Integer[] {0, 5, 1});
  dados.get(dados.size()-1).add(new Integer[] {0, 5, 1});
  dados.get(dados.size()-1).add(new Integer[] {0, 4, 1});
  
}