是两个角度之间的角度

时间:2012-04-19 21:12:09

标签: math

我有3个角度a b c

α= 315 B = 20 C = 45

好的,如果b介于a和c之间,那么想知道给所有三个

我有很长的路要做这个加法和减法似乎有效。我希望得到一些更小,更高效的东西。

感谢

修改

这是我想说的图片。

enter image description here

好的我有角度L(当前为0)我加45(或任意角度)并减去45(或任何角度)得到a和b(我的视角)。

现在我需要知道绿点是否在a和b之间

(g> a || g> 0)&& (g

所以在这张照片中只有顶部的绿点才是真的..

对不起,如果我不清楚我的第一语言不是英语

5 个答案:

答案 0 :(得分:3)

我有类似的问题。我知道了。所有计算均以度为单位。 我需要计算一个gps位置在矩形内的id。

或者,我需要查看角度x是否在角度check+r和角度check-r之间。

check-r<x<check+r

如果您需要a<x<b,请在checka的中间找到角度b,然后找到{{1}的距离(r)来自checka

方法标准化,将角度从-infinity ... infinity更改为-180 ... 180。 方法检查,获取参数 b:我们需要查看角度check-r和check + r之间的角度。 x:要检查的角度。 check:角度检查的半径。

r

答案 1 :(得分:1)

1 st off,每个角度都在两个其他角度之间,你真正要问的是:

对于给定的角度: a b g g 之间的反射角< em> a 和 b

你可以直接将 a 定义为最左边的角度,将 b 定义为最右边的角度,或者你可以解决这个问题,例如,如果这些陈述中的任何一个是true a 是你最左边的角度:

  1. a≤b∧b - a≤π
  2. a&gt; b∧a - b≥π
  3. 为简单起见,我们说最左边的角度是 l ,最右边的角度是 r ,你试图找出 g 是他们之间。

    这里的问题似乎是。我们正在寻找基本上3个阳性病例:

    1. l≤g≤r
    2. l≤g∧r&lt;升
    3. g≤r∧r&lt;升
    4. 如果你只是将 a 定义为最左边,而将 b 定义为最右边,那么你就完成了,你的情况将会是这样的:

      a <= g && g <= b ||
      a <= g && b < a ||
      g <= b && b < a
      

      如果你计算了 l r ,你会发现这里有一个优化机会同时进行这两个过程。你的功能如下:

      if(a <= b) {
          if(b - a <= PI) {
              return a <= g && g <= b;
          } else {
              return b <= g || g <= a;
          }
      } else {
          if(a - b <= PI) {
              return b <= g && g <= a;
          } else {
              return a <= g || g <= b;
          }
      }
      

      或者,如果你需要它,你可以扩展到这个噩梦般的条件:

      a <= b ?
      (b - a <= PI && a <= g && g <= b) || (b - a > PI && (b <= g || g <= a)) :
      (a - b <= PI && b <= g && g <= a) || (a - b > PI && (a <= g || g <= b))
      

      请注意,所有这些数学都假设您的输入是弧度,范围是[0:2π]。

      Live Example

答案 2 :(得分:0)

我个人最近遇到了同样的问题,并找到了所有已发布答案的反例,因此我将分享自己的方法。
假设a为起始角度,b为终止角度,我们正在检查c是否在顺时针方向之间,这意味着从a到{{1} },您必须通过b。当c在数值上大于c时,检查a是否在bb范围内的方法会给您带来误报。例如: a,这意味着a=80°, b=320° and c=150°: a <= c <= bca之间。 但这不是。
有效的方法是,如果b大于b,则从a中减去360;如果c大于c,则从a中减去360。然后检查是否为a <= c <= b。 在Java中:

public static boolean isBetween(double c, double a, double b) {
    if (b > a) b -= 360;
    if (c > a) c -= 360;
    return a <= c && c <= b;
}

这假设a,b和c的范围是0到360。
一些例子:

isBetween(150, 80, 320) => false
isBetween(30, 80, 320) => true
isBetween(340, 80, 320) => true
isBetween(140, 0, 160) => true
isBetween(180, 0, 160) => false

答案 3 :(得分:-1)

假设a > c,您实际上会使用:

( b < a ) && ( b > c )

这与检查值是否在下限和上限之间相同。它们是角度没有区别,除非你想要考虑这样一个事实:当你围绕一个圆圈时,405的角度与45的角度相同。在这种情况下,您只需使用a % 360即可获得0360之间的角度。

答案 4 :(得分:-2)

检查:

(如果你的意思是介于两者之间,不包括边界)

(c - a) % 180 > 0 && b > a && b < c

(如果你的意思是介于两者之间,包括边界)

(c - a) % 180 >=0;b >= a && b <= c

(这个答案假定a,b,c> = 0; a,b,c <360; a&lt; = c)