Javaアプレットの基本

Javaを使った基本的なグラフィック処理を紹介します。
Java実行環境で、下記の項目に注意して利用してください。

枠1

/*****************************************************************

     1.枠の描画の基本
         既存クラス Rectangle の使用

 *****************************************************************/
import java.applet.Applet;
import java.awt.*;

public class WakuApplet1 extends Applet {
    Rectangle siya = new Rectangle( 200, 50, 300, 300);
    int pmin = siya.x;            //デバイス空間の左
    int qmin = siya.y;            //デバイス空間の上
    int pwidth = siya.width;      //デバイス空間の幅
    int qheight = siya.height;    //デバイス空間の高さ

    public void paint( Graphics g ) {
        g.setColor( Color.black );                    //色の設定
        g.drawRect( pmin, qmin, pwidth, qheight );    //外枠
		
        g.setColor( Color.lightGray );                        //色の設定
        g.fillRect( pmin+1, qmin+1, pwidth-1, qheight-1 );    //塗りつぶし
    }
}
  

枠と塗りつぶしを表示するアプレットです。
WakuApplet1.htmを見るにはJava実行環境が必要です。


枠2

/*****************************************************************

     2.枠の描画の基本
         既存クラス Rectangle2D.Double の使用と座標の表示

 *****************************************************************/
import java.applet.Applet;
import java.awt.*;
import java.awt.geom.*;

public class WakuApplet2 extends Applet {
    Rectangle2D.Double mado = new Rectangle2D.Double( -5.0, 7.5, 10.0, 10.0);
    double xmin = mado.x;                //ユーザー空間の左
    double xmax = mado.x + mado.width;   //ユーザー空間の右
    double ymax = mado.y;                //ユーザー空間の上
    double ymin = mado.y - mado.height;  //ユーザー空間の下

    Rectangle siya = new Rectangle( 200, 50, 300, 300);
    int pmin = siya.x;                  //デバイス空間の左
    int pmax = siya.x + siya.width;     //デバイス空間の右
    int qmin = siya.y;                  //デバイス空間の上
    int qmax = siya.y + siya.height;    //デバイス空間の下
    int pwidth = siya.width;            //デバイス空間の幅
    int qheight = siya.height;          //デバイス空間の高さ
	
    public void paint( Graphics g ) {
        g.setColor( Color.black );                          //色の設定
        g.drawRect( pmin, qmin, pwidth, qheight );          //外枠
		
        g.setColor( Color.lightGray );                      //色の設定
        g.fillRect( pmin+1, qmin+1, pwidth-1, qheight-1 );  //塗りつぶし
		
        g.setColor( Color.black );                          //色の設定
        g.drawString( ""+xmin, pmin-7, qmax+15 );           //座標の値
        g.drawString( ""+xmax, pmax-7, qmax+15 );
        g.drawString( ""+ymin, pmin-25, qmax+5 );
        g.drawString( ""+ymax, pmin-25, qmin+5 );
    }
}
  

枠の座標の値を表示するアプレットです。
WakuApplet2.htmを見るにはJava実行環境が必要です。


枠3

/*****************************************************************

     3.枠の描画の基本
         座標変換の導入、x軸とy軸の表示

 *****************************************************************/
import java.applet.Applet;
import java.awt.*;
import java.awt.geom.*;

public class WakuApplet3 extends Applet {
    Rectangle2D.Double mado = new Rectangle2D.Double( -5.0, 7.5, 10.0, 10.0);
    double xmin = mado.x;                              //ユーザー空間の左
    double xmax = mado.x + mado.width;                 //ユーザー空間の右
    double ymax = mado.y;                              //ユーザー空間の上
    double ymin = mado.y - mado.height;                //ユーザー空間の下
    double xwidth = mado.width;                        //ユーザー空間の幅
    double yheight = mado.height;                      //ユーザー空間の高さ
    Point2D.Double ff0 = new Point2D.Double( 0f, 0f);  //ユーザ空間の原点

    Rectangle siya = new Rectangle( 200, 50, 300, 300);
    int pmin = siya.x;                   //デバイス空間の左
    int pmax = siya.x + siya.width;      //デバイス空間の右
    int qmin = siya.y;                   //デバイス空間の上
    int qmax = siya.y + siya.height;     //デバイス空間の下
    int pwidth = siya.width;             //デバイス空間の幅
    int qheight = siya.height;           //デバイス空間の高さ

