プログラミング3のページを参考に、そこに書いてあることを、javaでコーディングしてみる。
http://cosmos.ee.yamanashi.ac.jp/~toyoki/lectures/prog3/numModel.html
前段階の学習(常微分方程式の数値解法)(プログラミングIIIのプリントより)
https://drive.google.com/open?id=0B6lH1nU-JHEcNzZJVVV4MVhzSUU
ブラウザの中では文字化けするかもしれません。ダウンロードして見てください。
class ov { // グローバル変数のセット protected static double sensitivity, beta; // セルの数、初期の車台数、パラメータ protected static double[] x, v; // 車の位置、速度 ///////////// メインメソッド ////////////////// public static void main(String[] args) { int step=0; // 時間 setInitialCondition(); // 描画 gr.drawCars(x, numberOfCars); // 時間発展の繰り返し for(int i =0; i < 100; i++) { // update(); // setBoundaryCondition(); // 状態の書き出し } } //////////// 初期値設定 /////////////////// public static void setInitialCondition() { // initial_n台の車を等間隔に // 速度は乱数により設定 } /////////// 時間発展 ///////////////////// public static void update() { // 速度を計算し、それに基づいて車を進める } ////////// 境界条件処理(車の生成、消滅) //// public static void setBoundaryCondition() { } }
新たに、描画するためのクラスを定義するdrawConfiguration.javaを次のように作成する。
import java.io.*; import java.awt.*; // uses the abstract windowing toolkit import javax.swing.*; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; public class drawConfiguration extends JPanel { static Graphics g; static JFrame gWin; double screenWidth, roadLength; int frameTop, frameLeft; // platform-dependent width of frame's top and left int marginX=20, marginY=20; // コンストラクタ drawConfiguration(int fSize, double rLength) { screenWidth = (double) fSize; roadLength = rLength; // シミュレーション本体画面の初期化 gWin = new JFrame("OV Model"); gWin.setLocation(20, 150); // screen coordinates of top left corner gWin.setResizable(false); gWin.setVisible(true); // show it! Insets theInsets = gWin.getInsets(); gWin.setSize(fSize + theInsets.left + theInsets.right + marginX*2, fSize + theInsets.top + marginY*2+ theInsets.bottom+30); /* 下30は文字出力用*/ this.frameTop = theInsets.top; this.frameLeft = theInsets.left; } // 車の描画 public void drawCars(double[] x, int numberOfCar) { double x_coordinate, y_coordinate; double pi2 = Math.PI * 2.0; double radius = 0.9 * screenWidth /2.0; // 描画する画面(Graphics)を特定する this.g = gWin.getGraphics(); // 画面全体をクリア g.setColor(new Color(255,255,255)); g.fillRect(0, 0, gWin.getWidth(),gWin.getHeight()); int x_center = gWin.getWidth()/2; int y_center = x_center; System.out.println(x_center+ ", " + y_center +", " + gWin.getHeight()); // 車の位置を描画 g.setColor(new Color(0,0,255)); for(int i=0; i< numberOfCar; i++) { x_coordinate = radius * Math.cos(pi2*x[i]/roadLength) + x_center; y_coordinate = radius * Math.sin(pi2*x[i]/roadLength) + y_center; System.out.println(x_coordinate + ", " +y_coordinate); g.fillOval((int) x_coordinate -5, (int) y_coordinate -5, 10, 10); // 半径10 } } }
main()メソッド内で、このクラスのインスタンスを作成し、配置を描画するメソッドdrawConfiguration()に位置の情報をを渡す。
import java.io.*; class ov { // グローバル変数のセット protected static int numberOfCars = 100; protected static double sensitivity, beta; // セルの数、初期の車台数、パラメータ protected static int[] x, v; // 車の位置、速度 protected static drawConfiguration gr; // グラフィック用クラスの宣言 ///////////// メインメソッド ////////////////// public static void main(String[] args) { int step=0; // 時間 gr = new drawConfiguration(600, roadLength); // グラフィック用クラスのインスタンス化 setInitialCondition(); // 描画 gr.drawCars(x, numberOfCars); // 描画メソッドの利用 // 時間発展の繰り返し for(int i =0; i < 100; i++) { // update(); // setBoundaryCondition(); // 状態の描画 gr.drawCars(x, numberOfCars); } // 直ぐに終わらないための措置 (処理系によっては、なくても良いかもしれない) System.out.println("終了には、何かのキーを入力してください"); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try{ String str = in.readLine(); System.out.println(str); System.exit(0); } catch(Exception e) { System.exit(1); } System.exit(0); } // 以下略