Travelling Through the Square Series

Sermad Buni


Based on: Traveling Through the Square Series by Roger Coqart, 1976

Category: direct


Description:

This sketch is running in the browser.






/* 
Part of the ReCode Project (http://recodeproject.com)
Based on "Traveling Through the Square Series" by Roger Coqart
Originally published in "Computer Graphics and Art" vol1 no3, 1976
Copyright (c) 2012 Sermad Buni - OSI/MIT license (http://recodeproject/license).
*/

 // globals
  int square_size = 40;
  int canvaswidth = 16;
  int canvasheight = 9;
  
  Square[][] squares = new Square[canvaswidth][canvasheight];

void setup() {
    
    strokeWeight(1);
    
    smooth(8);
    
    // set the size of the canvas
    size( (canvaswidth + 2) * square_size, (canvasheight + 2) * square_size, P2D );
    
    // set the background of the canvas
    background(#ffffff);
    
    // by default squares are drawn with a filled colour
    // so we need to turn this off 
    noFill();
    
    // we need to make a loop in a loop 
    
    for(int i=0; i < canvaswidth; i++) {
    
      for(int j=0; j < canvasheight; j++) {
      
        squares[i][j] = new Square(i, j);
        
        squares[i][j].display();
    
      }
 
    }
    
 // finished!
 save("traveling_through_square_series.jpg");
    
}

class Square {
  
    int i, j, type;

    int tri_padding = 3;
    int tri_length = square_size-tri_padding;
    
    boolean top_open;
    boolean right_open;
    boolean bottom_open;
    boolean left_open;
  
  Square (int i_,  int j_) {
    
    i = i_;
    j = j_;

    //type = 0;
    //type = 1;
    // set the triange type - big or small
    type = int (random(2));
    
    // assign one side randonly to be blank
    // but match up two blank sides
    setRandomSide();

  }
  
  boolean checkRandomSide() {
   
    if(top_open || bottom_open || left_open || right_open) {
      return true;
    } else {
     return false; 
    }
    
  }
  
  void setRandomSide() {
    
    /// check if we are not on the first column
    if(i > 0) {
      
    // check if the square to the left has a space open to the right
    // if so then this square needs to open to the left
      
      if(squares[i-1][j].right_open) {
        
        left_open = true;
        
      }

    }
   
    if(j > 0) { // check if we are on the top row
    
    // check if the square to the above has a space open to the bottom
    // if so then this square needs to open to the top
      if(squares[i][j-1].bottom_open) {
        
        top_open = true;
        
      }
      
    }
     
    // check if we are not on the bottom row
    if(j < canvasheight-1 && !checkRandomSide() ) {
      bottom_open = generateRandom();
    }
    
    // check if we are not on far right column
    if( i < canvaswidth-1 && !checkRandomSide() ) {
      right_open = generateRandom();
    }
    
  }
  
  boolean generateRandom() {
    
    int R = int (random(1));
    
    if(R == 0) {
      return true; 
    } else {
      return true;
    }
    
  }
  
  void display() {
    
  switch(type) {
    case 0:
    
    // big triangles

    pushMatrix();
    
    translate((square_size*i) + square_size, (square_size*j) + square_size);
    
    if(int (random(2)) == 0) {
  
      if(left_open) {
        

        
        beginShape();
        
        vertex(0, tri_padding);
        vertex(tri_length - tri_padding, tri_padding);
        vertex(0, tri_length - 0);
        
        endShape();
        
      } else if(top_open) {
                
        // fixed        
        beginShape();
        

        
        vertex(tri_padding, 0);
        vertex(tri_padding, tri_length - tri_padding);
        vertex(tri_length-0, 0);
        
        endShape();
        
      } else if (right_open) {
        
        // no need
        beginShape();
       
        vertex(tri_padding, tri_padding);
        vertex(tri_length-tri_padding, tri_padding);
        vertex(tri_padding, tri_length-tri_padding);
        
        
        endShape(CLOSE);
       
      } else {
     

        
        beginShape();
        
        vertex(tri_padding, tri_padding);
        vertex(tri_length-tri_padding, tri_padding);
        vertex(tri_padding, tri_length-tri_padding);
        
        endShape(CLOSE);
      }
      

  
      if(bottom_open) {
        
        // fixed

        beginShape();
        
        vertex(tri_padding+0, tri_length+tri_padding);
        
        vertex(tri_length, tri_padding+tri_padding);
        vertex(tri_length, tri_length+tri_padding);
        
        endShape();

      } else if(right_open) {
        
      beginShape();
      
      //stroke(255,0,255);
      
      vertex(tri_length + tri_padding, tri_padding + 0);
      vertex(tri_padding + tri_padding, tri_length);
      vertex(tri_length + tri_padding, tri_length);
      
       
      endShape();      
        
      }else {
        
      beginShape();
      
      vertex(tri_length, tri_padding+tri_padding);
      vertex(tri_padding+tri_padding, tri_length);
      vertex(tri_length, tri_length);
        
        endShape(CLOSE);
      }
    
    } else {

      //

      if(left_open) {
        
        // fixed
        
        beginShape();
        
        vertex(0, tri_padding+0);
        vertex(tri_length-tri_padding, tri_length);
        vertex(0, tri_length);
          
        endShape();
        
      } else if(bottom_open) {
                
        // fixed
          
        beginShape();
        
        vertex(tri_padding, tri_length+tri_padding);
        
        vertex(tri_padding, tri_padding+tri_padding);
        vertex(tri_length, tri_length+tri_padding);
        
        endShape();
      
      } else if(right_open) {
        
        // no need
        
        beginShape();
        
        
        vertex(tri_padding, tri_length);
        
        vertex(tri_padding, tri_padding+tri_padding);
        vertex(tri_length-tri_padding, tri_length);

        endShape(CLOSE);
        
      } else {
        
        beginShape();
        
        vertex(tri_padding, tri_length);
        
        vertex(tri_padding, tri_padding+tri_padding);
        vertex(tri_length-tri_padding, tri_length);
      
        endShape(CLOSE);
      }
      
  
      //
      

  
      if(top_open) {
        
        beginShape();
  
        // fixed
      
        vertex(tri_padding, 0);
        vertex(tri_length, tri_length-tri_padding);
        vertex(tri_length, 0);
        
        endShape();
        
      } else if (right_open) {
        
        // fixed
        
        beginShape();
        
        vertex(tri_length + tri_padding, tri_length - 0);
        vertex(tri_padding+tri_padding, tri_padding);
        vertex(tri_length + tri_padding, tri_padding);
        
        endShape();
      
      } else {

        beginShape();
        
        vertex(tri_length, tri_length-tri_padding);
        vertex(tri_padding+tri_padding, tri_padding);
        vertex(tri_length, tri_padding);
        
        endShape(CLOSE);
        
        
      }

    }
    
    popMatrix();

    break;
  case 1:
  
    // little triangles
  
    pushMatrix();
    translate((square_size*i) + square_size, (square_size*j) + square_size);
    
      // top
      beginShape();
  
      if(top_open) {
        
        vertex(tri_padding, 0);
        vertex(square_size/2, (square_size/2) - tri_padding);
        vertex(tri_length, 0);
      
        endShape();
        
      } else {
        
        vertex(tri_padding+tri_padding, tri_padding);
        vertex(square_size/2, (square_size/2) - tri_padding);
        vertex(tri_length-tri_padding, tri_padding);
        
        endShape(CLOSE);
      }
      
      // right
      beginShape();
  
      if(right_open) {
        
      vertex(tri_length + tri_padding, tri_padding);
      vertex( (square_size/2) + tri_padding, square_size/2);
      vertex(tri_length + tri_padding, tri_length );
        
        endShape();
        
      } else {
        
      vertex(tri_length, tri_padding+tri_padding);
      vertex( (square_size/2) + tri_padding, square_size/2);
      vertex(tri_length, tri_length - tri_padding);
        
        endShape(CLOSE);
      }
      
      // bottom
      
      beginShape();

      if(bottom_open) {
        
        vertex(tri_padding, tri_length + tri_padding );
        
        vertex(square_size/2, (square_size/2) + tri_padding );
        vertex(tri_length, tri_length + tri_padding );
  
        endShape();
        
      } else {
        
        vertex(tri_padding+tri_padding, tri_length );
        
        vertex(square_size/2, (square_size/2) + tri_padding );
        vertex(tri_length-tri_padding, tri_length );
        
        endShape(CLOSE);
      }
      
      // left

  
      if(left_open) {
        
      beginShape();
      
      vertex(0, tri_padding );
      vertex( (square_size/2) - tri_padding, square_size/2);
      vertex(0, tri_length );
        
        endShape();
      } else {
        
      beginShape();
      
      vertex(tri_padding, tri_padding+tri_padding);
      vertex( (square_size/2) - tri_padding, square_size/2);
      vertex(tri_padding, tri_length - tri_padding);
        
        endShape(CLOSE);
      }
    
    
    popMatrix();

    break;
}
    
  }

}