トップ 一覧 検索 ヘルプ RSS ログイン

練習問題の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!! 練習問題

それではひとつ練習問題を出したいと思います。

 円運動はx軸方向の単振動とy軸方向の単振動に分解することができます。それをこのアプレットに追加表示してみてください。

これは言い換えれば、質点の運動をx軸、y軸に射影して表示するということになります。

回答例を CircularMovement03.java として載せておきます。CircularMovement02.java からの変更点を太字で示してあります。もちろん、回答例が正しくて、皆さんのやり方が間違いということではありませんので、自由にやってみてくださいね。

''CircularMovement03.java''
{{pre num
import java.applet.*;
import java.awt.*;

/*
 * 質点が円運動する様子を描いたアプレットです。
 * <applet code="CircularMovement03.class" width="200" height="200"></applet>
 * 
 */

/**
 * @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;
	}

}
}}