N体重力/太阳系Javascript模拟

时间:2018-08-30 21:22:29

标签: javascript math simulation physics

美好的一天,我试图用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或其他任何方法来缩小距离,因为那样会弄乱了引力常数,模拟将完全关闭。
  • 我不知道如何计算下一个位置,过去一周,我的大脑几次试图内翻,内lo。
  • 我不知道如何检查我的行星的配置数据是否错误,或者模拟是否错误,所以我几乎只是在猜测。

这也是我第一次真正使用javascript编写比按钮更复杂的代码,因此欢迎提供有关代码布局和其他方面的反馈!

非常感谢

1 个答案:

答案 0 :(得分:2)

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

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

首先,让我们假设太阳总是在(0,0)。首先,让我们忽略行星之间的力。然后,这里是第一个不太差的近似值的必要公式:

    [li]通过太阳的重力(质量为(x,y))在位置M上的行星的标量加速度:a = G*M/(d*d),其中d=sqrt(x*x+y*y)。请注意,这与行星的质量无关。
  • 加速度矢量:ax = -a*x/day = -a*y/d(矢量(-x,-y)指向太阳,并且必须使其长度为a
  • 行星速度(vx,vy)的变化:vx += ax*dtvy += ay*dt
  • 行星位置的变化:x += vx*dty += vy*dt