我正在尝试[x,y]
围绕原点旋转一个矢量,以便在旋转完成后它位于 X 轴上。为了做到这一点,我首先计算 和 之间的角度[x,y]
,[1,0]
然后对其应用一个简单的二维旋转矩阵。我正在使用numericjs来处理向量。
math.angleBetween = function(A, B) {
var x = numeric.dot(A, B) / (numeric.norm2(A) * numeric.norm2(B));
if(Math.abs(x) <= 1) {
return Math.acos(x);
} else {
throw "Bad input to angleBetween";
}
};
math.alignToX = function(V) {
var theta = -math.angleBetween([1,0], V);
var R = [[Math.cos(theta), -Math.sin(theta)],
[Math.sin(theta), Math.cos(theta)]];
return numeric.dot(R, V);
};
(注意:math
是我项目中的命名空间对象。Math
是老数学对象。)
这段代码有时可以工作,但是在某些情况下,无论我运行多少次math.alignToX
向量都不会接近与 X 轴对齐。我通过检查y
坐标是否小于来测试这个1e-10
。
我也尝试过使用Math.atan2
隐式z
坐标 0,但结果是一样的。不会抛出错误。一些示例结果:
math.alignToX([152.44444444444434, -55.1111111111111])
// result: [124.62691466033475, -103.65652585400568]
// expected: [?, 0]
math.alignToX([372, 40])
// result: [374.14435716712336, -2.0605739337042905e-13]
// expected: [?, 0]
// this value has abs(y coordinate) < 1e-10, so its considered aligned
我究竟做错了什么?