    /*** 座標変換 ***/
    public Point ppp( Point2D.Double ffn) {
        int px = (int) ( pmin + ( ffn.x - xmin ) * pwidth / xwidth ) ;   //x座標の変換
        int py = (int) ( qmin - ( ffn.y - ymax ) * qheight / yheight );  //y座標の変換
        Point pp = new Point( px, py );
        return pp;
    }
    /*** 画面の描画 ***/
    public void paint( Graphics g ) {
        Point p0 = new Point( ppp( ff0 ) );                //デバイス空間の原点
	
        g.setColor( Color.black );                          //色の設定
        g.drawRect( pmin, qmin, pwidth, qheight );          //外枠
		
        g.setColor( Color.lightGray );                      //色の設定
        g.fillRect( pmin+1, qmin+1, pwidth-1, qheight-1 );  //塗りつぶし
		
        g.setColor( Color.black );                          //色の設定
        g.drawString( ""+xmin, pmin-7, qmax+15 );           //座標の値
        g.drawString( ""+xmax, pmax-7, qmax+15 );
        g.drawString( ""+ymin, pmin-25, qmax+5 );
        g.drawString( ""+ymax, pmin-25, qmin+5 );
		
        if( siya.contains( p0.x, qmin ) ){               //原点がx座標に含まれていれば
            g.setColor( Color.red );
            g.drawLine( p0.x, qmin, p0.x, qmax );        //y軸
            g.setColor( Color.black );
            g.drawString( ""+ff0.x, p0.x-7, qmax+15 );   //座標の値
        }
        if( siya.contains( pmin, p0.y ) ){               //原点がy座標に含まれていれば
            g.setColor( Color.red );
            g.drawLine( pmin, p0.y, pmax, p0.y );        //x軸
            g.setColor( Color.black );
            g.drawString( ""+ff0.y, pmin-25, p0.y+5 );   //座標の値
        }
    }
}

X軸とY軸を表示するアプレットです。
WakuApplet3.htmを見るにはJava実行環境が必要です。


枠4

/*****************************************************************

     4.枠の描画の基本
         既存クラス Graphics2D の使用とラベルの表示

 *****************************************************************/
import java.applet.Applet;
import java.awt.*;
import java.awt.geom.*;
import java.lang.*;

public class WakuApplet4 extends Applet {
    Rectangle2D.Double mado = new Rectangle2D.Double( -5.0, 7.5, 10.0, 10.0);
    double xmin = mado.x;                                //ユーザー空間の左
    double xmax = mado.x + mado.width;                   //ユーザー空間の右
    double ymax = mado.y;                                //ユーザー空間の上
    double ymin = mado.y - mado.height;                  //ユーザー空間の下
    double xwidth = mado.width;                          //ユーザー空間の幅
    double yheight = mado.height;                        //ユーザー空間の高さ
    Point2D.Double ff0 = new Point2D.Double( 0f, 0f);    //ユーザ空間の原点

    Rectangle siya = new Rectangle( 200, 50, 300, 300);
    int pmin = siya.x;                             //デバイス空間の左
    int pmax = siya.x + siya.width;                //デバイス空間の右
    int qmin = siya.y;                             //デバイス空間の上
    int qmax = siya.y + siya.height;               //デバイス空間の下
    int pwidth = siya.width;                       //デバイス空間の幅
    int qheight = siya.height;                     //デバイス空間の高さ
    double pc = (double) ( pmin + pwidth / 2 );    //デバイス空間の中心
    double qc = (double) ( qmin + qheight / 2 );

    /*** 座標変換 ***/
    public Point ppp( Point2D.Double ffn) {
        int px = (int) ( pmin + ( ffn.x - xmin ) * pwidth / xwidth ) ;   //x座標の変換
        int py = (int) ( qmin - ( ffn.y - ymax ) * qheight / yheight );  //y座標の変換
        Point pp = new Point( px, py );
        return pp;
    }
    /*** 画面の描画 ***/
    public void paint( Graphics g ) {
        Graphics2D g2 = ( Graphics2D ) g;
		
        Point p0 = new Point( ppp( ff0 ) );                 //デバイス空間の原点
		
        g.setColor( Color.black );                          //色の設定
        g.drawRect( pmin, qmin, pwidth, qheight );          //外枠
		
        g.setColor( Color.lightGray );                      //色の設定
        g.fillRect( pmin+1, qmin+1, pwidth-1, qheight-1 );  //塗りつぶし
		
        g.setColor( Color.black );                          //色の設定
        g.drawString( ""+xmin, pmin-7, qmax+15 );           //座標の値
        g.drawString( ""+xmax, pmax-7, qmax+15 );
        g.drawString( ""+ymin, pmin-25, qmax+5 );
        g.drawString( ""+ymax, pmin-25, qmin+5 );
        g.drawString( "X座標", pmin+pwidth/2-25, qmax+30);
		
        g2.rotate( Math.PI*1.5, pc, qc );
        g.drawString( "Y座標", pmin+pwidth/2-25, qmin-30);
        g2.rotate( Math.PI*0.5, pc, qc );
		
        if( siya.contains( p0.x, qmin ) ){               //原点がx座標に含まれていれば
            g.setColor( Color.red );
            g.drawLine( p0.x, qmin, p0.x, qmax );        //y軸
            g.setColor( Color.black );
            g.drawString( ""+ff0.x, p0.x-7, qmax+15 );   //座標の値
        }
        if( siya.contains( pmin, p0.y ) ){               //原点がy座標に含まれていれば
            g.setColor( Color.red );
            g.drawLine( pmin, p0.y, pmax, p0.y );        //x軸
            g.setColor( Color.black );
            g.drawString( ""+ff0.y, pmin-25, p0.y+5 );   //座標の値
        }
    }
}

