!! プログラム まずは計算処理と描画処理を単純に書き加えてみましょう。ソースファイルは次のようになります。テンプレートファイルに書き加えた行を太字で示しました。 ''CircularMovement01.java'' {{pre num import java.applet.*; import java.awt.*; /* * 質点が円運動する様子を描いたアプレットです。 * * */ /** * @author Osamu Koizumi * */ public class CircularMovement01 extends Applet implements Runnable{ /** スレッド */ Thread th; /** 経過時間を保持する変数 */ double t = 0; /** 時間の刻み (ミリ秒単位) */ int dt = 100; /** 円運動の半径 (ピクセル単位) */ double a = 90.0; /** 円運動の周期 (秒単位) */ double T = 2.0; /** 質点の x 座標値を保持する変数 */ double x; /** 質点の y 座標値を保持する変数 */ double y; /** 描画される質点の直径(ピクセル単位) */ int d = 6; /* * このメソッドには初期化処理を記述します。 * @see java.applet.Applet#init() */ public void init(){ } /* * アプレットの実行が始まると呼ばれます。 * @see java.applet.Applet#init() */ public void start(){ // おまじない if( th == null){ th = new Thread( this); } th.start(); } /* * このメソッドには反復処理を記述します。 * @see java.lang.Runnable#run() */ public void run(){ while( th != null){ /* * ここに計算などの処理を記述します。 */ // 周期を角振動数に変換する double omega = 2 * Math.PI / T; // 質点の位置を計算する x = a * Math.cos( omega * t); y = a * Math.sin( omega * t); // 計算結果を画面に反映させるために再描画する repaint(); // 時間を進める (dt を秒単位に直すために1000で割る) t = t + dt/1000.0; // 刻み時間だけ待つ try{ Thread.sleep( dt); } catch( InterruptedException ex){ } } } /* * このメソッドには描画処理を記述します。 * @see java.awt.Component#paint(java.awt.Graphics) */ public void paint( Graphics g){ /* * ここに描画処理を記述します。 */ // 描画色を赤色に設定する g.setColor( Color.RED); // 塗りつぶされた円を描く(質点を表す) g.fillOval( (int)x, (int)y, d, d); } /* * アプレット停止時に呼ばれます。 * @see java.applet.Applet#stop() */ public void stop(){ th = null; } } }} それでは書き加えた部分を抜き出して見ていくことにしましょう。 {{pre 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)は楕円に外接する四角形の左隅の座標です。 {{ref_image fig017.png}} fillOvalメソッドでは、位置 x, y は int 型で渡さなければなりません。しかし我々が27行目、29行目で定義した x, y は double 型です。93行目で (int)x としているのは、double型を「無理やり」 int 型に変換して渡しています。このようにして変数の型を変換することを「キャストする」といったりします。また、第三、第四引数について、今回は質点を円形で表現したいので、width = height (= d) としています。