/* S0640.java * ホコリのシミュレーション * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.awt.event.*; import window.Window; public class S0640 extends Applet implements ActionListener { Button button0; Button button1; int sw =0; public void init() { button0 = new Button(" 実行 "); button1 = new Button("クリア"); add(button0); add(button1); button0.addActionListener(this); button1.addActionListener(this); } public void actionPerformed(ActionEvent e) { String label = e.getActionCommand(); if (label.equals(" 実行 ")) sw = 1; else sw = 0; repaint(); } public void paint(Graphics g) { Window w ; w = new Window(); int SPACE = 30; int HIGHT = 400; int WIDTH = 640; int PARTICLE = 1000; /* 粒子の数 */ double MAX = 50.0; long T_END = 10000; double x[] = new double[PARTICLE]; double y[] = new double[PARTICLE]; int i; /* 粒子のカウンタ */ long t = 0; double th; double l; /*グラフィックの準備*/ w.setWindow(0, -MAX,-MAX,MAX,MAX, SPACE,HIGHT-SPACE,HIGHT-SPACE,SPACE); w.axis(0, "", MAX, "", MAX, g); /*開始*/ if ( sw == 1) { for (i = 0; i < PARTICLE; i ++) { x[i] = MAX * (2.0 * Math.random() - 1.0); /* 始めは一様に分布 */ y[i] = MAX * (2.0 * Math.random() - 1.0); g.setColor(Color.green); w.putPixel(0, x[i], y[i], g); } /*メイン*/ while (t < T_END) { for (i = 0; i < PARTICLE; i ++) { g.setColor(Color.white); w.putPixel(0, x[i], y[i], g); th = 2.0 * Math.PI * Math.random(); l = (Math.sqrt(2.0) * MAX - Math.sqrt(x[i] * x[i] + y[i] * y[i])) / MAX; x[i] = x[i] + l * Math.cos(th); y[i] = y[i] + l * Math.sin(th); if (x[i] >= MAX) { x[i] = 2*MAX - x[i];} /* 反射 右の壁 */ if (x[i] <= -MAX) { x[i] = -2*MAX - x[i];} /* 反射 左の壁 */ if (y[i] >= MAX) { y[i] = 2*MAX - y[i];} /* 反射 上の壁 */ if (y[i] <= -MAX) { y[i] = -2*MAX - y[i];} /* 反射 下の壁 */ g.setColor(Color.blue); w.putPixel(0, x[i], y[i], g); } w.axis(0, "", MAX, "", MAX ,g); t = t + 1; } stop(); } } }