我正在尝试编写一个函数,告诉我角度是否在其他2个角度内。当说'如果角度在2个其他角度内时,我的意思是,例如,如果我有2个角度0和90,那么45将位于这些角度之间但是-20(或者99)不会。
我的问题:我的功能似乎没有检测到2个角度何时应该在2个角度内。我不确定我的功能是否适用于负角度?
我需要更改什么才能使我的功能正常工作?
bool is_angle_between(int target, int angle1, int angle2)
{
// Post: Return true if target lies between the 2 angles
int iTarget = (360 + (target % 360)) % 360;
int iAngle1 = (3600000 + angle1) % 360;
int iAngle2 = (3600000 + angle2) % 360;
if (iAngle1 < iAngle2)
if (iAngle1 <= iTarget && iTarget <= iAngle2)
return true;
else if (iAngle1 <= iTarget || iTarget <= iAngle2)
return true;
return false;
}
答案 0 :(得分:1)
这个问题只与测试整数是否介于两个其他整数范围之间有关。由于我们不知道angle1
或angle2
是否是更大的值,我会做这样的事情:
bool is_angle_between(int target, int angle1, int angle2)
{
return (target > angle1 && target < angle2) ||
(target > angle2 && target < angle1);
}
答案 1 :(得分:1)
这样做的一个好方法是旋转间隔,以便您比较的所有数字都是正数:
int rTarget = ((target - angle1) % 360 + 360) % 360;
int rAngle2 = ((angle2 - angle1) % 360 + 360) % 360;
return 0 <= rAngle1 && rAngle1 <= rAngle2;
否则你会在0 = 360度附近遇到麻烦。
顺便说一下,你应该避免使用不必要的if
语句,因为分支可能很昂贵。
答案 2 :(得分:-1)
似乎这应该有效:
if (iAngle1 < iAngle2) {
if (iAngle1 <= iTarget && iTarget <= iAngle2) {
return true;
}
}
else {
if (iAngle2 <= iTarget && iTarget <= iAngle1) {
return true;
}
}
return false;
请注意,此处的括号有助于确保else与您打算匹配。您的原始代码是缩进的,因为您希望它匹配,但这不是它的解析方式。