RP_harmonicStory

Alexandre Rivaux


Based on: Harmonic Story by Jean Claude Marquette, 1976

Category: direct


Description:

This sketch is running in the browser.






/* 
Part of the ReCode Project (http://recodeproject.com)
Based on "Harmonic Story" by Jean Claude Marquette
Originally published in "Computer Graphics and Art" v1n2, 1976
Copyright (c) 2013 Alexandre Rivaux - OSI/MIT license (http://recodeproject/license).
*/

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

Pattern[] myPattern;
int nbPattern;

void setup() 
{
  size( 500, 500, JAVA2D);
  smooth();
  background(140);
  rotate(radians(-1)); //rotation de -0.01 radian pour etre calé avec la création originale
  nbPattern = 2;
  myPattern = new Pattern[nbPattern];
  for(int i=0; i<nbPattern; i++)
  {
    myPattern[i] = new Pattern(i);
    myPattern[i].display();
  }
  
}

void draw() 
{

}

void mousePressed() 
{
  rotate(radians(-1)); //rotation de -0.01 radian pour etre calé avec la création originale
  background(140);
  for(Pattern p : myPattern)
  {
   p.update();
  }
}

/*Class Pattern*/

class Pattern
{
  /*
  l'idée ici est de dessiner une grille de 270*2
   composée de carrés de 18 pixels de cotés. (donc double boucle for)
   
   par la suite chaque couleur du carré sera définie de manière aléatoire
   et en binaire. Pour chacun des carrés nous attribuons une valeur entière
   random comprise entre 0 et 1.
   
   Si cette valeur est égales à 1 alors nous remplirons notre carré 
   avec la couleurs de fond grise.
   Si elle est égales à 0 nous n'appliquerons pas de couleur de fond.
   
   Enfin nous dessinons nos rectangles.
   
   Au clic de la souris nous regenerons le visuel.
   */
  //variables
  int widthPattern;
  int heightPattern;
  int tailleRect; 
  int greyLevel;

  float[] x;
  float[] y;
  
  float posX;
  float posY;
  
  int range;
  
  //constructor
  Pattern(int _greyLevel)
  {
    this.heightPattern = 270;
    this.widthPattern = 270;
    this.tailleRect = 18;
    this.range=0;
    this.greyLevel = int(map(_greyLevel, 0, 1, 200, 44));
    
    this.x = new float[this.widthPattern/this.tailleRect];
    this.y = new float[this.heightPattern/this.tailleRect];
    
    for(int i = 0; i< this.widthPattern/this.tailleRect; i++)
    {
      this.x[i] = i*this.tailleRect;
    }
    
    for(int j = 0; j< this.heightPattern/this.tailleRect; j++)
    {
      this.y[j] = j*this.tailleRect;
    }
    
    this.posX = this.x[int(random(1, this.x.length-2))];
    this.posY = this.y[int(random(1, this.y.length-2))];
    
  }
  //function display
  void display()
  {
    pushMatrix();
    translate(this.posX, this.posY);
    for (int i = 0; i< this.widthPattern/this.tailleRect; i++) {
      for ( int j = 0; j < this.heightPattern/this.tailleRect; j++ ) {
        this.range = (int)(random(0, 2));
        noStroke();
        if ( this.range == 1) {
          fill(this.greyLevel);
        } 
        else {
          noFill();
        }
        
        /*marge internes*/
        if(this.greyLevel==200)
        {
          if(i<2)
          {
            fill(this.greyLevel);
          }
          if(i==2)
          {
            noFill();
          }
        }
        if(this.greyLevel==44)
        {
          if(i>this.x.length-3)
          {
            fill(this.greyLevel);
          }
          if(i==this.x.length-3)
          {
            noFill();
          }
        }
        rect( i*tailleRect, j*tailleRect, tailleRect+1, tailleRect+1 );
        /*
        Ici pour éviter l'impression de bordure pour chacun des carrés du à la rotation.
         nous faisons des carrés plus grand de 1 pixel que la grille de sorte à ce qu'il
         débordent les un sur les autres.
         */
      }
    }
    popMatrix();
  }

  //update function
  void update()
  {
    this.posX = this.x[int(random(1, this.x.length-2))];
    this.posY = this.y[int(random(1, this.y.length-2))];
    display();
  }
}