Diamond Theory Roullete

Radames Ajna


Based on: Diamond Theory by Steven H Cullinane, 1977

Category: experimental


Description:

This sketch is running in the browser.






/* 
Part of the ReCode Project (http://recodeproject.com)
Based on "Diamond Theory" by Steven H Cullinane
Originally published in "Computer Graphics and Art" v2n1, 1977
Copyright (c) 2013 Radames Ajna - OSI/MIT license (http://recodeproject/license).
*/

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

int bits[] = {
  0, 1, 0, 1, 
  2, 3, 2, 3, 
  0, 1, 0, 1, 
  2, 3, 2, 3
};

float lsize = 100;

long lastTime;
long accTime;

float v=1;
void setup() {
  size(int(lsize*4+100), int(lsize*4+100));
  background(255);
  smooth();

  randss();
  redraw();
  //noLoop();
  noStroke();
  lastTime = millis();
  accTime = millis();
}


void draw() {

  background(255);
  pushMatrix();
  translate(width/2, height/2);
  drawTriangle(bits);
  popMatrix();

  if (millis()-lastTime<5000) {
    v+=exp(0.0005*millis());
    //  println(v); 
    if (millis() - accTime > v) {
      accTime=millis();
      randss();
    }
  }
  else {
    noLoop();
  }
}

void drawTriangle(int bits[]) {
  pushMatrix();
  translate(-lsize*4/2, -lsize*4/2);
  for (int x=0;x<4;x++) {
    for (int y=0;y<4;y++) {
      int i = x + y*4;
      pushStyle();
      fill(0);
      pushMatrix();
      translate(x*lsize, y*lsize);
      beginShape(TRIANGLES);
      switch(bits[i]) {

      case 0:
        // bottom right
        //triangle(lsize, lsize, 0, lsize, lsize, 0);
        vertex(lsize, lsize);
        vertex(0, lsize);
        vertex(lsize, 0);


        break;
      case 1:
        ///bottom left
        //triangle(0, 0, 0, lsize, lsize, lsize);
        vertex(0, 0);
        vertex(0, lsize);
        vertex(lsize, lsize);
        break;
      case 2:
        //top right
        //triangle(0, 0, lsize, 0, lsize, lsize);
        vertex(0, 0);
        vertex(lsize, 0);
        vertex(lsize, lsize);
        break;
      case 3:
        //top left
        //triangle(0, 0, lsize, 0, 0, lsize);
        vertex(0, 0);
        vertex(lsize, 0);
        vertex(0, lsize);
        break;
      }
      endShape(CLOSE);
      popStyle();
      popMatrix();
    }
  }
  popMatrix();
}



/*leva l1 para l2 */
void transposeRow(int bits[], int r0, int r1) {
  int temp[] = new int[4];

  for (int x=0;x<4;x++) {
    //keep the values from row r0 on temp
    int i = x + r0*4;
    temp[x] = bits[i];

    // put on row r0 values from row r1
    int i2 = x + r1*4;
    bits[i] = bits[i2];
    //put on row r1 values from r0 i.e. from temp
    bits[i2] = temp[x];
  }
}

void transposeColumn(int bits[], int c0, int c1) {
  int temp[] = new int[4];

  for (int y=0;y<4;y++) {
    //keep the values from column c1 on temp
    int i = c0 + y*4;
    temp[y] = bits[i];

    //put on column c0 values from column c1
    int i2 = c1 + y*4;
    bits[i] = bits[i2];

    //put on column c1 values from column c0 i.e. temp
    bits[i2] = temp[y];
  }
}

void transposeQuadrant(int bits[], int q0, int q1) {
  int temp[] = new int[4];

  //given a q0 - quadrant 0,1,2,3 
  // |0|1|
  // |2|3|
  //returns x,y initial coordinates 
  // |00|10|20|30|
  // |01|11|21|31|
  // |02|12|22|32|
  // |03|13|23|33| 

  int x0q0 = (q0%2)*2;
  int y0q0;
  if (q0>1) {
    y0q0 =2;
  }
  else {
    y0q0 =0;
  }

  int x0q1 = (q1%2)*2;
  int y0q1;
  if (q1>1) {
    y0q1 =2;
  }
  else {
    y0q1 =0;
  }

  int c=0; 
  for (int i=0;i<2;i++) {
    for (int j=0;j<2;j++) {
      temp[c] = bits[x0q0+i + (y0q0+j)*4];
      bits[x0q0+i + (y0q0+j)*4] = bits[x0q1+i + (y0q1+j)*4];
      bits[x0q1+i + (y0q1+j)*4] = temp[c];
      c++;
    }
  }
}



void randss() {
  transposeRow(bits, (int)random(0, 4), (int)random(0, 4));
  transposeColumn(bits, (int)random(0, 4), (int)random(0, 4));
  transposeQuadrant(bits, (int)random(0, 4), (int)random(0, 4));
}

void mousePressed() {
  randss();
  redraw();
}