Компас перемещается между 360 и 0 и проверяет наличие отрицательных изменений - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть компас, который возвращает градусы между 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

Есть ли способ, которым я могу это сделать?Надеюсь, вы понимаете, чего я пытаюсь достичь.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вам нужна функция 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;
}

После этого вы просто сравниваете, если самый короткий угол большечем порог или ниже отрицательного порога.

0 голосов
/ 27 ноября 2018

Я бы посмотрел на разницу.

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.
...