本文へスキップ
モンテカルロシミュレーション
付録 簡易マルチウインドウシステム Window.java
 

    画面上のスクリーンにシミュレーションの結果を,グラフにして出力すると,全体が把握できたいへんわかりやすい。ところが,コンピュータのディスプレイ のスクリーンは,一般に左上が原点で,右へあるいは,下へ行くほど座標の値が増える方向にあります。いっぽう,物理,数学などで用いる,グラフは原点は左 下で,増加方向は,右あるいは,上が通常です。図付1のように,シミュレーションで得られた結果を,ここでは,論理座標とよぶこととし,スクリーン座標と 変換することとします。また,あわせて,一つのスクリーンに,二つ以上のグラフを同時に表示できるように,工夫しました。
 Window.javaに含まれる,クラス群により,論理座標だけを意識して,グラフを書けるようにします。また,一つのスクリーンの中に,複数のウインドウを用意し,ウインドウごとに,論理座標を持てるようにします。

図付1 スクリーン座標と論理座標


 (1)の定義で同時に使えるウインドウの数 WINDOW を,5にしています。(2)から(3)までは,このヘッダファイルのクラス群に共通の変換定数を,ウインドウの数だけ宣言しています。

次にそれぞれの,クラスを説明します。

void setWindow(int win, double wx1, double wy1, double wx2, double wy2, int x1, int y1, int x2, int y2) ;

 第一パラメータ win で,ウインドウ番号を0から WINDOW-1 の,いずれかを指定します。次に,対応する論理座標とスクリーン座標を,図付1の(wx1,wy1),(wx2,wy2)および(x1,y1),(x2,y2)をもちいて,指定します。このクラスを実行するとウインドウごとの,論理座標とスクリーン座標の対応関係の変換定数が設定され,後に述べるクラスでそれが有効に作用することになります。

double getWx(int win, int screenx);
 ウインドウ win において,スクリーン座標上の横軸値 screenx を与えると,論理座標上の横軸値の値を返します。

double getWy(int win, int screeny);
 ウインドウ win において,スクリーン座標上の縦軸値 screeny を与えると,論理座標上の縦軸値の値を返します。
 
iint getSx(int win, double x);
 ウインドウ win において,論理座標上の横軸値 x を与えると,スクリーン座標上の横軸値の値を返します。

int getSy(int win, double y);
 ウインドウ win において,論理座標上の縦軸値 y を与えると,スクリーン座標上の縦軸値の値を返します。

void axis(int win, String x_axis, double x_scale, String y_axis, double y_scale, Graphics g)
;
 ウインドウ win に,lightGrayの座標を書くクラスです。座標は図付2のような形です。また,ウインドウのタイトルとして,ウインドウの番号 win ,横軸の名称 x_axis[] ,横軸の目盛り幅 x_scale ,縦軸の名称 y_axis[] ,縦軸の目盛り幅 y_scale を,ウインドウの下に出力します。
図付2 axis()により表示される座標

void line(int win, double x0, double y0, double x1, double y1, Graphics g);
 ウインドウ win の,論理座標(x0,y0)と,(x1,y1)の間に,直線を書きます。

void putPixel(int win, double x, double y, Graphics g);

 ウインドウ win の,論理座標(x,y)に,色 color のドットを出力します。

void moveTo(int win, double x, double y, Graphics g);
 ウインドウ win の現在位置を, x , y に設定します。

void lineTo(int win, double x, double y, Graphics g);
 ウインドウ win の現在位置から(x,y)までの間に直線を書きます。その後現在位置は(x,y)となります。

Window.java   | Download |
/*
 * 作成日: 2005/02/09   (C) H.Ishikawa
 */
/* 
 *        スクリーン座標と論理座標を変換するclass
 */ 
package window;

import java.awt.Graphics;
import java.awt.Color;

public class Window {

      static int  WINDOW =   5;             /* (1)Windowの数 0から最大4まで */

