xxxxxxxxxx
int sTile = 41;
color c0, c1, c2;
int[][] me, mr;
int a, b;
void setup()
{
size(820, 615);
noStroke();
colorMode(HSB, 360, 100, 100);
changeColor();
initializeMatrix();
changeMatrix();
}
void draw()
{
for (int i = 1; i < a-1; i++)
{
for (int j = 1; j < b-1; j++)
{
switch(mr[i][j])
{
case 0: fill(c0); break;
case 1: fill(c1); break;
case 2: fill(c2); break;
default: fill(255); break;
}
rect((i-1)*sTile, (j-1)*sTile, sTile, sTile);
}
}
for (int i = 1; i < a; i++)
{
for (int j = 1; j < b; j++)
{
switch(me[i][j])
{
case 0: fill(c0); break;
case 1: fill(c1); break;
case 2: fill(c2); break;
default: fill(255); break;
}
ellipse((i-1)*sTile, (j-1)*sTile, sTile, sTile);
}
}
}
/*---------------------*/
void mouseReleased() //new pattern
{
if (mouseButton == RIGHT) changeColor();
changeMatrix();
}
/*---------------------*/
void initializeMatrix()
{
//inicialize me
a = width/sTile + 2;
b = height/sTile + 2;
me = new int[a][b];
//fill first row and first column with a diferent number
for (int i = 0; i < a; i++) me[i][0] = 4;
for (int j = 0; j < b; j++) me[0][j] = 4;
//inicialize mr
mr = new int[a-1][b-1];
}
void changeMatrix()
{
//set me values
for (int i = 1; i < a; i++)
{
for (int j = 1; j < b; j++)
{
int r = int(random(3));
while (r == me[i-1][j] || r == me[i][j-1]) //compare with the left number and with the superior number
{
r = int(random(3));
}
me[i][j] = r; //if diferent, fill the place
}
}
/*---------------------*/
//set mr values
for (int i = 1; i < a - 1; i++)
{
for (int j = 1; j < b - 1; j++)
{
boolean dia1 = me[i][j] == me[i+1][j+1]; //test first diagonal
boolean dia2 = me[i+1][j] == me[i][j+1]; //teste second diagonal
if (dia1 && dia2) //if both diagonals have equal colors, choose randomly
{
if (int(random(2)) == 0) mr[i][j] = me[i][j];
else mr[i][j] = me[i+1][j];
}
else if(dia1) mr[i][j] = me[i][j];
else mr[i][j] = me[i+1][j];
}
}
}
/*---------------------*/
void changeColor()
{
float c = random(360);
c0 = color(c, 75, 100);
c1 = color((c+120)%360, 75, 100);
c2 = color((c+240)%360, 75, 100);
}