gpt4 book ai didi

javascript - 使用数学来改变对象的位置(javascript)

转载 作者:行者123 更新时间:2023-12-04 02:15:10 27 4
gpt4 key购买 nike

我有一个很大的要求。它涉及到相当多的数学,这从来都不是我的强项,所以我想,我会请 Stackoverflow 上的人来帮助我。

我正在使用 Javascript 制作这个太阳系交互式动画。我正在使用三 Angular 函数为围绕太阳的行星创建围绕物体的完整 360 度旋转。我知道,行星是椭圆旋转的,但我不希望它对自己造成太大压力。

function rotate_point(originX, originY, body) {
body.angle += (1.0 / body.period); //calculates the angle, divided by distance from center of body
var ang = body.angle * 2.0 * Math.PI / 180.0; //calculates full 360° rotation required based on angle
var r = body.orbit;
return {
x: Math.cos(ang) * r - Math.sin(ang) * r + originX,
y: Math.sin(ang) * r + Math.cos(ang) * r + originY
};} // generic rendering of a unit orbital progression of a planet

正如你所看到的,这部分已经完成了,我的问题是:

我需要“调整”什么,以获得将物体推向太阳中心的效果。就像我突然将引力拉得更大,以至于它会拉到行星的轨道上,所以你会看到它们最终向那个中心坠毁。

对上述代码进行任何更改是否可行,如果可以,该代码需要看起来像什么?

我有一个 JS fiddle ,我希望有一些聪明的人能看到其中的挑战并帮助我!

FIDDLE

最佳答案

更新代码以使用开普勒行星运动第三定律应该很容易。由于您使用的是质量(行星)<<质量(太阳)的圆形轨道,因此开普勒第三定律基本上只是 Angular 动量守恒的陈述。

旋转动量定义为系统转动惯量 (I) 和 Angular 速度 (omega) 的乘积,单位为 rad/s。

从数学上讲,这只是:

I1 * omega1 = I2 * omega2



用我们可以使用的数量来表达这一点:

I = m * r^2 omega = r * dTheta/dt



所以由属性(property)守恒:

I1 * omega1 = I2 * omega2



两边都抵消了质量,给我们留下了 r 和 omega 的表达式。

r1^2 * omega1 = r2^2 * omega2



所以给定半径的变化,我们可以计算出必要的 Angular 速度变化。如果 r1 和 omega1 是初始半径和旋转速度,则给定轨道半径的新旋转速度表示为:

omega2 = omega1 * (r1/r2)^2



这可以通过在 rotate_point 中添加一行代码来完成。更新速度的函数:
function rotate_point(originX, originY, body) {
velocity_gain = Math.pow(sol["Earth"].orbit/body.orbit, 2)
body.angle += velocity_gain * (1.0 / body.period); //calculates the angle, divided by distance from center of body
var ang = body.angle * 2.0 * Math.PI / 180.0; //calculates full 360° rotation required based on angle
var r = body.orbit * orbitScale
return {
x: Math.cos(ang) * r - Math.sin(ang) * r + originX,
y: Math.sin(ang) * r + Math.cos(ang) * r + originY
};
}
// generic rendering of a unit orbital progression of a planet

function planetrotation ( planet ) {
var x, y, x_sun, y_sun, e, c_new;
e = document.getElementById ( planet );
x_sun = parseFloat ( document.getElementById ( "Sun" ).getAttribute ( "cx" ) );
y_sun = parseFloat ( document.getElementById ( "Sun" ).getAttribute ( "cy" ) );
c_new = rotate_point ( x_sun, y_sun, sol[planet], 0.5 );
e.setAttribute ( "cx", c_new.x );
e.setAttribute ( "cy", c_new.y );
} // Rotations of the planets around Sun

var sol = {
Mars: { period: 5.2, orbit: 400, angle: 51.0},
Earth: { period: 5.2, orbit: 300, angle: 51.0},
Venus: { period: 5.2, orbit: 200, angle: 51.0}
};

function animate () {
planetrotation("Venus");
planetrotation("Earth");
planetrotation("Mars");
}

这是模拟 3 个行星的 fiddle : https://jsfiddle.net/8kcj3bvz/

enter image description here

基本上,这个等式是说随着轨道半径的减小, Angular 速度必须增加才能使动量(在这种情况下是能量)守恒。

从长远来看,您可能需要考虑使用欧拉方法来模拟这个系统。对于像这样的引力体,它实际上非常简单,并且在模拟两个以上的物体时会非常强大。

编辑

附带说明一下,如果卫星的质量远小于母体,则轨道速度只是其半径的函数。所以定义 period实际上是多余的。和 angle在你的代码中。

关于javascript - 使用数学来改变对象的位置(javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37243830/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com