Java 指南针在360和0之间移动并检查是否有负变化

Java 指南针在360和0之间移动并检查是否有负变化,java,if-statement,compass,degrees,Java,If Statement,Compass,Degrees,我有一个指南针,它返回0-360度和指南针初始值的起始位置(度),以及一个阈值 degrees = 0-360 initialDegrees = null threshold = 20 我有这张支票: if(degrees > initialDegrees+threshold || initialDegrees == null) { // this is to start the checking foo(); initialDegrees = degrees } 用

我有一个指南针,它返回0-360度和指南针初始值的起始位置(度),以及一个阈值

degrees = 0-360
initialDegrees = null
threshold = 20
我有这张支票:

if(degrees > initialDegrees+threshold || initialDegrees == null) { // this is to start the checking
    foo(); 
    initialDegrees = degrees
}
用于检查度数是否正变化超过阈值(即,我向右移动指南针)

但是,我如何检查它是否已向相反方向移动(负面变化超过阈值,即我将指南针向左移动)

我有办法做到这一点吗?
希望你能理解我想要实现的目标。

我会看看其中的区别

int delta = degrees - initialDegrees;
if (delta > 180)
    delta -= 360; // its a negative move.
if (delta < -180)
    delra += 360; // actually positive.
if (Math.abs(delta) > threshold)
    // meaningful move.


我会看看区别

int delta = degrees - initialDegrees;
if (delta > 180)
    delta -= 360; // its a negative move.
if (delta < -180)
    delra += 360; // actually positive.
if (Math.abs(delta) > threshold)
    // meaningful move.


您需要的是
shortestAngle
功能。一些数学库已经有了它,但是你可以自己写。给定2个角度,需要找到最小角度(绝对值),这样第一个角度加上该结果等于第二个角度:

public static float shortestAngle(float from, float to) {
    float difference = to - from; //step 1: do flat difference
    difference %= 360; //step 2: do module 360 to normalize to (-360, 360) range
    if(difference < 0) {
        difference += 360; //step3: normalize to [0, 360) range
    }
    if(difference > 180) {
        difference -= 360; //step 4: normalize to (-180, 180] range
    }
    return difference;
}
公共静态浮点短角(浮点从,浮点到){
float difference=to-from;//步骤1:执行平差
差异%=360;//步骤2:执行模块360以将其规格化为(-360,360)范围
如果(差异<0){
差值+=360;//步骤3:规格化为[0,360)范围
}
如果(差值>180){
差异-=360;//步骤4:规格化到(-180,180)范围
}
收益差;
}

之后,您只需比较最短角度是大于阈值还是小于负阈值。

您需要的是
shortestAngle
函数。一些数学库已经有了它,但您可以自己编写。给定2个角度,您需要找到最小角度(绝对值),使第一个角度加上该结果等于第二个角度:

degrees = 0-360
initialDegrees = null
threshold = 20
public static float shortestAngle(float from, float to) {
    float difference = to - from; //step 1: do flat difference
    difference %= 360; //step 2: do module 360 to normalize to (-360, 360) range
    if(difference < 0) {
        difference += 360; //step3: normalize to [0, 360) range
    }
    if(difference > 180) {
        difference -= 360; //step 4: normalize to (-180, 180] range
    }
    return difference;
}
公共静态浮点短角(浮点从,浮点到){
float difference=to-from;//步骤1:执行平差
差异%=360;//步骤2:执行模块360以将其规格化为(-360,360)范围
如果(差异<0){
差值+=360;//步骤3:规格化为[0,360)范围
}
如果(差值>180){
差异-=360;//步骤4:规格化到(-180,180)范围
}
收益差;
}

之后,您只需比较最短角度是大于阈值还是小于负阈值。

您应该首先检查
null
,否则您可能会得到null点异常。我的第一反应是“改为做
degrees
”,但您需要做适当的角度算术(例如,350+20=10,-40=320等)。你应该先检查
null
,否则你会得到null点异常。我的第一反应是“改为做
degrees
”,但你需要做适当的角度算术(例如,350+20=10,-40=320等)。不要忘记,
delta<0
@MarkJeronimus<0可以,但需要检查<-180。不要忘记,
delta<0
@MarkJeronimus<0可以,但需要检查<-180。在我的情况下,这似乎工作得很好。但是,你介意更详细地解释一下你的if语句吗,因为我并不完整我确信我理解第3步和第4步的作用。如果由于某种原因差异为-200,那么您希望它为160,因为它是“相同的”角度,但160的旋转比-200小。第4步将300等高值转换为-60也是如此。在我的例子中,这似乎工作得很好。但是,你介意更详细地解释你的if语句吗,因为我不完全确定我是否理解第3步和第4步的作用。如果出于某种原因,差异是-200,你希望它是而是160,因为它是“相同”的角度,但是160的旋转比-200小。对于像300这样的高值,通过步骤4转换为-60也是一样的。
degrees = 0-360
initialDegrees = null
threshold = 20