2016-06-28 123 views
4

我想確定一個點是否在一個圓圈內。 所以我這樣做:比較C++中的雙打

(x - center_x)^2 + (y - center_y)^2 < radius^2

但我的座標是double,我想我應該用小量做,所以是 fabs ((x - center_x)^2 + (y - center_y)^2 - radius^2) < EPS更好?

+2

相關:http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison – NathanOliver

+2

你似乎是的印象是'^ 2'提高一些東西到第二下功率。事實並非如此。在C++中'^'是「按位異或」 - http://en.cppreference.com/w/cpp/language/operator_arithmetic#Bitwise_logic_operators –

回答

5

當您使用<>進行比較時,您不需要epsilon,這些都是非常好的。您需要它而不是==。就你而言,你剛剛添加了一小部分到半徑,這可能是不可取的。 另請注意,^pow(a, b)不一樣。

+0

謝謝,我知道我應該用'=='用'==',但總是想知道'<' and '>'。這讓我很清楚! PS我知道我不能使用'^'作爲戰俘:P – Gigata

+0

無論哪種情況比'pow(x,2)+ pow(y,2)'都更好地執行'x * x + y * y',只有避免複雜對數計算的多目標。 –

4

您不能在C++中使用'^'來達到此目的。 而不是(x - center_x)^2 + (y - center_y)^2 < radius^2(x - center_x)*(x - center_x) + (y - center_y)*(y - center_y) < radius*radius。 座標是雙倍的沒有問題。

+3

我真的不認爲這是代碼,而是OP使用的公式。 – NathanOliver

+0

@NathanOliver,無論是哪種情況,SO規則都建議發佈完整的可測試代碼,所以Shiro正確地假設OP正在嘗試使用他發佈的公式。 –

4

這取決於。

Naiive排序不等比較通常最適合測試浮點值是否位於閾值的一側。

由於浮點錯誤,應該在閾值一側的結果可能會在另一側結束。如果確保不出現假陰性很重要,同時增加誤報的可能性,那麼您建議的替代方案可能適用。

請注意,當輸入值幅度變化時,基於恆定ε的誤差補償無效。

4

否如其他人提到的,C中的運營商^是按位獨佔的,而非權力。但是你可以使用內聯函數:

inline double Sqr(double x) {return x*x;} 
// ... 
if (Sqr(x - center_x) + Sqr(y - center_y) < Sqr(radius)) // ... 

至於你的問題,

fabs (Sqr(x - center_x) + Sqr(y - center_y) - Sqr(radius)) < EPS 

意味着(X,Y)是圓周處圈