!! 練習問題 それではひとつ練習問題を出したいと思います。 円運動はx軸方向の単振動とy軸方向の単振動に分解することができます。それをこのアプレットに追加表示してみてください。 これは言い換えれば、質点の運動をx軸、y軸に射影して表示するということになります。 回答例を CircularMovement03.java として載せておきます。CircularMovement02.java からの変更点を太字で示してあります。もちろん、回答例が正しくて、皆さんのやり方が間違いということではありませんので、自由にやってみてくださいね。 ''CircularMovement03.java'' {{pre num import java.applet.*; import java.awt.*; /* * 質点が円運動する様子を描いたアプレットです。 * * */ /** * @author Osamu Koizumi * */ public class CircularMovement03 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) + getWidth()/2.0; y = - a * Math.sin( omega * t) + getHeight()/2.0; // 計算結果を画面に反映させるために再描画する 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-d/2), (int)(y-d/2), d, d); // 描画色を灰色に設定する g.setColor( Color.GRAY); // 座標原点を定義する int x0 = getWidth()/2; int y0 = getWidth()/2; // x軸を描く g.drawLine( 0, y0, getWidth(), y0); // y軸を描く g.drawLine( x0, 0, x0, getHeight()); // 描画色を青色に変更する g.setColor( Color.BLUE); // x軸への射影成分を描く g.fillOval( (int)(x-d/2), (int)(y0 - d/2), d, d); // 描画色を緑色に変更する g.setColor( Color.GREEN); // y軸への射影成分を描く g.fillOval( (int)(x0 - d/2), (int)(y - d/2), d, d); } /* * アプレット停止時に呼ばれます。 * @see java.applet.Applet#stop() */ public void stop(){ th = null; } } }}