#近づくことと、ぶつかることは違う
StarTrailの重力シミュレーターで、2つの粒子が近くを通る例を観察します。使うのはアプリ内の「固定2粒子の近接例」。現実の天体の測定値ではなく、条件を公開した小さな数値実験です。
このモデルには接触・合体・跳ね返りの処理がありません。画面の丸が重なった場合も、それだけで衝突したとはいえません。まずは「同じ計算結果を遅く見ること」と「計算そのものを変えること」を分けて試してみてください。
#最初の条件
| 条件 | 値 |
|---|---|
| 粒子数 | 2 |
| 重力定数 G | 0.2 |
| 計算刻み dt | 0.004 |
| 軟化 ε | 0.02 |
| 保存する更新回数 | 200 |
| 保存点 | 初期状態0を含む201点 |
| 質量 | 両方とも1 |
| 粒子1の初期位置 | x=-0.4、y=0.08 |
| 粒子1の初期速度 | vx=0.7、vy=0 |
| 粒子2の初期位置 | x=0.4、y=-0.08 |
| 粒子2の初期速度 | vx=-0.7、vy=0 |
位置・質量・時刻はモデル内の値で、km・kg・秒への換算は定義していません。乱数は使わず、初期座標を直接指定しています。表示用の点径は各4ピクセルですが、重力や接触を計算する半径ではありません。
加速度は、各ペアの座標差に対して G × 相手の質量 / (距離² + ε²)^(3/2) を掛けて求めます。加速度の蓄積はFloat32配列、位置と速度はJavaScriptの数値です。速度を先に v += a × dt で更新し、その更新済み速度で x += v × dt を計算します。Velocity Verlet法ではありません。
#同じ保存点をゆっくり見る
- StarTrailで「固定2粒子の近接例を開く」を押します。
- 「保存点内の最接近へ」を押し、選択される保存点と距離を読みます。
- 「1点戻る」「1点進む」で前後を比較します。
- 再生速度を5・10・30保存点/実秒の目安へ切り替えます。
- 粒子の表示径、位置の表示範囲と1・2・4倍の表示倍率も切り替えます。
再生速度は、すでに計算した配列を読む速さです。変更しても、初期条件・計算刻み・201保存点の位置と速度は変わりません。表示径も軌跡へ影響しません。表示範囲を変えた場合は、同じモデル座標が別の画面倍率で描かれます。
dtを変えてもう一度計算する操作は、これとは別です。dtは位置や速度の更新に使うため、軌跡や保存するモデル時刻そのものが変わります。小さいdtへ変更することを「同じ軌跡のスロー再生」とは呼びません。
#この実行で観察したこと
この実装で上の条件を200回進めると、保存点内の最小距離は保存点119、モデル時刻0.476、距離約0.061381でした。初期状態を0番として数えています。単体検査では距離を 0.06138097944288283 と確認しています。
これは保存した201点から選んだ最小値です。点と点の間の連続的な最接近を解いた値ではなく、真の軌道の正確な最接近時刻でもありません。また、距離が小さいことだけで「衝突」「合体」「重力アシストの成立」と判定してはいません。最後まで粒子数と質量はそのままです。
近接のしきい値0.1は、観察する範囲を選ぶための目安です。力や表示径は変えず、「保存点の距離がこの値以下か」だけを数えます。しきい値を変えても同じ軌跡が残ることを確認してください。
#条件ごと保存する
「初期条件・全保存点をJSON保存」には、初期座標と速度、質量・表示属性、G・dt・ε、全保存点の位置/速度、選択した2粒子、表示範囲、しきい値、手書きメモが含まれます。「この保存点を条件付きPNG保存」は、その時点の図と条件を1枚にします。
自由操作から記録する場合も、開始時点の全粒子を複製して200回進めます。記録は最大120粒子で、超える場合は粒子を勝手に間引かず記録を止めます。自由操作の未記録の過去まで巻き戻せる機能ではありません。自由操作へ戻ると、記録を始めた元の状態が停止したまま残っています。
#この例で証明していないこと
現実の天体の軌道精度、エネルギーの厳密な保存、長時間の安定性、物体の接触や合体を検証する実験ではありません。軟化や有限の刻み、丸めに依存するモデルの観察です。異なる実行環境で最後の桁まで一致する保証もありません。保存した条件を残して、何を変えた比較なのかが追える形で利用してください。
[ ./next_action ]
読んだら、 StarTrail を実際に動かす。
この開発ログは StarTrail をどう作ったかの記録です。 読み終わったらそのままサービス本体へ戻って、実物で価値を確かめてください。