【问题标题】:Javascript/jQuery - Kepler Orbit with inadvertent accelerationJavascript/jQuery - 无意加速的开普勒轨道
【发布时间】:2014-01-30 15:11:27
【问题描述】:

我一直在努力实现一个简单的开普勒轨道,以证明我正在使用 JavaScript 进行概念验证。我面临的问题是我必须使用的数学会导致生成的点存在一定程度的不准确性。我正在使用以下等式来确定我的坐标。

y = sqrt(r-x^2)

我使用线性增加的 X 值来确定我的 y 坐标(当它接近 X 的上限时)导致 Y 值迅速变大。当我尝试沿接收到的坐标为任何东西设置动画时,它会加速到我的方程的极限。

目前我只在我的笛卡尔平面上计算象限 II,我确信有更好的方法来做到这一点,但是我对 JavaScript 数学方法相当陌生,并不完全确定如何实现我想要的做。

我想知道极坐标是否可能是计算的方式,然后如果可能的话,使用函数r = sqrt(x^2 + y^2) 和已知的x,y 坐标转换为笛卡尔坐标。

就像我说的那样,我不完全确定如何完成此操作或是否可能。以下是我到目前为止的来源。提前感谢您的帮助!

    var x = 0;
    var y;
    var r = 10;
    var check = setInterval(function(){topHalf()}, 20);

    function topHalf(){
    if (Math.pow(x,2) <= 10){

            y = Math.sqrt(r-(Math.pow(x,2)));   
            x = x + 0.01;
            $('#orb').offset({top:y*100, left:x*100});



    }else{
        console.log('done');
        clearInterval(check);
    }


    }

【问题讨论】:

  • 我认为是...'导致Y值迅速变小'...
  • 当您只想对一个值求平方时,没有理由使用Math.pow()。使用x * x
  • 注意:setInterval(function() { f() }, 20) 应该只是 setInterval(f, 20)
  • 我使用匿名函数来调用我的函数的原因是,即使我在变量中声明 setInterval,它也会立即调用该函数。在变量中调用它可以让我清除间隔,所以它是必需的。这正是他们在 w3schools 网站上的做法。我意识到不需要 Math.pow() ,但是我在另一个项目中使用它,在那里我进行了类似的计算,但指数更高。 Y 很快变小,这就是问题所在。我想知道是否有更好的方法来计算 Y,因为我希望这些点大致相同。

标签: javascript jquery math polar-coordinates cartesian-coordinates


【解决方案1】:

此指令在浮点中不精确(因为 0.01 不能表示为精确数字)。每次迭代误差都会变大。

x = x + 0.01;

替换为

i = i + 1
x = i * 0.01

误差被平方根进一步放大,也可能被 Pow 放大。将所有 Math.pow(x,2) 替换为 x * x

【讨论】:

  • Y 变小这么快的原因似乎是因为函数的性质。它是一个指数函数,这意味着当它接近极限时,它会加速。我刚刚测试了一个 Y 值与下一个 Y 值的比率,它从 1 附近开始,经过数千次迭代后,以 .46 结束。在大多数计算中它保持在 1 左右,当它接近 y=0 时,它确实会加速。所以我必须找出两件事中的一件,要么是一个乘以 x 的值,它会以相同的速率缩放比率,要么是总距离,然后运行一个不同的函数来遍历长度。
  • 好的。在星历软件中,我通常会看到极坐标。在轨道软件模拟中,我通常会看到矢量(2D 或 3D),模拟质量、加速度和速度。
  • 确实,我遗漏了很多信息。我只是想从中获得某种旋转动画。从那以后,我已经用距离、质量、基于距离向量的加速度和基于上述所有内容的速度的向量更新了代码。我很感激您的意见,我想我只需要做更多的研究。现在一切都很好,包括椭圆轨道,现在只处理矩阵旋转。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多