// 20090923 // Masaomi Hatakeyama // PlotArea import java.awt.*; import java.awt.event.*; // JFreeChart 用 import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.FixedMillisecond; class Molecule{ public static int MOL_NUM=1; // Particle 数(デフォルト) public static int MOL_NUM_DEC=1000; // 配列宣言時のParticle数(配列要素数) private double x0=0.0; // x初期座標 private double x=0.0; // x座標 private double x1=0.0; // 次の座標 private double y0=0.0; // y初期座標 private double y=0.0; // y座標 private double y1=0.0; // 次の座標 public Molecule(double x0, double y0){ this.x0=x0; this.y0=y0; } // アクセスメソッド public double x0(){return(x0);} public double x(){return(x);} public double x1(){return(x1);} public double y0(){return(y0);} public double y(){return(y);} public double y1(){return(y1);} public void x0(double x0){this.x0=x0;} public void x(double x){this.x=x;} public void x1(double x1){this.x1=x1;} public void y0(double y0){this.y0=y0;} public void y(double y){this.y=y;} public void y1(double y1){this.y1=y1;} // 1ステップ分 public void numericalstep1(){ // 1次元用 this.x1(this.x()+10*Math.pow((-1),(int)(2*Math.random())+1)); // -1 or +1 // 表示のため便宜上 ×10 としてある } public void numericalstep2(){ // 2次元用 int direction = (int)(4*Math.random()); // 0-3 までの乱数 if(direction==0){ // 右 this.x1(this.x()+10); }else if(direction==1){ // 左 this.x1(this.x()-10); }else if(direction==2){ // 下 this.y1(this.y()+10); }else if(direction==3){ // 上 this.y1(this.y()-10); } } // x1,y1をx,yに更新(これを呼び出すのは、すべてのAtomのx1,y1が求まった後) public void update_xy(){ this.x(this.x1()); this.y(this.y1()); } } public class PlotArea extends Canvas{ private int t=0; //ステップ数 // 以下の値は step() メソッド内で初期化される private double X0; // 原点x座標 private double Y0; // 原点y座標 private double XZ; // x軸の上限 private double YA; // y軸の下限 private double XA=20; // x軸の下限 private double YZ=20.0; // y軸の上限 private int flag=0; // 初期設定用 private Molecule[] mol = new Molecule[Molecule.MOL_NUM_DEC]; // Particle 管理用配列 // 各 Particle のデータ用 private TimeSeriesCollection data1; private TimeSeries[] series = new TimeSeries[Molecule.MOL_NUM_DEC]; // MSD データ用 private TimeSeriesCollection data2; private TimeSeries msd_series; // 2D check private boolean check2d=false; // 粒子の半径 private int ps=10; public PlotArea(){ setVisible(true); setBackground(Color.white); //描画領域の背景は白 for(int i=0; i< Molecule.MOL_NUM_DEC; i++){ mol[i] = new Molecule(0.0, 0.0); } // 初期座標 for(int i=0; i-XZ+250; i-=50){ g.drawLine((int)X0+i, (int)Y0, (int)X0+i, (int)Y0-3); g.drawString(Integer.toString(i/10), (int)X0+i-20, (int)Y0+20); } // y軸 g.drawLine((int)X0, (int)Y0, (int)X0, (int)Y0-30); }else{ // 2次元用 // x軸 g.drawLine((int)XA, (int)Y0, (int)XZ, (int)Y0); g.drawLine((int)XZ, (int)Y0, (int)XZ-5, (int)Y0-5); // 右側矢印左上向 g.drawLine((int)XZ, (int)Y0, (int)XZ-5, (int)Y0+5); // 右側矢印左下向 g.drawString("x", (int)XZ+3, (int)Y0+4); // x軸目盛り for(int i=50; i-XZ+250; i-=50){ g.drawLine((int)X0+i, (int)Y0, (int)X0+i, (int)Y0-3); g.drawString(Integer.toString(i/10), (int)X0+i-20, (int)Y0+20); } // y軸 g.drawLine((int)X0, (int)YA, (int)X0, (int)YZ); g.drawLine((int)X0, (int)YZ, (int)X0-5, (int)YZ+5); // 上側矢印左下向 g.drawLine((int)X0, (int)YZ, (int)X0+5, (int)YZ+5); // 上側矢印右下向 g.drawString("y", (int)X0-2, (int)YZ-3); // y軸目盛り for(int i=50; i-Y0; i-=50){ g.drawLine((int)X0, (int)Y0-i, (int)X0+3, (int)Y0-i); g.drawString(Integer.toString(i/10), (int)X0-30, (int)Y0-i+10); } } // 原点 g.drawString("0", (int)X0-5, (int)Y0+20); // 軌跡描画 g.setColor(Color.blue); //プロットの色は青 for(int i=0; i