确定角度是否位于其他2个角度之间

saz*_*azr 18 c++ math trigonometry

我试图弄清楚角度是否位于其他两个角度之间.我一直在尝试创建一个简单的函数来执行此操作,但我的技术都不适用于所有可能的角度值.

你能帮我编辑一下我的功能,以正确判断角度是否位于其他2个角度之间?

在此输入图像描述

在上图中; 我使用绿点作为中心点,然后确定每条线与绿点的角度.然后我计算黑点到绿点的角度.我想检查黑点的角度之间的2线的角度.

注意:在我的情况下; 据说角度(targetAngle)位于2个其他角度之间,如果2个角度之间的差<180度并且目标角度位于由这2个角度构成的空腔中.

下面的代码应该可以工作,但是对于这些代码失败(它们位于角度之间):
- is_angle_between(
150,190,110 )- is_angle_between(3,41,345)

bool is_angle_between(int target, int angle1, int angle2) 
{  
  int rAngle1 = ((iTarget - iAngle1) % 360 + 360) % 360;  
  int rAngle2 = ((iAngle2 - iAngle1) % 360 + 360) % 360;  
  return (0 <= rAngle1 && rAngle1 <= rAngle2);  
}  

// Example usage  
is_angle_between(3, 41, 345);  
Run Code Online (Sandbox Code Playgroud)

我尝试的另一种技术也不起作用:

int is_angle_between(int target, int angle1, int angle2)
{
  int dif1  = angle1-angle2;
  int dif2  = angle2-angle1;
  int uDif1 = convert_to_positive_angle( dif1 ); // for eg; convert -15 to 345
  int uDif2 = convert_to_positive_angle( dif2 );

  if (uDif1 <= uDif2) {
    if (dif1 < 0) {
      return (target <= angle1 && target >= angle2);
    }
    else return (in_between_numbers(iTarget, iAngle1, iAngle2));
  }
  else {
    if (dif2 < 0) {
      return (target <= angle1 && target >= angle2);
    }
    else return (in_between_numbers(iTarget, iAngle1, iAngle2));
  }

  return -1;
}
Run Code Online (Sandbox Code Playgroud)

fde*_*hin 11

bool is_angle_between(int target, int angle1, int angle2) 
{
  // make the angle from angle1 to angle2 to be <= 180 degrees
  int rAngle = ((angle2 - angle1) % 360 + 360) % 360;
  if (rAngle >= 180)
    std::swap(angle1, angle2);

  // check if it passes through zero
  if (angle1 <= angle2)
    return target >= angle1 && target <= angle2;
  else
    return target >= angle1 || target <= angle2;
}  
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚运行了代码,它按预期返回true,因为45度介于315和90度之间.算法非常简单,所以我认为评论足以理解它.您希望澄清哪一部分? (4认同)

ssc*_*rth 6

灵感来自关于模块化算术中间隔的帖子:

static bool is_angle_between(int x, int a, int b) {
    b = modN(b - a);
    x = modN(x - a);

    if (b < 180) {
        return x < b;
    } else {
        return b < x;
    }
}
Run Code Online (Sandbox Code Playgroud)

其中(如果检查角度)modN()将实施为

// modN(x) is assumed to calculate Euclidean (=non-negative) x % N.
static int modN(int x) {
    const int N = 360;
    int m = x % N;
    if (m < 0) {
        m += N;
    } 
    return m;
}
Run Code Online (Sandbox Code Playgroud)


ifo*_*e2d 5

void normalize( float& angle ) 
{
    while ( angle < -180 ) angle += 360;
    while ( angle >  180 ) angle -= 360;
}

bool isWithinRange( float testAngle, float a, float b )
{
    a -= testAngle;
    b -= testAngle;
    normalize( a );
    normalize( b );
    if ( a * b >= 0 )
        return false;
    return fabs( a - b ) < 180;
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*age 0

我从这个线程中找到了这句话:

如果点 P 在三角形 ABC 内,则

PAB区域+PBC区域+PAC区域=ABC区域

请注意,如果 P 位于 AB、BC 或 CA 的边缘,则上述情况成立。但实际上,PAB、PBC、PAC 区域之一为 0(因此请务必检查这一点)。

如果 P 在外部,则上述等式不成立...

面积如何确定?你有两个选择:1)海伦定理,涉及sqrt,速度较慢2)更优选的方法是叉积(或有效地,(向下乘积之和减去向上乘积之和)绝对值的一半)

例如,如果 A=(x1,y1) B=(x2,y2),C=(x3,y3) 面积= abs(x1*y2+x2*y3+x3*y1-x1*y3-x3*y2- x2*y1)/2

另外,您可能需要小心浮点错误...而不是检查严格的不等式,而是检查 abs(ba)

希望这会有所帮助