トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

プログラム

  プログラム


まずは計算処理と描画処理を単純に書き加えてみましょう。ソースファイルは次のようになります。テンプレートファイルに書き加えた行を太字で示しました。

CircularMovement01.java

001|import java.applet.*;
002|import java.awt.*;
003|
004|/*
005| * 質点が円運動する様子を描いたアプレットです。
006| * <applet code="CircularMovement01.class" width="200" height="200"></applet>
007| * 
008| */
009|
010|/**
011| * @author Osamu Koizumi
012| *
013| */
014|public class CircularMovement01 extends Applet implements Runnable{
015|	/** スレッド */
016|	Thread th;
017|	/** 経過時間を保持する変数 */
018|	double t = 0;
019|	/** 時間の刻み (ミリ秒単位) */
020|	int dt = 100;
021|	
022|	/** 円運動の半径 (ピクセル単位) */
023|	double a = 90.0;
024|	/** 円運動の周期 (秒単位) */
025|	double T = 2.0;
026|	/** 質点の x 座標値を保持する変数 */
027|	double x;
028|	/** 質点の y 座標値を保持する変数 */
029|	double y;
030|	
031|	/** 描画される質点の直径(ピクセル単位) */
032|	int d = 6;
033|	
034|	/*
035|	 * このメソッドには初期化処理を記述します。
036|	 * @see java.applet.Applet#init()
037|	 */	
038|	public void init(){
039|	}
040|	
041|	/*
042|	 * アプレットの実行が始まると呼ばれます。
043|	 * @see java.applet.Applet#init()
044|	 */
045|	public void start(){
046|		// おまじない
047|		if( th == null){
048|			th = new Thread( this);
049|		}
050|		th.start();
051|	}
052|	
053|	/*
054|	 * このメソッドには反復処理を記述します。
055|	 * @see java.lang.Runnable#run()
056|	 */
057|	public void run(){
058|		while( th != null){
059|			/*
060|			 * ここに計算などの処理を記述します。
061|			 */
062|			// 周期を角振動数に変換する
063|			double omega = 2 * Math.PI / T;
064|			// 質点の位置を計算する
065|			x = a * Math.cos( omega * t);
066|			y = a * Math.sin( omega * t);
067|			// 計算結果を画面に反映させるために再描画する
068|			repaint();
069|	
070|			// 時間を進める (dt を秒単位に直すために1000で割る)
071|			t = t + dt/1000.0;
072|	
073|			// 刻み時間だけ待つ
074|			try{
075|				Thread.sleep( dt);
076|			}
077|			catch( InterruptedException ex){
078|			}
079|		}
080|	}
081|
082|	/*
083|	 * このメソッドには描画処理を記述します。
084|	 * @see java.awt.Component#paint(java.awt.Graphics)
085|	 */
086|	public void paint( Graphics g){
087|		/*
088|		 * ここに描画処理を記述します。
089|		 */
090|		// 描画色を赤色に設定する
091|		g.setColor( Color.RED);
092|		// 塗りつぶされた円を描く(質点を表す)
093|		g.fillOval( (int)x, (int)y, d, d);
094|	}
095|
096|	/*
097|	 * アプレット停止時に呼ばれます。
098|	 * @see java.applet.Applet#stop()
099|	 */
100|	public void stop(){
101|		th = null;
102|	}
103|
104|}

それでは書き加えた部分を抜き出して見ていくことにしましょう。

22. /** 円運動の半径 (ピクセル単位) */
23. double a = 90.0;
24. /** 円運動の周期 (秒単位) */
25. double T = 2.0;
26. /** 質点の x 座標値を保持する変数 */
27. double x;
28. /** 質点の y 座標値を保持する変数 */
29. double y;

まずは22行目から29行目です。ここでは表7(57ページ)で示した、パラメータを定義しています。時刻 t だけはテンプレートですでに定義済みだったので、位置 x, y と円運動の半径 a、そして円運動の周期 T を定義しました。

31. /** 描画される質点の直径(ピクセル単位) */
32. int d = 6;

このプログラムでは質点を小さな塗りつぶし円で表示します。32行目ではその塗りつぶし円の直径 d を定義しています。

63行目では、周期 T を角振動数 ω に変換しています。65,66行目で、質点の位置座標の値を求めています。ある量のコサインを計算するには Math.cos() というメソッドを用います。また、ある量のサインを計算するには Math.sin() というメソッドを用います。"Math." を付け忘れることがあるので注意しましょう。

90. // 描画色を赤色に設定する
91. g.setColor( Color.RED);
92. // 塗りつぶされた円を描く(質点を表す)
93. g.fillOval( (int)x, (int)y, d, d);

90行目から93行目で、実際の描画処理を行っています。setColor メソッドは描画色を変更するメソッドです。引数にはあらかじめ用意されている BLACK, BLUE, CYAN, DARK_GRAY, GRAY, GREEN, LIGHT_GRAY, MAGENTA, ORANGE, PINK, RED, WHITE などの色を Color.XXXX (XXXXは色名) として渡すか、RGBで色を指定することができます。RGBで指定する場合には
g.setColor( 255, 255, 0);
のように、引数に R, G, B の順にそれぞれ 0 から 255 までの数を指定します。0がもっとも暗く、255がもっとも明るくなります。例えば(0,0,0)は黒、(255,255,255)は白、(255,0,0)は赤、(0,255,0)は緑、(0,0,255)は青、といった具合です。

93行目の fillOval メソッドは塗りつぶされた楕円を描くメソッドです。fillOval メソッドは4つの引数をとります。

fillOval( int x, int y, int width, int height)

x, y, width, height は図17のように指定します。(x,y)は楕円に外接する四角形の左隅の座標です。


fillOvalメソッドでは、位置 x, y は int 型で渡さなければなりません。しかし我々が27行目、29行目で定義した x, y は double 型です。93行目で (int)x としているのは、double型を「無理やり」 int 型に変換して渡しています。このようにして変数の型を変換することを「キャストする」といったりします。また、第三、第四引数について、今回は質点を円形で表現したいので、width = height (= d) としています。


最終更新時間:2011年01月08日 16時39分08秒