Нормализуйте ориентацию между 0 и 360

sc delete sericeName

Просто удостоверяются, что сервис останавливается прежде, чем сделать это. Я видел эту работу большинство раз. Существуют времена, где я видел, что окна застревают на чем-то, и это настаивает на перезагрузке.

21
задан Damjan Pavlica 20 February 2017 в 19:08
поделиться

4 ответа

Статический класс не имеет состояния. Он все еще может иметь переменные, которые, хотя и являются статическими, но имеют состояние.

Статический класс без каких-либо переменных уровня класса не имеет состояния. Он не содержит данных.

но я объясню это .

Из градусов% 360 вы получите число от -359 до 359 . Добавление 360 изменит диапазон от 1 до 719 . Если ориентация уже положительная, добавление этого гарантирует, что она все еще есть, а окончательный % 360 вернет его в диапазон от 0 до 359 .

Как минимум , вы можете упростить свой код, так как if s и while s могут быть объединены. Например, результат выполнения условий в этих двух строках:

if (this.orientation < 0)
while (this.orientation < 0)

всегда одинаков, поэтому вам не нужно окружение if .

Итак, к этому конец, вы могли бы сделать:

public void Rotate (int degrees) {
    this.orientation += degrees;
    while (this.orientation <   0) this.orientation += 360;
    while (this.orientation > 359) this.orientation -= 360;
}

но я ' d по-прежнему выбирают модульную версию, поскольку она позволяет избежать циклов. Это будет важно, когда пользователь введет 360 000 000 000 для ротации (и они сделают это , поверьте мне), а затем обнаружат, что им нужно пораньше пообедать, пока ваш код перемалывается:

18
ответ дан 29 November 2019 в 06:07
поделиться

Я как бы быстро смоделировал это в AS3, но должно работать (вам может понадобиться + = для угла)

private Number clampAngle(Number angle)
{
    return (angle % 360) + (angle < 0 ? 360 : 0);
}
8
ответ дан 29 November 2019 в 06:07
поделиться

Используйте арифметику по модулю:

this.orientation += degrees;

this.orientation = this.orientation % 360;

if (this.orientation < 0)
{
    this.orientation += 360;
}
44
ответ дан 29 November 2019 в 06:07
поделиться

Это тот, который нормализует в любом диапазоне. Полезно для нормализации между [-180,180], [0,180] или [0,360].

(хотя и в C ++)

//Normalizes any number to an arbitrary range 
//by assuming the range wraps around when going below min or above max 
double normalise( const double value, const double start, const double end ) 
{
  const double width       = end - start   ;   // 
  const double offsetValue = value - start ;   // value relative to 0

  return ( offsetValue - ( floor( offsetValue / width ) * width ) ) + start ;
  // + start to reset back to start of original range
}

для INTS

//Normalizes any number to an arbitrary range 
//by assuming the range wraps around when going below min or above max 
int normalise( const int value, const int start, const int end ) 
{
  const int width       = end - start   ;   // 
  const int offsetValue = value - start ;   // value relative to 0

  return ( offsetValue - ( ( offsetValue / width ) * width ) ) + start ;
  // + start to reset back to start of original range
}

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

31
ответ дан 29 November 2019 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: