罗盘在 360 和 0 之间移动并检查是否有负变化
Compass moving between 360 and 0 and checking if there is a negative change
我有一个罗盘,returns 度在 0-360 和罗盘初始值的起始位置(度)之间,还有一个阈值。
degrees = 0-360
initialDegrees = null
threshold = 20
我有这张支票:
if(degrees > initialDegrees+threshold || initialDegrees == null) { // this is to start the checking
foo();
initialDegrees = degrees
}
用于检查度数是否正向变化超过阈值(即我将指南针向右移动)
但是我如何检查它是否朝相反的方向移动(负向改变超过阈值,即我将指南针向左移动)。
if(degrees > initialDegrees-thredshold) // this is always true, and doesn't do what i want
我有办法做到这一点吗?
希望你明白我想要达到的目标。
我会看看区别。
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.
您可以使用数学来避免 if
语句
delta = (delta + 360 + 180) % 360 - 180; // all values between -180 and 179.
或
delta = (delta + 360 + 179) % 360 - 179; // all values between -179 and 180.
你需要的是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;
}
之后你只要比较最短的角度是大于阈值,还是小于负阈值。
我有一个罗盘,returns 度在 0-360 和罗盘初始值的起始位置(度)之间,还有一个阈值。
degrees = 0-360
initialDegrees = null
threshold = 20
我有这张支票:
if(degrees > initialDegrees+threshold || initialDegrees == null) { // this is to start the checking
foo();
initialDegrees = degrees
}
用于检查度数是否正向变化超过阈值(即我将指南针向右移动)
但是我如何检查它是否朝相反的方向移动(负向改变超过阈值,即我将指南针向左移动)。
if(degrees > initialDegrees-thredshold) // this is always true, and doesn't do what i want
我有办法做到这一点吗? 希望你明白我想要达到的目标。
我会看看区别。
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.
您可以使用数学来避免 if
语句
delta = (delta + 360 + 180) % 360 - 180; // all values between -180 and 179.
或
delta = (delta + 360 + 179) % 360 - 179; // all values between -179 and 180.
你需要的是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;
}
之后你只要比较最短的角度是大于阈值,还是小于负阈值。