[x,y]
回転が完了すると X 軸上にあるように、原点を中心にベクトルを回転させようとしています。これを行うために、まず と の間の角度を計算し[x,y]
、[1,0]
次に単純な 2D回転行列をそれに適用します。ベクトルを操作するために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
私は何を間違っていますか?