// TODOs // - Screen saver? public class WarmCold extends PApplet{ static public void main(String args[]) { //PApplet.main(new String[] { "", "--present", "WarmCold" }); PApplet.main(new String[] { "WarmCold" }); } float[][] colorArr; int w = 600; int h = 400; //int w = screen.width; //int h = screen.height; int nx = 15; // 20 int sqSize = floor(w/float(nx)); int ny = floor(h/float(sqSize)); int shiftX = round( (w-sqSize*nx) /2. ); int shiftY = round( (h-sqSize*ny) /2. ); Point[] coldPoints; int nColdPointsMax = 8; Point[] warmPoints; int nWarmPointsMax = 7; float hueMinDiff = 0.06; float hueColdLow = 0.4; float hueColdHigh = 0.71; //0.71 float hueWarmLow = 0.0; float hueWarmHigh = hueColdLow; float huePointDiff = 0.0002; float hueFluctuation = 0.0005; float diffConstH = 0.05; float diffConstV = 0.005; float coldPointCoupling = 0.03; float warmPointCoupling = 0.02; float moveWarmProb = 0.001; float moveColdProb = 0.001; void setup() { size(w, h); colorMode(HSB, 1.0); background(color(1.,0.,0.)); frameRate(20); colorArr = new float[nx][ny]; colorArr = randomize(); coldPoints = new Point[nColdPointsMax]; initializeColdPoints(); warmPoints = new Point[nWarmPointsMax]; initializeWarmPoints(); noStroke(); } void draw() { colorArr = diffuse(colorArr); //diffuse2(); for (int i=0; i= coldPoints[i].hue) { diff = sqrt((tmpArr[coldPoints[i].x][coldPoints[i].y] -coldPoints[i].hue))*coldPointCoupling; } else { diff = -sqrt(-(tmpArr[coldPoints[i].x][coldPoints[i].y] -coldPoints[i].hue))*coldPointCoupling; } tmpArr[coldPoints[i].x][coldPoints[i].y] -= diff; // move if (random(1.) < moveColdProb) { if (round(random(1.)) > 0) { if (round(random(1.)) > 0) { // N coldPoints[i].y += 1; if (coldPoints[i].y > ny-1) coldPoints[i].y = 0; } else { // S coldPoints[i].y -= 1; if (coldPoints[i].y < 0) coldPoints[i].y = ny-1; } } else { if (round(random(1.)) > 0) { // W - dont use warm space coldPoints[i].x -= 1; if (coldPoints[i].x < 1) coldPoints[i].x = nx-2; } else { // E - dont use warm space coldPoints[i].x += 1; if (coldPoints[i].x > nx-2) coldPoints[i].x = 1; } } // change hue float hue = random(hueColdHigh-huePointDiff, hueColdHigh); coldPoints[i].hue = hue; } } return tmpArr; } float[][] setWarmPoints(float[][] tmpArr) { for (int i=0; i= warmPoints[i].hue) { diff = sqrt(sqrt((tmpArr[warmPoints[i].x][warmPoints[i].y] -warmPoints[i].hue)))*warmPointCoupling; } else { diff = -sqrt(sqrt(-(tmpArr[warmPoints[i].x][warmPoints[i].y] -warmPoints[i].hue)))*warmPointCoupling; } //float diff = (tmpArr[warmPoints[i].x][warmPoints[i].y] -warmPoints[i].hue)*warmPointCoupling; tmpArr[warmPoints[i].x][warmPoints[i].y] -= diff; // move up or down if (random(1.) < moveWarmProb) { if (round(random(1.)) > 0) { warmPoints[i].y += 1; if (warmPoints[i].y > ny-1) warmPoints[i].y = 0; } else { warmPoints[i].y -= 1; if (warmPoints[i].y < 0) warmPoints[i].y = ny-1; } // change hue float hue = random(hueWarmLow, hueWarmLow+huePointDiff); warmPoints[i].hue = hue; } // move to other side if (random(1.) < moveWarmProb/2.) { if (warmPoints[i].x == 0) { warmPoints[i].x = nx-1; } else { warmPoints[i].x = 0; } // change hue float hue = random(hueWarmLow, hueWarmLow+huePointDiff); warmPoints[i].hue = hue; } } return tmpArr; } void initializeColdPoints() { for (int i=0; i