Простой ответ, который будет работать для главных углов (углов в диапазоне от θ = -π до + π), выглядит следующим образом:
θ '= -atan2 (2cos θ, 1.5sin θ)
θ = atan2 (2cos θ ', -1.5sin θ')
, где первое уравнение - это ваше прямое преобразование, а второе - одно из многих обратных преобразований.
Причина этого в том, что то, что вы делаете, эквивалентно отражению + масштабированию + единица-величина-нормализация пары декартовых координат (x, y) = (r cos θ, r sin θ)для r = 1, так как atan2 (y, x) = θ.
Конкретное преобразование, которое будет работать, будет (x ', y') = (1,5y, -2x) .
θ '= atan2 (y', x ') = atan2 (-2x, 1,5y) = atan2 (-2Rcos θ, 1,5Rsin θ) = -atan2 (2 cosθ, 1,5 sin θ),с последним истинным шагом, поскольку atan2 (ky, kx) = atan2 (y, x) для любого k> 0 и -atan2 (y, x) = atan2 (-y, x).
Это можетбыть обратным путем решения для x и y, а именно y = 1 / 1.5 * x 'и x = -1/2 * y':
θ = atan2 (y, x) = atan2 (1 / 1.5 * x ', -1/2 * y')
, и мы решили умножить (x, y) на k = 3 / R, чтобы оставить уголбез изменений:
θ = atan2 (2x '/ R, -1,5y' / R) = atan2 (2 cos θ ', -1,5 sin θ')
QED
edit: Джейсон правильно указывает, что ваш примерный угол 1.12π не находится в диапазоне главных углов от -π до + π.Вам нужно определить диапазон углов, который вы хотите иметь, и он должен быть максимально длинным 2π.
Мой ответ может быть скорректирован соответствующим образом, но для этого нужно немного потрудитьсяпроверьте, и вам будет легче, если вы будете придерживаться диапазона от -π до + π, так как вы используете atan2()
и его выход находится в этом диапазоне.
Если вы хотите использовать модифицированныйверсия atan2()
, которая выводит углы в диапазоне 0-2π, я бы рекомендовал использовать
atan2b(y,x) = pi+atan2(-y,-x)
, где atan2b теперь выводит между 0 и 2π, поскольку вычисления atan2 (-y, -x) отличаютсяиз atan2 (y, x) на угол π (mod 2π)
Если вы собираетесь использовать этот подход, не рассчитывайте -atan2b(y,x)
;вместо этого рассчитайте atan2b(-y,x)
, (эквивалентный мод 2π), чтобы диапазон выходных углов не изменился.