int N = 150;
//System parameters
float diffU;
float diffV;
float paramF;
float paramK;
boolean rndInitCondition = false;
float[][] U = new float[N][N];
float[][] V = new float[N][N];
float[][] cH = new float[N][N];
float[][] cB = new float[N][N];
float[][] dU = new float[N][N];
float[][] dV = new float[N][N];
int[][] offset = new int[N][2];
int space = 5;
void generateInitialState() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
U[i][j] = 1.0;
V[i][j] = 0.0;
cH[i][j] = (float)(1.3-U[i][j]*1.3);
cB[i][j] = (float)(1-U[i][j]);
}
}
}
void setup() {
size(750,750);
//fullScreen();
frameRate(25);
smooth();
colorMode(HSB,1.0);
//Set default parameters;
diffU = 0.16;
diffV = 0.08;
paramF = 0.035;
paramK = 0.06;
rndInitCondition = true;
//Populate U and V with initial data
generateInitialState();
//Set up offsets
for (int i = 1; i < N-1; i++) {
offset[i][0] = i-1;
offset[i][1] = i+1;
}
offset[0][0] = N-1;
offset[0][1] = 1;
offset[N-1][0] = N-2;
offset[N-1][1] = 0;
}
void timestep(float F, float K, float diffU, float diffV) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int p = i + j*N;
float u = U[i][j];
float v = V[i][j];
int left = offset[i][0];
int right = offset[i][1];
int up = offset[j][0];
int down = offset[j][1];
float uvv = u*v*v;
float lapU = (U[left][j] + U[right][j] + U[i][up] + U[i][down] - 4*u);
float lapV = (V[left][j] + V[right][j] + V[i][up] + V[i][down] - 4*v);
dU[i][j] = diffU*lapU - uvv + F*(1 - u);
dV[i][j] = diffV*lapV + uvv - (K+F)*v;
}
}
for (int i= 0; i < N; i++) {
for (int j = 0; j < N; j++){
U[i][j] += dU[i][j];
V[i][j] += dV[i][j];
}
}
}
void draw(){
background(color(0.0,0.0,0.1));
for (int k = 0; k < 20; k++) {
timestep(paramF, paramK, diffU, diffV);
}
// Draw points
noStroke();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cH[i][j] = (float)(1.3-U[i][j]*1.3);
cB[i][j] = (float)(1-U[i][j]);
color c = color((float)(1.3-U[i][j]*1.3), 0.87, (float)(1-U[i][j]));
set(i*space + (width-N*5)/2,j*space +(height-N*5)/2,c);
}
}
for (int i = 0; i < N*space-space; i++) {
for (int j = 0; j < N*space-space; j++) {
if((i%space != 0) || (j%space !=0)){
float x = i;
float x1 = int(i/space)*space;
float x2 = x1 + space;
float y = j;
float y1 = int(j/space)*space;
float y2 = y1 + space;
float cH1 = (x2 - x)/(x2 - x1)*cH[int(i/space)][int(j/space)] + ((x - x1)/(x2 - x1))*cH[int(i/space)+1][int(j/space)] ;
float cH2 = ((x2 - x)/(x2 - x1))*cH[int(i/space)][int(j/space)+1] + ((x - x1)/(x2 - x1))*cH[int(i/space)+1][int(j/space)+1];
float cHH = ((y2 - y)/(y2 - y1))*cH1 + ((y - y1)/(y2 - y1))*cH2;
float cB1 = (x2 - x)/(x2 - x1)*cB[int(i/space)][int(j/space)] + ((x - x1)/(x2 - x1))*cB[int(i/space)+1][int(j/space)] ;
float cB2 = ((x2 - x)/(x2 - x1))*cB[int(i/space)][int(j/space)+1] + ((x - x1)/(x2 - x1))*cB[int(i/space)+1][int(j/space)+1];
float cBB = ((y2 - y)/(y2 - y1))*cB1 + ((y - y1)/(y2 - y1))*cB2;
color c = color(cHH,0.87,cBB);
set(i+ (width-N*5)/2,j+(height-N*5)/2,c);
}
}
}
}
void keyPressed() {
switch (key) {
case '1':
diffU = 0.16;
diffV = 0.08;
paramF = 0.035;
paramK = 0.06;
generateInitialState();
break;
case '2':
diffU = 0.16;
diffV = 0.08;
paramF = 0.042;
paramK = 0.065;
generateInitialState();
break;
case '3':
diffU = 0.18;
diffV = 0.13;
paramF = 0.025;
paramK = 0.056;
generateInitialState();
break;
case '4':
diffU = 0.18;
diffV = 0.09;
paramF = 0.02;
paramK = 0.056;
generateInitialState();
break;
case '5':
diffU = 0.14;
diffV = 0.06;
paramF = 0.035;
paramK = 0.065;
generateInitialState();
break;
case '6':
diffU = 0.19;
diffV = 0.09;
paramF = 0.062;
paramK = 0.062;
generateInitialState();
break;
case '7':
diffU = 0.16;
diffV = 0.08;
paramF = 0.05;
paramK = 0.065;
generateInitialState();
break;
case 'r':
rndInitCondition = true;
generateInitialState();
break;
case 'n':
rndInitCondition = false;
generateInitialState();
}
}
void mouseDragged() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(dist(i,j,(mouseX-(width-N*5)/2)/space,(mouseY-(height-N*5)/2)/space) < 4){
U[i][j] = 0.5*(1 + random(-1, 1));
V[i][j] = 0.25*(1 + random(-1, 1));
}
}
}
}
void mousePressed() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(dist(i,j,(mouseX-(width-N*5)/2)/space,(mouseY-(height-N*5)/2)/space) < 4){
U[i][j] = 0.5*(1 + random(-1, 1));
V[i][j] = 0.25*(1 + random(-1, 1));
}
}
}
}