1

我有 3 个角 abc

a=315 b=20 c=45

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

我有很长的路要走,这似乎可行。我只想得到更小,也许更有效的东西。

谢谢

编辑

这是我想说的一张照片。

在此处输入图像描述

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

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

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

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

对不起,如果我没有明确我的第一语言不是英语

4

4 回答 4

3

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

或者,我需要查看一个角度x是否介于 anglecheck+r和 angle之间check-r

check-r<x<check+r.

如果需要a<x<b,求和check中间的角度ab然后求from或的距离( r)。checkab

该方法归一化,将角度从 -infinity...infinity 更改为 -180...180。方法 check 接受参数 x:我们需要查看的角度是否在角度 check-r 和 check+r 之间。 check:要检查的角度。 r:角度检查的半径。

private static double normalize(double x) {
        x = x % 360;
        if (x>=180) {
            return x-360;
        }
        if (x<-180) {
            return x+360;
        }
        return x;
}
public static boolean check(double x, double check, double r) {
        x = x - check;
        x = normalize(x);
        return x<r && x>-r;
}
于 2013-02-25T15:39:20.137 回答
2

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

对于给定的角度:abgg是否在ab之间的反射角之外?

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

  1. a ≤ b ∧ b - a ≤ π
  2. a > b ∧ a - b ≥ π

为简单起见,假设你最左边的角度是l,你最右边的角度是r,你试图找出g是否在它们之间。

这里的问题是看起来。我们正在寻找基本上 3 个积极的案例:

  1. l ≤ g ≤ r
  2. l ≤ g ∧ r < l
  3. g ≤ r ∧ r < l

如果您只是将 a 定义最左侧,将b定义为最右侧,那么您就完成了,您的情况将如下所示:

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

但是,如果您计算了lr,您会注意到这里有一个优化机会,可以同时执行这两个过程。您的函数将如下所示:

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

于 2017-02-23T19:35:27.333 回答
0

我个人最近遇到了同样的问题,并为所有发布的答案找到了反例,所以我将分享我自己的方法。
a开始角度和b结束角度,我们正在检查c它们之间是否是顺时针方向,这意味着当你从a到时,b你必须通过c。检查是否在从到c的范围内的方法在大于数字时会给您误报。例如: 这意味着介于和之间。但事实并非如此。 有效的方法是如果大于则减去 360 并从if中减去 360abbaa=80°, b=320° and c=150°: a <= c <= bcab
bacc大于a。然后检查是否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
于 2019-03-01T08:27:51.473 回答
-1

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

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

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

于 2012-04-19T21:24:38.790 回答