/* S0630.java * 拡散のシミュレーション * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.awt.event.*; import window.Window; public class S0630 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 = 10000; /* 粒子の数 */ double MAX = 50.0; long T_END = 1000; double x[] = new double[PARTICLE]; /* すべての粒子は原点にある */ double y[] = new double[PARTICLE]; int i; /* 粒子のカウンタ */ long t = 0; /* 時刻 */ double th; /* θ */ double d1; /* 原点からの距離の和 */ double d; /* 原点からの距離の平均値 */ /*グラフィックの準備*/ w.setWindow(0, -MAX,-MAX,MAX,MAX, SPACE,HIGHT-SPACE,HIGHT-SPACE,SPACE); w.axis(0, "", MAX, "", MAX, g); w.setWindow(1, 0,0,T_END,MAX, HIGHT,HIGHT/2,WIDTH-SPACE,SPACE); w.axis(1, "時間", T_END / 5, "原点からの平均距離", MAX / 5, g); w.moveTo(1, 0.0, 0.0, g); /*メイン*/ if ( sw == 1) { while (t < T_END) { d1 = 0.0; for (i = 0; i < PARTICLE; i ++) { th = 2.0 * Math.PI * Math.random(); if (x[i] <= MAX && x[i] >= -MAX && y[i] <= MAX && y[i] >= -MAX) { g.setColor(Color.white); w.putPixel(0, x[i], y[i], g);} /* 前の粒子の位置を消す */ x[i] = x[i] + Math.cos(th); y[i] = y[i] + Math.sin(th); if (x[i] <= MAX && x[i] >= -MAX && y[i] <= MAX && y[i] >= -MAX) { g.setColor(Color.blue); w.putPixel(0, x[i], y[i], g); } /* 次の粒子の位置を表示 */ d1 = d1 + Math.sqrt(x[i] * x[i] + y[i] * y[i]); } w.axis(0, "",MAX,"",MAX, g); /* 消された軸を再度書く */ d = (double)(d1 / PARTICLE); t = t + 1; w.lineTo(1, t, d, g); } stop(); } } }