      static int    win_sx1[] = new int[WINDOW];            /* (2)スクリーン座標上のx1 */
      static int    win_sy1[] = new int[WINDOW];            /* スクリーン座標上のy1 */
      static int    win_sx2[] = new int[WINDOW];            /* スクリーン座標上のx2 */
      static int    win_sy2[] = new int[WINDOW];            /* スクリーン座標上のy2 */
      static double win_wx1[] = new double[WINDOW];            /* 論理座標上のx1 */
      static double win_wy1[] = new double[WINDOW];            /* 論理座標上のy1 */
      static double win_wx2[] = new double[WINDOW];            /* 論理座標上のx2 */
      static double win_wy2[] = new double[WINDOW];            /* 論理座標上のy2 */
      static double win_sdx[] = new double[WINDOW];            /* スクリーン座標と論理座標の比 */
      static double win_sdy[] = new double[WINDOW];            /* スクリーン座標と論理座標の比 */
      static double win_cpx[] = new double[WINDOW];            /* 現在位置x */
      static double win_cpy[] = new double[WINDOW];            /* (3)現在位置y */
      String s;
      
      public void setWindow(int win, double wx1, double wy1, double wx2, double wy2,
                        int x1, int y1, int x2, int y2) {
            win_sx1[win] = x1;  win_sy1[win] = y1;
            win_sx2[win] = x2;  win_sy2[win] = y2;
            win_wx1[win] = wx1; win_wy1[win] = wy1;
            win_wx2[win] = wx2; win_wy2[win] = wy2;
            win_sdx[win] = (double)((x2-x1) / (wx2-wx1));
            win_sdy[win] = (double)((y2-y1) / (wy2-wy1));
      }

      public double getWx(int win, int screenx) {
            return(win_wx1[win] + (double)((screenx - win_sx1[win]) / win_sdx[win]));
      }

      public double getWy(int win, int screeny) {
            return(win_wy1[win] + (double)((screeny - win_sy1[win]) / win_sdy[win]));
      }

      public int getSx(int win, double x) {
          return(win_sx1[win] + (int)((x - win_wx1[win]) * win_sdx[win]));
      }

      public int getSy(int win, double y) {
            return(win_sy1[win] + (int)((y - win_wy1[win]) * win_sdy[win]));
      }

      public void axis(int win,
            String x_axis, double x_scale, String y_axis, double y_scale, Graphics g) {
            double x ;
            double y ;
            
            g.setColor(Color.lightGray);                       
            x = x_scale;
            /* 原点から右へ目盛りをかく */
            while (x <= win_wx2[win]) { 
                  if (win_wx1[win] <= x) {line( win, x, win_wy1[win], x, win_wy2[win], g);}
                  x = x + x_scale;
            }
            x = -x_scale;
            /* 原点から左に目盛りをかく */
            while (win_wx1[win] <= x) {
                  if (x <= win_wx2[win]) {line( win, x, win_wy1[win], x, win_wy2[win], g);}
                  x = x - x_scale;
            }
            y = y_scale;
            /* 原点から上に目盛りをかく */
            while (y <= win_wy2[win]) {
                  if (win_wy1[win] <= y) {line( win, win_wx1[win], y, win_wx2[win], y, g);}
                  y = y + y_scale;
            }
            y = -y_scale;
            /* 原点から下に目盛りをかく */
            while (win_wy1[win] <= y) {
                  if (y <= win_wy2[win]) line( win, win_wx1[win], y, win_wx2[win], y, g);
                  y = y - y_scale;
            }
            g.setColor(Color.black);  
            if (win_wy1[win] <= 0.0 && 0.0 <= win_wy2[win]) {
                  line(win, win_wx1[win], 0.0, win_wx2[win], 0.0, g); 
            }  /* 縦軸 */
            if (win_wx1[win] <= 0.0 && 0.0 <= win_wx2[win]) {
                  line(win, 0.0, win_wy1[win], 0.0, win_wy2[win], g);
            }   /* 横軸 */                            
            /*タイトルをかく */
            s = "    Window " + win + "    横軸 : " + x_axis + " [ " + x_scale + " / div ]" +
                  "     縦軸 : " + y_axis + " [ " + y_scale + " / div ]";
            g.drawString(s,getSx(win,win_wx1[win]) , getSy(win,win_wy1[win]) + 10);
      }

      public void   line(int win, double x0, double y0, double x1, double y1, Graphics g) {
            g.drawLine(getSx(win,x0), getSy(win, y0), getSx(win, x1), getSy(win, y1));
      }

      public void  putPixel(int win, double x, double y, Graphics g) {
            g.drawLine(getSx(win, x), getSy(win, y),getSx(win, x), getSy(win, y));
      }

      public void moveTo(int win, double x, double y, Graphics g) {
            win_cpx[win] = x;
            win_cpy[win] = y;
      }

      public void lineTo(int win, double x, double y, Graphics g) {
            line(win, win_cpx[win], win_cpy[win], x, y, g);
            moveTo(win, x, y, g);
      }
}