旋转矢量时的错误,通过调整旋转创建新矢量

时间:2017-03-03 20:51:30

标签: javascript math vector rotation trigonometry

我在以下代码中遇到了一个奇怪的错误。向下滚动以查看图像以供参考此问题。在下面的图像中找到的程序是使用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);
}

此函数根据其象限返回矢量角度的弧度。

Traversal zone 1

在图像1中,任何给定的矢量将从标记为红色的x平面旋转,一直到-y垂直列。 S-&GT; E

traversal zone 2, reversed direction

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

我用向量绘制东西比较新。我记得学校有点兴奋,但我很长时间没用过它。有没有人知道这里可能发生什么?为什么我的矢量传送,改变方向,为什么没有矢量遍历图像2的S左侧的空区域,以及图像1的S的下方?

1 个答案:

答案 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)

}