PhObject Class

物理物体クラス PhObject Class Ver.2

Internet Explorer 4.0以降でご覧ください。

Javaの汎用部品作りに挑戦中。
質量、位置、速度、加速度、形といった属性を持った「力学的物体」のクラスを試作中です。物体の属性を初期設定し、はたらく力を与えると、微分方程式的な数値演算によって物体は動き出します。はたらく力の設定を変えるだけでどんな運動もシミュレートできるはず・・・

サンプルアプレット集


のちのちのBeans化も視野に入れて以下のような小さなclassの集まりとして構成しました。
ベクトルクラス Vect.class
 速度、加速度、力はベクトル量ですが、「向き」と「大きさ」で考えるのが感覚的にも自然です。そこで、極座標系でベクトルを扱うVect.classを作りました。
Vect.javaのソース
Vect.javaのドキュメント

位置ベクトルクラス Position.class
 位置もベクトル量ではあるのですが、(x,y)で考えるほうが自然なので直交座標系のベクトルで扱っています。その位置から別の位置を見たときの距離を求めるメソッドと方向を求めるメソッドをもっています。
Position.javaのドキュメント

力学物体クラス PhObject.class
 物体は、質量・位置・速度・加速度・力といった属性を持ちます。物体を画面に描画するためのメソッドももたせました。今のところ大きさ固定の青い円を描くだけですが、GIF画像を背景を透明にして描画できるように改造中です。この描画メソッドに手を加えて軌跡を表示したり、力や速度の矢印を表示させるように改造する予定です。
PhObject.javaのソース
PhObject.javaのドキュメント

力学空間クラス PhField.class
 実際に物体が運動する場としてPhField.classを設定しました。このクラスはRunCanvas.classを継承したアニメーション可能なクラスです。抽象クラスとして定義しており、物体の初期位置・初速度などの初期化メソッドと物体にはたらく力の計算メソッドを定義したサブクラスを定義し直すことで実行可能となります。
 PhObjectの配列を使っているので、画面に描画される物体の個数を自由に設定できます。
 時間経過時の計算には、現在オイラー法の拡張版(カエル飛び法?)を使用していますが、4次のRunge-Kutta法を使う方法も検討中です。
PhField.javaのソース
PhField.javaのドキュメント

class file のダウンロード phobject.zip (33kbyte)

PhFieldを使うための雛形
import java.awt.*;
import java.io.*;
import java.lang.*;

/**
 * PhObject のサンプルアプレット
 *   ★マークのところを適当に入れ替えて利用
 */
public class Test0 extends java.applet.Applet {
  /** シミュレーション用の物理空間  **/
  MyField workField = new MyField();
//^^^^^^★                ^^^^^^★下で定義したクラスと同じ名前にする
  public void init(){
    setLayout(new BorderLayout());
    add("Center",workField);
    workField.set_sleepTime(); // 描画の時間間隔を★/1000sに設定。
    workField.init();            // 初期設定(物体の個数は★個)
  }
  
  public void start(){
    workField.start();           // アニメーション開始
  }
}

/** PhFieldを継承したMyField Class **/
class MyField extends PhField{
//    ^^^^^^^★上の名前とそろえる
  /** 位置や速度の初期設定  **/
  public void init(int k){
    makeObject(k);
    dt = ;                                           // 時間間隔を設定

    obj[0].s.set( ★x座標, ★y座標);                   // 物体の初期位置設定
    obj[0].v.set( ★大きさ, ★角度 / 180.0 * Math.PI); // 初速度設定
    obj[0].set_m( ★質量);                             // 物体の質量設定
    set_force();                                       // 力を計算
    obj[0].a.set_acc( obj[0].get_f(), obj[0].get_m()); // 加速度を計算
    obj[0].v.add_vel( obj[0].get_a(), - dt / 2);       // 初速度をdt/2ずらす
      // 物体の個数分だけ記述
  }
 
  /** 物体にはたらく力を計算  **/
  public void set_force() {
    obj[0].f.set( ★力の大きさ, ★力の向き);
   // 物体の個数分だけ記述
  }
}