Javascript 二维中点围绕原点的旋转收敛为0
编写以下代码是为了在二维中围绕原点旋转点。然而,它不是绕着一圈走,而是不断地向中心会聚。(最初在Three.js上运行)此代码工作完全正确。(我在其他平台上也做过,甚至在excel工作表中也做过数值模拟) 为什么会发生这种情况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
<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));