それではひとつ練習問題を出したいと思います。
円運動は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秒