X軸とY軸のラベルを表示するアプレットです。
WakuApplet4.htmを見るにはJava実行環境が必要です。


座標変換1

/********************************************

      5.座標変換用のクラス
          Line2D.Double の導入
          (JikuHenkan1.class)

 ********************************************/
import java.awt.*;
import java.awt.geom.*;
import java.lang.*;

public class JikuHenkan1 {
	
    /*** フィールド ***/
    Line2D.Double ff;       //線分(ユーザー空間)
    Rectangle2D.Double mm;  //窓(ユーザー空間)
    Rectangle ss;           //視野(デバイス空間)

    /*** コンストラクタ ***/
    public JikuHenkan1(){
        ff = new Line2D.Double( 0.0, 0.0, 0.0, 0.0);
        mm = new Rectangle2D.Double( 0.0, 0.0, 0.0, 0.0);
        ss = new Rectangle( 0, 0, 0, 0);
    }
    public JikuHenkan1( Line2D.Double ff, Rectangle2D.Double mm, Rectangle ss ){
        this.ff = ff;
        this.mm = mm;
        this.ss = ss;
    }
    /*** 座標変換のメソッド ***/
    public Point ppp( Point2D.Double fn) {
        int px = (int) ( ss.x + ( fn.x - mm.x ) * ss.width / mm.width ) ;   //x座標の変換
        int py = (int) ( ss.y - ( fn.y - mm.y ) * ss.height / mm.height );  //y座標の変換
        Point pp = new Point( px, py );
        return pp;
    }
    /*** 枠を描くメソッド ***/
    public void drawWaku( Graphics g ) {
        Graphics2D g2 = ( Graphics2D ) g;

        double xmin = mm.x;                            //ユーザー空間の左
        double xmax = mm.x + mm.width;                 //ユーザー空間の右
        double ymax = mm.y;                            //ユーザー空間の上
        double ymin = mm.y - mm.height;                //ユーザー空間の下

        int pmin = ss.x;                               //デバイス空間の左
        int pmax = ss.x + ss.width;                    //デバイス空間の右
        int qmin = ss.y;                               //デバイス空間の上
        int qmax = ss.y + ss.height;                   //デバイス空間の下
        int pwidth = ss.width;                         //デバイス空間の幅
        int qheight = ss.height;                       //デバイス空間の高さ
        double pc = (double) ( pmin + pwidth / 2 );    //デバイス空間の中心
        double qc = (double) ( qmin + qheight / 2 );

        Point2D.Double f0 = new Point2D.Double( 0.0, 0.0);  //ユーザー空間の原点
        Point pp0 = new Point( ppp( f0 ) );                 //デバイス空間の原点

        g.setColor( Color.black );
        g.drawRect( ss.x, ss.y, ss.width, ss.height );          //外枠
		
        g.setColor( Color.lightGray );
        g.fillRect( ss.x+1, ss.y+1, ss.width-1, ss.height-1 );  //塗りつぶし

        g.setColor( Color.black );                              //座標の値
        g.drawString( ""+xmin, pmin-7, qmax+15 );
        g.drawString( ""+xmax, pmax-7, qmax+15 );
        g.drawString( ""+ymin, pmin-25, qmax+5 );
        g.drawString( ""+ymax, pmin-25, qmin+5 );
	    
        g.drawString( "X座標", pmin+pwidth/2-25, qmax+30);     //ラベル

        g2.rotate( Math.PI*1.5, pc, qc );
        g.drawString( "Y座標", pmin+pwidth/2-25, qmin-30);
        g2.rotate( Math.PI*0.5, pc, qc );

        if( ss.contains( pp0.x, qmin ) ){                //原点がx軸に含まれていれば
            g.setColor( Color.red );
            g.drawLine( pp0.x, qmin, pp0.x, qmax );      //y軸
            g.setColor( Color.black );
            g.drawString( ""+f0.x, pp0.x-7, qmax+15 );   //x軸の値
        }
        if( ss.contains( pmin, pp0.y ) ){                //原点がy軸に含まれていれば
            g.setColor( Color.red );
            g.drawLine( pmin, pp0.y, pmax, pp0.y );      //x軸
            g.setColor( Color.black );
            g.drawString( ""+f0.y, pmin-25, pp0.y+5 );   //y軸の値
        }
    }
    /*** 線分を描くメソッド ***/
    public void drawSenbun(Graphics g){
        Point2D.Double f1 = new Point2D.Double( ff.x1, ff.y1 );  //ユーザー空間の点1
        Point2D.Double f2 = new Point2D.Double( ff.x2, ff.y2 );  //ユーザー空間の点2

        Point pp1 = new Point( ppp( f1 ) );                //デバイス空間の点1
        Point pp2 = new Point( ppp( f2 ) );                //デバイス空間の点2

        g.setColor( Color.black );
        if( ss.contains( pp1 ) ){                          //点1が含まれていれば
            if( ss.contains( pp2 ) ){                      //点2が含まれていれば
                g.drawLine( pp1.x, pp1.y, pp2.x, pp2.y );  //点1から点2に直線を描く
            }
        }
    }
}

