角度命中比较:无法检测到命中
Angle Hit Comparision: Fails to detect hit
我正在尝试编写一个函数,该函数将告诉我一个角度是否位于其他两个角度内。当说"如果一个角度位于其他 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;
}
这个问题只与测试一个整数是否位于另外两个整数的范围内有关。由于我们不知道angle1
或angle2
是更大的值,我会做这样的事情:
bool is_angle_between(int target, int angle1, int angle2)
{
return (target > angle1 && target < angle2) ||
(target > angle2 && target < angle1);
}
执行此操作的一个好方法是旋转间隔,以便您比较的所有数字都是正数:
int rTarget = ((target - angle1) % 360 + 360) % 360;
int rAngle2 = ((angle2 - angle1) % 360 + 360) % 360;
return 0 <= rAngle1 && rAngle1 <= rAngle2;
否则,您将在 0 = 360 度附近遇到麻烦。
顺便说一句,您应该避免不必要的if
语句,因为分支可能很昂贵。
似乎这应该有效:
if (iAngle1 < iAngle2) {
if (iAngle1 <= iTarget && iTarget <= iAngle2) {
return true;
}
}
else {
if (iAngle2 <= iTarget && iTarget <= iAngle1) {
return true;
}
}
return false;
请注意,此处的大括号有助于确保 else 匹配(如果您愿意)。 您的原始代码会缩进,因为您希望它匹配,但这不是它的解析方式。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 使用CMake检测支持的C++标准
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 当套接字连接断开时检测C/C++Unix
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- C/C++预处理器是否可以检测一些编译器选项
- C++自定义比较函数
- WMI检测进程创建事件-c++
- 如何比较自定义类的std::变体
- 正在LLVM中检测整数比较条件
- C++ 比较 2 个不同列表中的值以使用 2 for 循环摆脱重复的数字。无法正确检测重复项
- "signbit"与乘法检测到的符号变化,并将其与零进行比较
- OpenCV检测手部和比较图像
- 角度命中比较:无法检测到命中
- 如何检测网络摄像头并比较本地文件以匹配人脸 OpenCV
- 将检测到的人脸与现有人脸阵列与 android 中的 opencv 进行比较
- 我们如何检测源代码中的所有指针比较?c++
- OpenCV 如何检测网络摄像头并比较本地文件以匹配面部