2013-06-29 19 views
0

我正在使用[-PI,PI]范围内的弧度。此范围之外的值转换为有效的值用下面的函数确定一个循环数是否与另一个循环数几乎相等

double Radian::convert(double input) { 
    if (input > RAD_UPPER_BOUND) return RAD_LOWER_BOUND + fmod(input, RAD_UPPER_BOUND); 
    if (input < RAD_LOWER_BOUND) return RAD_UPPER_BOUND + fmod(input, RAD_UPPER_BOUND); 
           return input; 
} 

我的问题是:我怎么能实现的逻辑来检查弧度A是否为x内弧度B的任一方向我想specifiy X时调用该函数。

假设A = 3.0; B = -2.5; x = 1;该函数应该返回true,因为A和B相距小于x。

我假设有一种处理这类问题的标准方法。

回答

3

这里的主要技巧是认识到这些值不能超过彼此总跨距的一半。

bool isWithinDistance(double a,double b,double within_distance) 
{ 
    assert(a >= RAD_LOWER_BOUND); 
    assert(a <= RAD_UPPER_BOUND); 
    assert(b >= RAD_LOWER_BOUND); 
    assert(b <= RAD_UPPER_BOUND); 
    assert(within_distance >= 0); 

    double span = RADIAN_UPPER_BOUND-RADIAN_LOWER_BOUND; 
    double distance = fabs(a-b); 

    if (distance > span/2) { 
     distance = span-distance; 
    } 

    return distance<within_distance; 
} 

在您的例子:

a = 3.0; 
b = -2.5; 
within_distance = 1; 
span = 2*PI; 
distance = fabs(a-b) = 5.5; 
distance > PI, so 
    distance = 2*PI - 5.5 ~= 0.7832; 
result = (distance < 1) = true; 
+0

跨度会在我的情况下,2 * PI即使实际的范围是从-PI到PI(PI - (-PI)= 2 * PI) –

+0

@AB:对,所以你的值不能超过彼此的PI。 –

相关问题