N体重力/太阳系Javascript模拟

问题描述 投票:1回答:1

美好的一天,我正在尝试用javascript创建一个简单的2D太阳系模型,但是在理解如何计算下一帧行星的位置时遇到一些麻烦,以及其他一些我将详细介绍的内容很快。

看完this非常好看的视频和他的其他一些人之后,我做了一个快速的MS画像试图简化我的情况。对于第二个场景,您可以看到使用速度,引力和这两个“方向”之间的角度来计算新位置?

enter image description here

我无法理解如何弄清楚这一切。

下面是我的代码的JS小提琴。您会注意到我正在尽力使用真正的NASA给定数据以保持其准确性。

您将特别关注第138行,这是进行下一步行动的所有计算的地方。

https://jsfiddle.net/c8eru7mk/9/

attraction: function(p2) {
    // Distance to other body
    var dx = p2.position.x - this.position.x;
    var dy = p2.position.y - this.position.y;
    var d = Math.sqrt(dx ** 2 + dy ** 2); // Possibly correct

    // Force of attracrtion
    this.f = G * (this.mass * p2.mass) / (d ** 2); // Possibly Correct

    // Direction of force, If you read it hard enough you should be able to hear my screams of pain
    // Not sure if this is correct, most likely not.
    var theta = Math.atan2(dy, dx);
    var fx = Math.cos(theta) * this.f;
    var fy = Math.sin(theta) * this.f;

    this.velocity.x += fx / this.mass;
    this.velocity.y += fy / this.mass;

    this.position.x += this.velocity.x;
    this.position.y += this.velocity.y;
}

我目前面临的问题是

  • 如果我要使用NASA值,行星之间的距离是如此之大,它们将不适合屏幕,我不能简单地通过将它们乘以0.0002或其他任何东西来缩小距离,因为它会使引力常数,模拟将完全关闭。
  • 我不知道如何计算下一个位置,过去一周我的大脑已多次破坏,试图尝试几次。
  • 我不知道如何检查我的行星配置数据是否错误,或模拟是否错误,所以我只是在猜测。

这也是我第一次实际编写比javascript中的按钮更复杂的东西,所以欢迎对代码布局和诸如此类的反馈!

非常感谢

javascript math simulation physics
1个回答
2
投票

使用单独的坐标进行绘制时,使用NASA值不是问题。使用从实际坐标到屏幕坐标进行显示的适当线性变换不会影响物理值和计算。

为了模拟具有迭代更新的行星的运动,可以假设重力和速度在dt的一小部分时间内是恒定的。在从加速到速度以及从速度到距离的转换中,这个因子dt都缺失了。为dt选择合适的值可能需要一些实验。如果该值太大,则近似值与实际情况相差太远。如果该值太小,您可能看不到任何移动或舍入错误可能会影响结果。

首先让我们假设太阳总是在(0,0)。同样首先让我们忽略行星之间的力量。那么这是第一个不太接近的近似的必要公式:

  • 由太阳的引力(质量(x,y))在M位置的行星的标量加速度:a = G*M/(d*d)在哪里d=sqrt(x*x+y*y)。请注意,这与地球的质量无关。
  • 加速度矢量:qazxsw poi,qazxsw poi(向量qazxsw poi指向太阳,必须带长度ax = -a*x/d
  • 改变行星的速度ay = -a*y/d(-x,-y)a
  • 改变行星的位置:(vx,vy)vx += ax*dt
© www.soinside.com 2019 - 2024. All rights reserved.