Javascript 旋转矢量时出现错误,使用“调整旋转”创建新矢量

Javascript 旋转矢量时出现错误,使用“调整旋转”创建新矢量,javascript,math,vector,rotation,trigonometry,Javascript,Math,Vector,Rotation,Trigonometry,下面的代码中有一个奇怪的bug。向下滚动查看有关此问题的参考图像。下图中的程序是使用javascript在画布上绘制的,因此请注意x和y坐标都是正的,因此y坐标相对于图形是颠倒的 let rotateVectors = (vs, t) => { return sortVectors(Object.keys(vs).map(v => { console.log(vs[v].vector.direction); let rateOfRotat

下面的代码中有一个奇怪的bug。向下滚动查看有关此问题的参考图像。下图中的程序是使用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);
}
let vectorDirection=(c)=>{
//零向量
如果(c.x==0&&c.y==0)返回0;
//垂直和水平的基本方向
如果(c.x==0),则返回c.y>0?.5:1.5;
如果(c.y===0),则返回c.x>0?0:Math.PI;
//第三季度
否则如果(c.x<0&&c.y<0)返回(1+(Math.atan(-1*((c.y*-1)/c.x));
//问题2
否则如果(c.x<0&&c.y>0)返回(Math.PI/180)*(180+toDegrees(Math.atan((c.y*-1)/c.x));
//第四季度
否则如果(c.y<0&&c.x>0)返回(Math.PI/180)*(toDegrees(Math.atan((c.y*-1)/c.x));
//q1
否则返回Math.atan(c.y*-1/c.x);
}
此函数根据向量的象限返回向量角度的弧度

在图1中,任何给定的向量都将从标记为红色的x平面旋转到-y垂直列。S->E

在图2中,矢量神奇地从E平面传送到S平面,并以相反的方向移动。S->E,向量传送回-X平面的图像1中的“S”


我对用矢量画东西比较陌生。我记得学校教过一点trig,但我已经很久没用了。有人知道这里会发生什么吗?为什么我的向量在传送、改变方向,为什么没有向量穿过图像2 S左边的空区,以及图像1 S的空区?

感谢samgak在评论中给出的答案。我用这段代码替换了原来的矢量方向函数。它按预期工作。矢量以预期的方向和速率旋转

let vectorDirection = (c) => {
//THE ZERO VECTOR
  if(c.x === 0 && c.y === 0) return undefined;
  else return Math.atan2(-1*c.y,c.x)

}

空区图像。没有向量穿过图形的此扇区。您应该在vectorDirection中使用atan2函数,而不是为每个象限设置一个事例。。。。该死的。我向上帝发誓,我昨晚试了一整晚,但什么也没发生。它现在可以正常工作了。很高兴听到它现在可以工作了。那么,问题解决了吗?如果没有其他问题,不妨删除这个问题。否则你可以自我肯定。我来回答。