万有引力シミュレーション

無重力、真空の空間で、質量を持った球体がどのような挙動をするかシミュレーションします。球体は、範囲内で質量がランダムに決まります。発射ボタンを押すと、質量が青色の球体の10倍ほどの球体が左方向から発射されます。

シミュレーションを始めると、自然と中心部に集まり大きな球体になります。そして、自転を始めます。自転が速くなると、引力で球体を維持できずバラバラになります。そのうち、球体を維持できる大きさの塊がいくつか出来上がります。

生成AIをもちいた制作

なお、このプログラムはHTML・CSS・JSを生成AIをもちいて制作しました。

概要はすぐできました。しかし、パラメーター調整がなかなかうまく行きませんでした。

ちなみに、書いたプロンプトは以下のような感じです。

1回目

あなたは優秀なフロントエンドプログラマーです。そして、物理学にも精通しています。
javascriptで、真空中・無重力で100個の球体が存在するとして、万有引力をシミュレートするプログラムを作ってください。
詳細仕様は、以下によります。

・それぞれの球体は、1000000kgとしてください。
・球体同士の反発係数は0とします。
・10秒ほどで動きが収束するように、デルタ時間を加速してください。
・数値計算法によりシミュレートしてください。
・画面端で跳ね返るものとします。

2回目

以下のコードをベースに改良してください。
・画面中央付近(x方向70%、y方向50%)に、質量が10,000,000kgの球体を配置してください。この球体は動かず、大きさを持ちません。
・球体の大きさを半分にし、数を300個としてください。色は青とします。
・画面左から、300個の球体と同じ大きさ・質量の球体を発射します。ただし、速度は10m/sとします。
・また、画面にボタンを配置し、ボタンをクリックしたときに球体を発射します。
・発射された球体は、色を黃とします。

~コード省略~

3回目

以下を追加修正してください。差分だけでOKです。
・左から発射する球体は、Y方向50%の位置としてください。
・発射する球体の速度は、500m/sとしてください。

4回目

リセットボタンを追加してください。差分だけでOKです。

5回目

これまでのコードの重複を排除して、短縮してください。また、そのほかの最適化もお願いします。
できあがったら、コード全体を表示願います。

6回目

それぞれのボールに質量を持たせて書き換えてください。

7回目

打ち込む球体の大きさを10倍にしてください。差分だけでOKです。

8回目

以下を追加修正してください。差分だけでOKです。
球体同士の衝突は、5%跳ね返るものとします。

9回目

反発係数を0に調整したとき、挙動がおかしいです。再検討してください

10回目

以下のコードで、リセットボタンと、発射ボタンを横に並べてください。差分だけでOKです。

~コード省略~

多少コードを手修正しています。以下が調整した内容。

  • 中央部の球体はなくしました
  • 質量は、AI提示のものより変更しています
  • 球体の数を増やしました
  • 反発係数も調整しています