2016-06-28 87 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)是圆周处圈