Basé sur la « Diamond Theory » de Steven H Cullinane
/* 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"; */ var bits = [ 0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 2, 3, 2, 3 ]; var lsize = 10; function setup() { createCanvas(int(lsize*4+100)*5, int(lsize*4+100)*5); background(255); smooth(); redraw(); noStroke(); } function draw() { background(255); for (var i=0; i<10; i++) { for (var j=0; j<10; j++) { randss(); push(); translate(i*(width/lsize)+lsize*3, j*(height/lsize)+lsize*3); drawTriangle(bits); pop(); } } randss(); if (frameCount>50) { noLoop(); } } function drawTriangle(bits) { push(); translate(-lsize*4/2, -lsize*4/2); for (var x=0;x<4;x++) { for (var y=0;y<4;y++) { var i = x + y*4; // pushStyle(); fill(0); push(); 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(); pop(); } } pop(); } /*leva l1 para l2 */ function transposeRow(bits, r0, r1) { var temp = [4]; //temp[i] = new int[4]; for (var x=0;x<4;x++) { //keep the values from row r0 on temp var i = x + r0*4; temp[x] = bits[i]; // put on row r0 values from row r1 var i2 = x + r1*4; bits[i] = bits[i2]; //put on row r1 values from r0 i.e. from temp bits[i2] = temp[x]; } } function transposeColumn(bits, c0, c1) { var temp = [4]; for (var y=0;y<4;y++) { //keep the values from column c1 on temp var i = c0 + y*4; temp[y] = bits[i]; //put on column c0 values from column c1 var i2 = c1 + y*4; bits[i] = bits[i2]; //put on column c1 values from column c0 i.e. temp bits[i2] = temp[y]; } } function transposeQuadrant(bits, q0, q1) { var temp = [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| var x0q0 = (q0%2)*2; var y0q0; if (q0>1) { y0q0 =2; } else { y0q0 =0; } var x0q1 = (q1%2)*2; var y0q1; if (q1>1) { y0q1 =2; } else { y0q1 =0; } var c=0; for (var i=0;i<2;i++) { for (var 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++; } } } function 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))); } function mousePressed() { randss(); redraw(); }