2017-03-03 44 views
1

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

上述方法称为上一个循环来缓慢地旋转由一些随机量矢量,地图函数返回一个新矢量这需要的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

在图像中的一个,任何给定的矢量将从红色标记x平面周围旋转,一路到-y垂直柱。 S->电子。

traversal zone 2, reversed direction

在图像中的两个,所述载体奇迹般地从E平面到S平面瞬间移动,并且行进以相反的方向。 S-> E,于是矢量传回图像1中的-X平面“S”。

我比较新来绘制与载体的东西。我记得学校有点触动,但我很久没有用过它了。有没有人有一个想法可能会发生在这里?为什么我的矢量传送,改变方向,为什么没有矢量穿过图像2的S左边的空区域,并且从图像1的S下降?

+0

http://imgur.com/a/Skp5O 空区图像。没有向量遍历图的这个部分。 –

+0

你应该使用vectorDirection中的atan2函数,而不是每个象限都有一个案例 – samgak

+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) 

}