我在下面的代码中有一个奇怪的错误。向下滚动查看图像以参考此问题。在下面的图片中找到的程序使用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);
}
该函数根据其象限返回矢量角度的弧度。
在图像中的一个,任何给定的矢量将从红色标记x平面周围旋转,一路到-y垂直柱。 S->电子。
traversal zone 2, reversed direction
在图像中的两个,所述载体奇迹般地从E平面到S平面瞬间移动,并且行进以相反的方向。 S-> E,于是矢量传回图像1中的-X平面“S”。
我比较新来绘制与载体的东西。我记得学校有点触动,但我很久没有用过它了。有没有人有一个想法可能会发生在这里?为什么我的矢量传送,改变方向,为什么没有矢量穿过图像2的S左边的空区域,并且从图像1的S下降?
http://imgur.com/a/Skp5O 空区图像。没有向量遍历图的这个部分。 –
你应该使用vectorDirection中的atan2函数,而不是每个象限都有一个案例 – samgak
哇......该死的。我向上帝发誓,我昨晚尝试了一切,但没有发生任何事。它现在按预期工作。 –