Javascript 二维中点围绕原点的旋转收敛为0

Javascript 二维中点围绕原点的旋转收敛为0,javascript,math,rotation,trigonometry,Javascript,Math,Rotation,Trigonometry,编写以下代码是为了在二维中围绕原点旋转点。然而,它不是绕着一圈走,而是不断地向中心会聚。(最初在Three.js上运行)此代码工作完全正确。(我在其他平台上也做过,甚至在excel工作表中也做过数值模拟) 为什么会发生这种情况 <body> <div id="vals"></div> <script> theta = Math.PI / 90.0; var x = 1; var y

编写以下代码是为了在二维中围绕原点旋转点。然而,它不是绕着一圈走,而是不断地向中心会聚。(最初在Three.js上运行)此代码工作完全正确。(我在其他平台上也做过,甚至在excel工作表中也做过数值模拟)

为什么会发生这种情况

<body>
    <div id="vals"></div>
    <script>

        theta = Math.PI / 90.0;
        var x = 1;
        var y = 1;

        var element = document.getElementById("vals");

        var i;
        for (i = 0; i < 10000; i++){
            var r = Math.sqrt( x * x + y * y );
            var para = document.createElement("pre");
            var node = document.createTextNode("x="+x+"     y="+y+"     r="+r);
            para.appendChild(node);
            element.appendChild(para);
            x = (x * Math.cos(theta)) - (y * Math.sin(theta));
            y = (y * Math.cos(theta)) + (x * Math.sin(theta));
        }
    </script>
</body>

θ=Math.PI/90.0;
var x=1;
变量y=1;
var元素=document.getElementById(“VAL”);
var i;
对于(i=0;i<10000;i++){
var r=数学sqrt(x*x+y*y);
var para=document.createElement(“pre”);
var node=document.createTextNode(“x=“+x+”y=“+y+”r=“+r”);
子节点(节点)段;
要素.附件(第6段);
x=(x*数学cos(θ))-(y*数学sin(θ));
y=(y*Math.cos(θ))+(x*Math.sin(θ));
}
p、 美国。
我知道如果我将这些值标准化,然后乘以大小,我会得到正确的答案。然而,我想知道为什么这个精确的东西不起作用。

首先,应用更改的x值得到y。这是错误的。相反,记住旧的价值观并加以利用

     var tempx = x;
     x = (x * Math.cos(theta)) - (y * Math.sin(theta));
     y = (y * Math.cos(theta)) + (tempx * Math.sin(theta));
第二:重复使用相同的值会导致错误累积,所以半径可能会收敛-正如您所看到的。所以更精确的方法是存储初始值并使用当前角度(而不是角度差)旋转它们


哦,我是个十足的白痴。非常感谢你为我挑选了这个
    var x0 = 1;
    var y0 = 1;

        in the loop:
    x = (x0 * Math.cos(theta * i)) - (y0 * Math.sin(theta * i));
    y = (y0 * Math.cos(theta * i)) + (x0 * Math.sin(theta * i));