// particles that move around import javax.swing.*; import java.awt.*; import java.applet.*; import java.text.*; public class Thermo extends JApplet { int numcircs; int x[]; int y[]; int r[]; // position and radius of the circles Color c[]; int dx[]; int dy[]; // trajectory of circles boolean stuck[]; int min_r; int max_r; int max_v; int transfer; int heat; int mono_color; int sound_num; int delay; AudioClip sounds[]; public void init() { int i; min_r = Integer.parseInt(getParameter("min_r")); max_r = Integer.parseInt(getParameter("max_r")); max_v = Integer.parseInt(getParameter("max_v")); transfer = Integer.parseInt(getParameter("transfer")); heat = Integer.parseInt(getParameter("heat")) - 1; delay = Integer.parseInt(getParameter("delay")); mono_color = Integer.parseInt(getParameter("mono_color")); sound_num = Integer.parseInt(getParameter("sound")); numcircs = Integer.parseInt(getParameter("numcircles")); /* x = new int [numcircs]; y = new int [numcircs]; r = new int [numcircs]; // position and radius of the circle dx = new int [numcircs]; dy = new int [numcircs]; // trajectory of circle c = new Color[numcircs]; */ //static x = new int [1000]; y = new int [1000]; r = new int [1000]; // position and radius of the circle dx = new int [1000]; dy = new int [1000]; // trajectory of circle c = new Color[1000]; stuck = new boolean[1000]; for (i=0; i 0) { g.setColor(Color.RED); //hot thickness = heat*2; } else { g.setColor(Color.BLACK); thickness = 2; } g.fillRect(0,0,getWidth(),thickness*2); //wall borders top g.fillRect(0,0,thickness*2,getHeight()); //left g.fillRect(0,getHeight()-thickness*2,getWidth(),thickness*2); //bottom g.fillRect(getWidth()-thickness*2,0,thickness*2,getHeight() ); //right double sumMove=0; for (int i=0; i 0) dx[i] -= heat; if (dx[i] < 0) dx[i] = -dx[i]; //reverse to right if (dx[i] == 0) stuck[i] = true; if (stuck[i] && heat>0) { //stuck to left wall x[i] += r[i]; stuck[i] = false; dx[i] = 1; } } else if (x[i] + r[i] + dx[i] >= getWidth()) { //right wall //else if (x[i] + r[i] >= getWidth()) { //right wall //if (heat < 0) //cold wall dx[i] += heat; //add abs. value to slow down //else if (heat > 0) // dx[i] += heat; //sub the pos. heat to speed up leftward if (dx[i] > 0) dx[i] = -dx[i]; //reverse to left. dx<0 if (dx[i] == 0) stuck[i] = true; //if (heat > 0 && dx[i] <= 0) { //stuck to right wall if (heat > 0 && stuck[i]) { //stuck to right wall x[i] -= r[i]; stuck[i] = false; dx[i] = -1; } } else if (y[i] - r[i] + dy[i] <= 0) { //top wall //else if (y[i] - r[i] <= 0) { //top wall //going up: dy<0 //if (heat < 0) // dy[i] -= heat; //else if (heat > 0) dy[i] -= heat; if (dy[i] < 0) dy[i] = -dy[i]; if (heat>0 && dy[i] <= 0) { //stuck to top wall // y[i] += r[i]; dy[i] = 1; } } else if (y[i] + r[i] + dy[i] >= getHeight()) { //bottom wall //else if (y[i] + r[i] >= getHeight()) { //bottom wall //going down: dy>0 //if (heat < 0) dy[i] += heat; //dy less neg->slower //else if (heat > 0) // dy[i] -= heat; //dy more neg->faster if (dy[i] > 0) dy[i] = -dy[i]; //turn to go up. dy<0 if (heat > 0 && dy[i] <= 0) {//stuck to bottom wall // y[i] -= r[i]; dy[i] = -1; } } /* if (dx[i] < 0) { //neg. dx, subtract the heat value dx[i] -= heat; if (dx[i] < -max_v) dx[i] = -max_v; } //**check for max_v else if (dx[i] > 0) { dx[i] += heat; //pos. dx, add the heat value if (dx[i] > max_v) dx[i] = max_v; } }*/ /* if (dy[i] < 0) { //neg. dy, subtract the heat value dy[i] -= heat; if (dy[i] < -max_v) dy[i] = -max_v; } else if (dy[i] > 0){ dy[i] += heat; //pos. dy, add the heat value if (dy[i] > max_v) dy[i] = max_v; } }*/ sumMove += Math.sqrt(dx[i]*dx[i]+dx[i]*dx[i]); //length of move. "temperature" energy //sumMove += () // Move the circle. x[i] += dx[i]; y[i] += dy[i]; g.setColor(c[i]); g.fillOval(x[i]-r[i],y[i]-r[i],2*r[i],2*r[i]); } g.setFont( new Font( "SansSerif", Font.BOLD, 16 ) ); g.setColor(Color.BLACK); g.drawString("TEMPERATURE: "+d2.format(sumMove/numcircs), 5,20 ); //check for collisions for (int i=0; i 0) { // Ith more energetic than Jth, transfer 1 from its max abs component to J's min abs component if (Math.abs(dx[i])+Math.abs(dy[i]) > Math.abs(dx[j])+Math.abs(dy[j])+1) { if (Math.abs(dx[i]) > Math.abs(dy[i])) //I's dx bigger, so lessen it if (dx[i] < 0) dx[i]++; else dx[i]--; else //dy is bigger, lessen it if (dy[i] < 0) dy[i]++; else dy[i]--; if (Math.abs(dx[j]) < Math.abs(dy[j])) //J's dx is smaller, so increase it if (dx[j] < 0) dx[j]--; else dx[j]++; else //dy is smaller, increase it if (dy[j] < 0) dy[j]--; else dy[j]++; } // Jth more energetic than Ith, transfer 1 from its max abs component to I's min abs component if (Math.abs(dx[j])+Math.abs(dy[j]) > Math.abs(dx[i])+Math.abs(dy[i])+1) { if (Math.abs(dx[j]) > Math.abs(dy[j])) //J's dx bigger, so lessen it if (dx[j] < 0) dx[j]++; else dx[j]--; else //dy is bigger, lessen it if (dy[j] < 0) dy[j]++; else dy[j]--; if (Math.abs(dx[i]) < Math.abs(dy[i])) //I's dx is smaller, so increase it if (dx[i] < 0) dx[i]--; else dx[i]++; else //dy is smaller, increase it if (dy[i] < 0) dy[i]--; else dy[i]++; } } if (sound_num>0 && sound_num<5) sounds[sound_num].play(); else if (sound_num == 5) sounds[(int)((Math.random())*4) + 1].play(); //random 1-4 } } } try { Thread.sleep(delay); } catch (InterruptedException e) { ; } } //infinite loop } }