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

練習問題

  練習問題


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

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

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

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

CircularMovement03.java

001|import java.applet.*;
002|import java.awt.*;
003|
004|/*
005| * 質点が円運動する様子を描いたアプレットです。
006| * <applet code="CircularMovement03.class" width="200" height="200"></applet>
007| * 
008| */
009|
010|/**
011| * @author Osamu Koizumi
012| *
013| */
014|public class CircularMovement03 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) + getWidth()/2.0;
066|			y = - a * Math.sin( omega * t) + getHeight()/2.0;
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-d/2), (int)(y-d/2), d, d);
094|		// 描画色を灰色に設定する
095|		g.setColor( Color.GRAY);
096|		// 座標原点を定義する
097|		int x0 = getWidth()/2;
098|		int y0 = getWidth()/2;
099|		// x軸を描く
100|		g.drawLine( 0, y0, getWidth(), y0);
101|		// y軸を描く
102|		g.drawLine( x0, 0, x0, getHeight());
103|		// 描画色を青色に変更する
104|		g.setColor( Color.BLUE);
105|		// x軸への射影成分を描く
106|		g.fillOval( (int)(x-d/2), (int)(y0 - d/2), d, d);
107|		// 描画色を緑色に変更する
108|		g.setColor( Color.GREEN);
109|		// y軸への射影成分を描く
110|		g.fillOval( (int)(x0 - d/2), (int)(y - d/2), d, d);
111|	}
112|
113|	/*
114|	 * アプレット停止時に呼ばれます。
115|	 * @see java.applet.Applet#stop()
116|	 */
117|	public void stop(){
118|		th = null;
119|	}
120|
121|}

最終更新時間:2011年01月08日 17時20分10秒