| HOME | 目次 | 2009 (C) H.Ishikawa


付録 簡易マルチウインドウシステム
Window.java

 

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

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



付2 プログラムの説明
 (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);
        }
}

| この章始め |

| HOME | 目次 | 2009 (C) H.Ishikawa