私はプログラミングに非常に慣れていないので、p5.jsで太陽の周りを回る地球の軌道のシミュレーションを作成する必要がある学校の課題を受け取りました。重力を計算する簡単な方法が提供されましたが、実際の式(Fg = G M m / r ^ 2)を使用したいと思いました。私のコードでは、1ピクセルは10 ^ 9メートルまたは100万kmに相当します。太陽と地球の両方の実際の質量、およびそれらの間の実際の距離を使用する場合、地球が移動する速度を約1ピクセル/秒または100万km / sに設定する必要があります。軌道上の地球の実際の速度の30,000倍。私のコード:
x = 550;
y = 400;
vy = -1;
vx = 0;
dt = 1;
sunSize = 80;
planetSize = 10;
// 1 pixel equals 1 million km
canvasSize = 800;
starAmount = 600;
function setup() {
frameRate(60);
noStroke()
solarXY = 0.5 * canvasSize;
xSun = solarXY;
ySun = solarXY;
createCanvas(canvasSize, canvasSize);
M = 1.989 * pow(10, 30);
m = 5.972 * pow(10, 24);
background(0);
for (i = 0; i < starAmount; i++) {
starX = Math.random() * canvasSize;
starY = Math.random() * canvasSize;
starSize = Math.random() * 3 + 1
ellipse(starX, starY, starSize, starSize);
}
fill(255, 192, 0);
ellipse(xSun, ySun, sunSize, sunSize);
}
function draw() {
r = sqrt(sq(xSun - x) + sq(ySun - y)) * pow(10, 9);
Fg = 6.67 * pow(10, -11) * m * M / sq(r);
if (x >= xSun) {
angle = atan((ySun - y) / (x - xSun));
} else {
angle = PI + atan((ySun - y) / (x - xSun));
}
xOld = x;
yOld = y;
Fgx = cos(angle) * Fg
Fgy = sin(angle) * Fg
ay = Fgy / m;
ax = -Fgx / m;
vy += ay * dt;
vx += ax * dt;
y += vy * dt;
x += vx * dt;
fill(30);
ellipse(xOld, yOld, planetSize, planetSize);
fill(0, 0, 192);
ellipse(x, y, planetSize, planetSize);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.0.0/p5.min.js"></script>
原因が何であるか知っていますか?前もって感謝します。
2
まだコードを完全には理解していませんが、地球の位置を計算する2つのモデルを混ぜているようです。ケプラーモデルは、軌道が楕円であると想定し、軌道パラメータから位置を計算しますが、ニュートンモデルは力のみを扱い、楕円軌道はその結果です。特に、2つの物体間の重力を計算しますが、楕円に沿った力を「リダイレクト」します。ニュートンモデルだけに切り替えることもできますが、それだけではいくつかの問題が発生します。大きい/小さい数値で精度の問題が発生することに注意してください。
—
エティエンヌオット
エティエンヌ・オット、これがどういう意味かよくわかりません。私の知る限り、重力は、重心に対する角度に基づいて、x成分とy成分に分割できます。ケプラーモデルとニュートンモデルの違いが何であるかわからないので、これがあなたの意図したものであるかどうかはわかりません。
—
Gijsfwb
私はあなたのコードを誤解しているようです。力を操作するとき、力をコンポーネントに分割するために角度を付けることは通常ありません。力の方向に沿って(長さ1の)単位ベクトルを計算し、力の強さを決定するスカラーと乗算する方が簡単です。とにかく、コードはそこで正しいことをしているようですので、それを無視しましょう。私が今疑問に思っているのは、変数の単位です。たとえば、タイムステップは1ですが、シミュレーションは呼び出しごとに1秒進むよりも動きが速いようです。おそらく1は1秒を意味しない。
—
エティエンヌオット
次に、単位を書き留めて、さまざまな計算を実行して、実際の速度の単位などを確認します。もう1つは、タイムステップが固定されていることですが、リアルタイムの1秒あたりにタイムステップが呼び出される頻度が不明であるため、シミュレーションが目的のタイムフレームで1年を完了するのにかかる時間(コール数)も不明です。シミュレーションをリアルタイムで作成することもできますが、年に1回の革命が見られることは非常に興味深いとは思いません。;)
—
エティエンヌオット
dtはフレームあたりの秒単位であり、計算ではすべての単位で秒を使用しているため、これは正しいと確信しています。私は速度がいつ何をするかを見てみますが、私にはそれは軌道全体を通して多かれ少なかれ同じ速度を維持しているように見えます
—
Gijsfwb