确定循环数是否几乎等于另一个

时间:2013-06-29 12:35:38

标签: c++ c++11

我正在使用[-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是否在弧度B的任一方向上都在x内。我想在调用函数时指定x。

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

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

1 个答案:

答案 0 :(得分: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;