int size = 10; int eyeSize = 30; int interStates = 8; int[][] state = new int[size][size]; int[][] ising = new int[size][size]; int[][] speed = new int[size][size]; void setup() { size(size*eyeSize,size*eyeSize); smooth(); framerate(10); for(int i = 0;i interStates) state[x][y] = interStates; else if(state[x][y]< -interStates) state[x][y] = -interStates; int es2 = eyeSize/2; int posX = eyeSize*x+es2; int posY = eyeSize*y+es2; ellipseMode(CENTER); fill(255); stroke(0); beginShape(POLYGON); vertex(posX-es2,posY); bezierVertex(posX-es2,posY-eyeSize*2/3, posX+es2,posY-eyeSize*2/3, posX+es2,posY ); bezierVertex(posX+es2,posY+eyeSize*2/3, posX-es2,posY+eyeSize*2/3, posX-es2,posY ); endShape(); // if eye is completely closed we are done if(state[x][y] != -interStates) { fill(0); float dx = (float)mouseX - posX; float dy = (float)mouseY - posY; float k = sqrt(dx*dx+dy*dy); float l = sqrt(2*size*size*eyeSize*eyeSize); l = sqrt(k*l); if(l!=0) { dx *= eyeSize/(4*l); dy *=eyeSize/(4*l); } ellipse(posX+(int)dx,posY+(int)dy,eyeSize*1/2,eyeSize*1/2); fill(255); beginShape(POLYGON); vertex(posX-es2,posY); bezierVertex(posX-es2,posY-eyeSize*2/3, posX+es2,posY-eyeSize*2/3, posX+es2,posY ); float stat = state[x][y]/(float)interStates; bezierVertex(posX+es2,posY-stat*eyeSize*2/3, posX-es2,posY-stat*eyeSize*2/3, posX-es2,posY ); endShape(); } } int sX, sY; void mousePressed() { sX = mouseX; sY = mouseY; } void mouseReleased() { if(sX == mouseX && sY == mouseY) { int i = mouseX/eyeSize; int j = mouseY/eyeSize; ising[i][j] *= -1; } }