2016-03-03 56 views
0

我試着在JavaScript中使用旋轉矩陣來實現JavaScript旋轉,但由於某種原因,我得到了一些意想不到的結果 - 而不是繞着一個點移動,我的圖形沿着一條線移動。這裏我提供了完全可重複的例子,它證明了在旋轉點和中心之間的旋轉距離改變之後。這裏是:JavaScript中的浮點數精度或算法錯誤

var alpha = 0.10146071845187077; 
var cos_ = Math.cos(alpha); 
var sin_ = Math.sin(alpha); 
var center = [4861165.687852355,7606554.432771027]; 
var pointBefore = [4847712.770874163, 7610682.032298427]; 
var dist1, dist2, x1, y1, x2, y2, pointAfter = []; 
// 1. substract + 2. rotate + 3. get back 
// 1. 
x1 = pointBefore[0] - center[0]; 
y1 = pointBefore[1] - center[1]; 
// 2. 
x2 = cos_ * x1 - sin_ * y1; 
y2 = sin_ * x1 + cos_ * y1; 
// 3. 
pointAfter[0] = x2 + center[0]; 
pointAfter[1] = y2 + center[1]; 
// Check distances 
dist1 = Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2)); 
dist2 = Math.sqrt(Math.pow(pointAfter[0] - center[0], 2) + 
     Math.pow(pointAfter[1] - center[1], 2)); 
console.log(JSON.stringify({dist1: dist1, dist2: dist2})); 
// -> {"dist1":14071.888753138577,"dist2":14071.88875313881} 

我希望我犯了一些數學錯誤,但我看不到它們。

+0

預期結果是什麼?正如你所看到的,之前的距離與之後的距離相同,這樣權證實際上是在旋轉而不是在一條線上移動。 – Bergi

回答

0

不準確是由於浮點數的存儲方式: Is floating point math broken?

基本上,這是不可能的無理數和高精度實數存儲在64位的固定空間,所以會出現舍入誤差,這成爲很多操作後都很重要。想想2/3的數字,無論精度如何,都無法準確地表達出來。

一個可能的解決方案是隻在可能的情況下用整數進行計算或在每次操作後對結果進行四捨五入。