座標変換部分をクラス化しました。
以降のプログラムから参照して利用します。

線分1

/*****************************************************************

     6.線分の描画
         JikuHenkan1.classの使用

 *****************************************************************/
import java.applet.Applet;
import java.awt.*;
import java.awt.geom.*;

public class SenbunApplet1 extends Applet {
    /*** ユーザー空間 ***/
    Rectangle2D.Double mado = new Rectangle2D.Double( -5.0, 7.5, 10.0, 10.0);

    Line2D.Double f1 = new Line2D.Double( -1.0, -1.0, 1.0, 1.0);  //ユーザー空間の線分

    /*** デバイス空間 ***/
    Rectangle siya = new Rectangle( 200, 50, 300, 300);

    /*************** 描画 ***************************/
    public void paint( Graphics g ) {

        JikuHenkan1 j1 = new JikuHenkan1();      //座標変換のクラス

        j1 = new JikuHenkan1( f1, mado, siya );  //座標変換のクラスの設定

        j1.drawWaku(g);                          //枠を描く

        j1.drawSenbun(g);                        //線分を描く
    }
}

線分を描画するアプレットです。
同一フォルダのJikuHenkan1.classを参照しています。
SenbunApplet1.htmを見るにはJava実行環境が必要です。


関数1

/*****************************************************************

     7.関数の描画
         JikuHenkan1.classの使用

 *****************************************************************/
import java.applet.Applet;
import java.awt.*;
import java.awt.geom.*;

public class KansuApplet1 extends Applet {
    /*** ユーザー空間 ***/
    Rectangle2D.Double mado = new Rectangle2D.Double( -5.0, 7.5, 10.0, 10.0);

    /*** デバイス空間 ***/
    Rectangle siya = new Rectangle( 200, 50, 300, 300);

    int i;                                        //添え字
    int n = 400;                                  //線分の数

    double[] xn = new double[n];                  //x座標の配列
    double[] yn = new double[n];                  //y座標の配列
    double xst = mado.width / n;                  //線分の幅

    Line2D.Double[] fn = new Line2D.Double[n];    //ユーザー空間の線分
    JikuHenkan1[] jn = new JikuHenkan1[n];        //座標変換のクラス

    /*** 関数 ***/
    public double fff( double aaa, double xxx ) {
        return ( aaa * xxx * xxx );                  //y=ax^2
    }
    /*************** 描画 ***************************/
    public void paint( Graphics g ) {
        double aa0 = 0.3;                 //関数の定数

        for( i=0; i<n; i++ ){
            xn[i] = mado.x + xst * i;     //x座標の配列の設定
            yn[i] = fff( aa0, xn[i] );    //y座標の配列の計算
        }
        for( i=0; i<n-1; i++ ){
            fn[i] = new Line2D.Double( xn[i], yn[i], xn[i+1], yn[i+1] );  //線分の設定

            jn[i] = new JikuHenkan1( fn[i], mado, siya );    //座標変換のクラスの設定
        }
        jn[0].drawWaku(g);             //枠を描く

        for( i=0; i<n-1; i++ ){
            jn[i].drawSenbun(g);       //関数を描く
        }
    }
}

関数を描画するアプレットです。
同一フォルダのJikuHenkan1.classを参照しています。
KansuApplet1.htmを見るにはJava実行環境が必要です。