【问题标题】:N-Body Gravity / Solar System Javascript SimulationN体重力/太阳系Javascript模拟
【发布时间】:2019-02-05 21:37:16
【问题描述】:

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

在观看了this 非常好的视频和他的一大堆其他视频后,我制作了一个快速的 MS 绘画图像来尝试简化我的情况。 在第二个场景中,您可以看到新位置是使用速度、引力和这两个'方向'之间的角度计算的?

我不知道如何弄清楚这一切。

下面是我的代码的 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 中的 2d 物理库,已经实施了这些力量。
  • YouTube 上有一系列关于在 JavaScript 中使用 p5.js 库模拟力的精彩视频。 This one 与重力有关。
  • 只是为了解决您的第一个要点:您需要按比例缩小质量,但不是相同的因子 0.0002 或其他。您希望行星保持相同的轨道周期。看看Kepler's 3rd law。为了保持T 不变,质量必须按照距离的立方根进行缩放。

标签: javascript math simulation physics


【解决方案1】:

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

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

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

  • 在(x,y) 位置的行星在太阳引力作用下的标量加速度(质量为M):a = G*M/(d*d) 其中d=sqrt(x*x+y*y)。请注意,这与行星的质量无关。
  • 加速度矢量:ax = -a*x/d,ay = -a*y/d(矢量(-x,-y)指向太阳,必须带长度a)
  • 行星速度变化(vx,vy): vx += ax*dt, vy += ay*dt
  • 行星位置变化:x += vx*dt,y += vy*dt

【讨论】:

  • 感谢您的评论,这正是我所追求的。一种缩小所有内容的方法。自从昨天发布这篇文章以来,我已经设法意识到,实际上,我已经做出的数学背后是(至少我认为)是正确的,而且只是大数字导致了问题,所以我基本上需要把所有的大数字都挤进罐子里。您在此处列出的公式将对此有很大帮助 :-) 我在这里有一个演示 - jsfiddle.net/wdejbfzk/3 我已将所有值都降低到更小的值。
  • 我陷入了你现在所说的话,并意识到我错过了dt,但a = G*M/(d*d) 是指a = G*(M1*M2)/(d*d)? M1 是行星质量,M2 在我的情况下是太阳质量
  • @Slopax 不要混淆力和加速度。注意一般a = F/m。物体的重力加速度不取决于它自身的质量。忽略空气阻力,所有物体下落的速度都一样快。在您的速度计算中,您还划分了this.mass,因此只剩下其他质量。对于M,我的意思是太阳的质量——正如解释的那样。只要忽略行星之间的力,就不需要行星的质量。还要检查涉及数量的单位!
  • 啊,谢谢,我刚刚对代码进行了更改并添加到dt,这似乎可以让我们改变模拟的速度,太棒了:-)我有一个更好的感谢您,现在了解行星之间的力量如何运作! jsfiddle.net/c9yponvd/7(第 128 行)-我现在只需要弄清楚如何将真实的 NASA 值缩小到屏幕...:D
猜你喜欢
  • 2023-03-29
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2015-09-25
  • 2011-01-04
相关资源
最近更新 更多