Попробуйте вместо этого!
atan2(sin(angle), cos(angle))
atan2
имеет диапазон [- & pi ;, & pi;) . Это использует тот факт, что tan & theta; = грех и тета; / cos & theta; , и что atan2
достаточно умен, чтобы знать, в каком квадранте & theta; находится.
Поскольку вам нужны градусы, вам нужно преобразовать угол в радианы:
atan2(sin(angle * PI/180.0), cos(angle * PI/180.0)) * 180.0/PI
Обновление
Мой предыдущий пример был совершенно законным, но ограничил диапазон до & plusmn; 90 & deg ;. Диапазон atan2
- это желаемое значение -179 & deg; до 180 °. Сохранено ниже.
Попробуйте это:
asin(sin(angle)))
Домен sin
является реальной линией, диапазон равен [-1, 1]
. Домен asin
равен [-1, 1]
, а диапазон [-PI/2, PI/2]
. Поскольку asin
является инверсией sin
, ваш ввод не изменяется (в значительной степени, есть некоторый сдвиг, потому что вы используете числа с плавающей запятой). Таким образом, вы вернете свое входное значение и получите желаемый диапазон как побочный эффект ограниченного диапазона арксинуса.
Поскольку вам нужны градусы, вам нужно преобразовать угол в радианы:
asin(sin(angle * PI/180.0)) * 180.0/PI
(Предостережение: триггерные функции в миллиарды раз медленнее, чем простые операции деления и вычитания, даже если они выполняются в FPU!)