我正在使用[-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。
我假设有一种处理此类问题的标准方法。
答案 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;