Стабилизировать значение в С++

У меня есть переменная, которая представляет собой модуль конгруэнтности x=y(mod 360), что означает, что y варьируется от 0 до 360, и если значение больше 360, оно снова становится равным 0. Например, x=5 для y = 365.

Я написал эту функцию для стабилизации y, поэтому, если разница между x и предыдущим x больше 5, я получаю x, в противном случае — предыдущее x.

float stabilize(float x,float previous){

    if(fabs(x-previousx)<5)
    {
        return previousx;
    }
    else
    {
        return x;
    }

}

Это отлично работает в диапазоне от 0 до 360. Но это не работает при граничном условии 360 и 0. Как я могу стабилизировать значение, когда значение y близко к 0, например 0,3, а предыдущее значение y составляет около 360, например 359. Таким образом, разница рассчитывается здесь 359 - 0,3 = 358,7. но я хочу, чтобы это была разница по модулю 360, которая составляет 1,3.


person rajat    schedule 03.08.2012    source источник
comment
Итак, вам нужно абсолютное значение разницы углов между x и y?   -  person Mysticial    schedule 03.08.2012
comment
нет, я уже беру абсолютное значение, используя fabs.   -  person rajat    schedule 03.08.2012
comment
Хорошо, теперь я очень смущен тем, что вопрос. Итак, у вас уже есть разница, но вы хотите нормализовать ее до чего-то вроде [0,360)? Можете ли вы привести примеры ваших входных данных и ожидаемых результатов?   -  person Mysticial    schedule 03.08.2012
comment
хорошо, ввод всегда мод 360. Например, входные данные для функции x = 358 и предыдущее x = 2, я хочу, чтобы вывод был предыдущим x, а если x = 356 и предыдущий x = 3, я хочу, чтобы вывод был 356.   -  person rajat    schedule 03.08.2012
comment
Имена переменных могут создавать путаницу, я отредактировал вопрос, чтобы сделать его более ясным.   -  person rajat    schedule 03.08.2012
comment
О, хорошо, вы просто пытаетесь проверить, меньше ли угол между x и previousx, чем 5. Мой ответ здесь имеет функцию angleDiff(), которая даст вам разницу между любыми двумя углами. Результат нормализуется до [-180, 180). Так что это может делать то, что вы хотите.   -  person Mysticial    schedule 03.08.2012
comment
Хорошо, будем пробовать.   -  person rajat    schedule 03.08.2012


Ответы (2)


Как насчет чего-то вроде if(fabs(x-previousx)<5 || fabs(x-previousx)>355)? Учитывая, что входные данные относятся к модулю 360, если разница достаточно велика, это означает, что оба значения достаточно близки к границе.

person ekholm    schedule 03.08.2012
comment
Я не вижу причин, по которым это не должно работать. Я попробую, спасибо. - person rajat; 03.08.2012
comment
Вы можете рассмотреть возможность использования while, чтобы сделать этот подход правильным для чисел выше 720 и ниже 360... - person gha.st; 03.08.2012
comment
Но в этом вопросе входные числа всегда находятся в диапазоне от 0 до 360, так что давайте не будем усложнять. - person ekholm; 03.08.2012

Вы можете вычесть исходные числа и взять по модулю 360 fabs (результат):

Например:

359 - 720.3 = -361.3
fabs(-361.3) = 361.3
361.3 % 360 = 1.3
person user1157159    schedule 03.08.2012
comment
У меня нет возможности получить исходные числа, я использую внешнюю библиотеку для получения углов. - person rajat; 03.08.2012