Как ограничить число диапазоном - PullRequest
4 голосов
/ 20 ноября 2010

У меня есть эта функция для ограничения поворота в диапазоне от 0,0 до 360,0:

private float ClampRotation( float rotation ) {

    while( rotation < 0.0f ) rotation += 360.0f;
    while( rotation >= 360.0f ) rotation -= 360.0f;

    return rotation;

}

Эта функция прекрасно работает, и, вероятно, она не может быть более эффективной, но мне просто интересно,такое нативная функция Java, которая может делать то же самое?

Наиболее близким является Math.min / max, но он не работает как этот.Вращение -10.0 должно выдавать 350.0, а не 0.0, как в случае min / max.

Ответы [ 4 ]

4 голосов
/ 20 ноября 2010

Используйте оператор модуля, а затем учитывайте значения меньше 0;

private float ClampRotation( float rotation ) {

    rotation = rotation % 360f;

    if (rotation < 0f) rotation += 360f;

    return rotation;

}
4 голосов
/ 20 ноября 2010

% (модуль) работает со значениями с плавающей запятой, поэтому используйте rotation % 360.0f (впоследствии вам нужно будет добавить 360.0 к отрицательным числам)

3 голосов
/ 20 ноября 2010

это просто математика .. вы можете сделать это так:

private float ClampRotation( float rotation ) {

    return rotation+360.0f*Math.ceil(-rotation/360.0f);

}

Я уверен, что все в порядке

1 голос
/ 21 ноября 2010

У вас есть традиционная реализация углов намотки, которые на порядок меньше желаемого диапазона.

Модуль немного странный для числа с плавающей запятой - он возвращает отрицательное значение для отрицательного значения, так что вам все равно нужно иметь ветвление, и оно включает деление, которое медленнее на некоторых машинах (как в случае, когда я не нашел машину, где % значительно дешевле, чем обход цикла с парой вычитаний два или три раза).

Если ваши значения находятся в пределах, скажем, от -1000 до +1000, то ваша версия будет более четкой и быстрой. Если ваши значения шире этого, выберите версию на основе модуля. Если это очень важно, протестируйте оба на вашем оборудовании с диапазонами значений, которые вы собираетесь использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...