2014-02-26 187 views
0

我正在考慮一個財富類型的東西,你必須檢查一個標記是否落在一個插槽上。在視覺上,我們可以看到0,2pi,4pi等......處於相同的位置。如何通過編程檢查0是否等於2pi/4pi?假設我也有半徑,我想,也許我必須先將它轉換成笛卡爾座標,然後再比較它。但是,有沒有更好的方法來做到這一點?如何比較圓弧中的弧度?

編輯:另外,我應該清楚標記可以落在插槽之間的任何位置。例如,標記可以在0到π/ 6之間的任何地方。

回答

1

這是你想要的嗎?

var smallestEquivalentValueInRadians = originalValueInRadians % (2 * Math.PI); 

如果你想比較,你可以這樣做:

a % (2 * Math.PI) === b % (2 * Math.PI) 

%是求餘運算,基本上它減去第一,多次第二個操作數,因爲它可以(假設你是處理正數)。

爲了應付負值:

function normalizeRadian(a) { 
    var circle = Math.PI * 2; 
    a = a % circle; 
    if (a < 0) { 
    a += circle; 
    } 
    return a; 
} 

也比較浮點數時,這是一個好主意,有一些「fuzzyness」,因爲他們opperations可能不夠精確。

function fuzzyEqual(a, b) { 
    var fuzz = 0.001; 
    return a < b + fuzz && a > b - fuzz; 
} 

因此,完整的解決方案是:

function fuzzyEqualRadians(a, b) { 
    return fuzzyEqual(normalizeRadian(a), normalizeRadian(b)); 
} 
+0

我不明白爲什麼2%? –

+0

我不確定我的問題寫得不好,但這不起作用。 '(0 * Math.PI)%2 ===(2 * Math.PI)%2'是'false' – Strawberry

+0

你讓我打開維基百科:)對不起,它是(2 * Math.PI),而不是2 – sabof