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

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

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

4

1 回答 1

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;
于 2013-06-29T12:56:26.570 回答