Gij*_*fwb 8 javascript simulation physics p5.js
我对编程非常陌生,我收到了一份学校作业,我必须在 p5.js 中创建一个模拟地球绕太阳运行的轨道。我们得到了一种计算引力的简化方法,但我想使用实际公式(Fg = G M m/r^2)。在我的代码中,一个像素等于 10^9 米或一百万公里。如果我使用太阳和地球的实际质量,以及它们之间的实际距离,我必须把地球移动的速度大约为每秒 1 个像素或 100 万公里/秒,大约是是地球在轨道上实际速度的 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);
}Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.0.0/p5.min.js"></script>Run Code Online (Sandbox Code Playgroud)
你知道可能是什么原因吗?提前致谢。
您的加速度似乎以米每秒2为单位,速度以像素每秒为单位。然后你将它们组合起来:
vy += ay * dt;
vx += ax * dt;
Run Code Online (Sandbox Code Playgroud)
你们的重力加速度强了十亿倍。因此,你的行星必须以比正常速度快 31,623 倍的速度才能保持圆形轨道。