- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!! 練習問題
それではひとつ練習問題を出したいと思います。
円運動は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;
}
}
}}