REALbasic かってに連載します(第16回)


 Buildの画面で、ファイル名やバージョンを書き込んでBuildした後、プロジェクトを保存すると、これらの情報も保存されます。
 第16回 - 銀河系の誕生と衝突シミュレーション(the galactic system) -

 質量の異なる50個の星を用意して、相互の万有引力計算より小さい銀河系の創世と動きを表現します。初期条件により渦巻き型銀河の創世とそれらの衝突なども見ることができます。CPUのパワーとメモリーにゆとりがあれば、1000個くらいで試してみたいところです。

 多重衝突運動サンプル「Particle1.0」をつけ付け加えました。これは分子運動を表現しています。9/2


  1. REALbasicのアイコンをダブルクリックすると、初期画面が出ます。 まずEditメニューのEditor Settingsを選びます。ここでDefault Control FontのFontを「System」に変更しておきます。これで表示に日本語が使えるようになります。

  2.  Window1に、ToolBoxから次のものを持ち込む。

     説明を書くためListBox1、SpriteSurface1を開くためのPushButton1、それとSpriteSurface1です。

  3.  変数の定義 

     EditメニューのNewPropertyで配列変数を定義します。後から配列を再定義して星の数を増やすことを考えてはじめの配列要素の数は10としておきます。「Picture型」の配列変数star(10)、「Sprite型」の配列変数Sprite(10)、を定義します。また、位置、速度、加速度などの「Double型」の配列変数も用意します。x(10)、y(10)、vx(10)、vY(10)、ax(10)、ay(10)、r(10),m(10) などです。さらに、「Picture型」で背景用にback01、テキスト表示用にtext01、「Sprite型」でSpritetext01、惑星の数変更用に「integer型」でnobを定義します。

  4.  それぞれの星相互の万有引力を計算する。

     0から nob の間での 「nob+1」 個のすべての星が必ず1回ずつペアーで選ばれて計算するルーチンは以下のようになります。
    dim n ,i  as integer
    for n =0 to nob-1
        for i=n+1 to nob
     //////////////////////////////
     //ここに、n と i を配列要素とした、ペアーの計算式を書く。
     //////////////////////////////
     next
    next


    実際の、万有引力ルーチンは以下のようになります。
    dim n ,i  as integer
    dim dt,r  as double
    //刻み値
    dt=.01
    //
    //
    //全部の星の相互の引力を計算します。
     for n =0 to nob-1
        for i=n+1 to nob
    //ここが心臓部分です、物体の動きをシミュレート
    //する場合の基本ルーチンと思って下さい。
    //vxはx方向の速度、vyはy方向の速度、
    //dtは微少時間です。
    //「r」は星と星の間の間隔
    r=(1/50)*sqrt((x(i)-x(n))*(x(i)-x(n))+(y(i)-y(n))*(y(i)-y(n)))
    //近付き過ぎると誤差が大きくなるので最接近距離を制限します
    //この部分が、理論的には正しくありません。
    if r<2 then
    r=2
    end if
    //万有引力による加速度です、質量も入れています。
    ax(n)=-(x(n)-x(i))*m(n)*m(i)/(r*r*r)
    ay(n)=-(y(n)-y(i))*m(n)*m(i)/(r*r*r)
    ax(i)=-(x(i)-x(n))*m(n)*m(i)/(r*r*r)
    ay(i)=-(y(i)-y(n))*m(n)*m(i)/(r*r*r)
    vx(n)=vx(n)+ax(n)*dt
    vy(n)=vy(n)+ay(n)*dt
    vx(i)=vx(i)+ax(i)*dt
    vy(i)=vy(i)+ay(i)*dt
    x(n)=x(n)+vx(n)*dt
    y(n)=y(n)+vy(n)*dt
    x(i)=x(i)+vx(i)*dt
    y(i)=y(i)+vy(i)*dt
    //
    //
    Sprite(n).x=x(n)
    Sprite(n).y=y(n)
    Sprite(i).x=x(i)
    Sprite(i).y=y(i)
    //
    //
    next
    next
    //「return」キーで Sprite を閉じます。
    If Me.KeyTest(&h24) Then
    Me.Close
    End if
    
  5.  初期条件の変更は、相当に微妙です。

     PushButtonのActionに初期条件を設定しています。位置、速度、質量は工夫して下さい。  さらに、さきほど説明した、最接近距離の条件部分の「r」の係数「1/50」や「r<2」の部分も変更して実験してみると面白いと思います。
    表示画面の範囲の関係で、画面内におさまる初期条件や、集団がハッキリ別れる条件は、実験してみないとわかりません。それだけ予想できない動きになります。
     お楽しみください。




 今回の「Galaxy10f」の ソースプログラムです。おまけに、多重衝突運動サンプル「Particle1.0」をつけています。これは分子運動を表現しています。
  
  プロジェクトファイルのみです。REALbasicの最新バージョンが必要です。30 kバイト  

  ソースコードについての質問やご意見がありましたら以下のアドレスまでご連絡下さい。
          koko-@mx2.tiki.ne.jp

このホームページのホストは です。 無料ホームページをどうぞ!