我在以下代码中遇到了一个奇怪的错误。向下滚动以查看图像以供参考此问题。在下面的图像中找到的程序是使用javascript在画布上绘制的,因此请注意x和y坐标都是正的,因此y坐标相对于图形是颠倒的。
let rotateVectors = (vs, t) => {
return sortVectors(Object.keys(vs).map(v => {
console.log(vs[v].vector.direction);
let rateOfRotation = -.01 * (Math.random() * (5-1)+1);
let vector = vs[v].vector
let p = vector.magnitude;
let c = vector.coords;
let x = c.x*Math.cos(rateOfRotation) - c.y*Math.sin(rateOfRotation);
let y = c.x*Math.sin(rateOfRotation) + c.y*Math.cos(rateOfRotation);
return vector(cartesian2dCoordinate(x,y))
}));
}
在循环上调用上述方法以慢慢旋转向量一些随机量,map函数返回新向量,它采用x,y坐标或描述向量上升和运行的第二对笛卡尔对。
rotateVectors返回vs对象中所有向量的排序列表(按度数排序)。
let vectorDirection = (c) => {
//THE ZERO VECTOR
if(c.x === 0 && c.y === 0) return 0;
//cardinal directions, vertical and horizontal
else if(c.x === 0) return c.y > 0 ? .5 : 1.5;
else if(c.y === 0) return c.x > 0 ? 0:Math.PI;
//q3
else if(c.x< 0 && c.y < 0) return (1+ (Math.atan(-1*((c.y * -1) / c.x))));
//q2
else if(c.x < 0 && c.y > 0) return (Math.PI / 180)*(180 + toDegrees(Math.atan((c.y * -1)/c.x)));
//q4
else if(c.y < 0 && c.x > 0) return (Math.PI / 180)*(toDegrees(Math.atan((c.y * -1)/c.x)));
//q1
else return Math.atan(c.y*-1/c.x);
}
此函数根据其象限返回矢量角度的弧度。
在图像1中,任何给定的矢量将从标记为红色的x平面旋转,一直到-y垂直列。 S-&GT; E
traversal zone 2, reversed direction
在图像二中,矢量神奇地从E平面传送到S平面,并以相反的方向传播。 S-> E,于是矢量传送回图像1中的-X平面“S”。
我用向量绘制东西比较新。我记得学校有点兴奋,但我很长时间没用过它。有没有人知道这里可能发生什么?为什么我的矢量传送,改变方向,为什么没有矢量遍历图像2的S左侧的空区域,以及图像1的S的下方?
答案 0 :(得分:1)
感谢samgak在评论中给出答案。我用这段代码替换了原来的vectorDirection函数。它按预期工作。向量以预期的方向旋转,并以预期的速率旋转。
let vectorDirection = (c) => {
//THE ZERO VECTOR
if(c.x === 0 && c.y === 0) return undefined;
else return Math.atan2(-1*c.y,c.x)
}