0
我正在考慮一個財富類型的東西,你必須檢查一個標記是否落在一個插槽上。在視覺上,我們可以看到0,2pi,4pi等......處於相同的位置。如何通過編程檢查0是否等於2pi/4pi?假設我也有半徑,我想,也許我必須先將它轉換成笛卡爾座標,然後再比較它。但是,有沒有更好的方法來做到這一點?如何比較圓弧中的弧度?
編輯:另外,我應該清楚標記可以落在插槽之間的任何位置。例如,標記可以在0到π/ 6之間的任何地方。
我正在考慮一個財富類型的東西,你必須檢查一個標記是否落在一個插槽上。在視覺上,我們可以看到0,2pi,4pi等......處於相同的位置。如何通過編程檢查0是否等於2pi/4pi?假設我也有半徑,我想,也許我必須先將它轉換成笛卡爾座標,然後再比較它。但是,有沒有更好的方法來做到這一點?如何比較圓弧中的弧度?
編輯:另外,我應該清楚標記可以落在插槽之間的任何位置。例如,標記可以在0到π/ 6之間的任何地方。
這是你想要的嗎?
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));
}
我不明白爲什麼2%? –
我不確定我的問題寫得不好,但這不起作用。 '(0 * Math.PI)%2 ===(2 * Math.PI)%2'是'false' – Strawberry
你讓我打開維基百科:)對不起,它是(2 * Math.PI),而不是2 – sabof