Попробуйте это вместо этого!
atan2(sin(angle), cos(angle))
atan2
имеет диапазон [- π, π).Это имеет преимущество в том, что загар θ = грех θ/соз θ, и что atan2
достаточно умен, чтобы знать, какой квадрант θ в.
Так как вы хотите градусов, вы хотите, чтобы преобразовать угол и из радиана:
atan2(sin(angle * PI/180.0), cos(angle * PI/180.0)) * 180.0/PI
Update Моего предыдущий пример был вполне законным, но ограничил диапазон & plusmn; 90 °. atan2
- это желаемое значение -179 ° до 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
(Оговорка: тригонометрические функции являются bazillions раза медленнее, чем простой разделяй и вычитать операции, даже если они сделаны в FPU!)
ИМХО Это не безобразно. Это довольно чисто и понятно. –
Что делать, если начальный угол меньше -179? –
После консультаций с документами я с Matthew Whited - угол% 360 дает значение от -359 до +359, а не 0 и +359. Следовательно, ваше решение не может нормализовать начальные значения, меньшие, чем -179. –