Есть ли способ обратить эффект atan2? - PullRequest
2 голосов
/ 20 июня 2011

У меня есть конкретный вопрос о реверсе atan2, я напишу пример кода на PHP.

$radial = 1.12*PI();
$transformed = -atan2(cos($radial)*2, sin($radial)*1.5);
$backToRadial = ?

Есть ли способ обратить преобразованное значение в начальную радиальную, не зная начальной радиальной? Вот как должен выглядеть поток кода: $radial => transform($radial) => transformback(transform($radial)) => $radial.

Я искал в Интернете (включая стек), но не смог найти правильный код. Также посмотрел википедию, но это было ошеломляюще. Мой вопрос, скорее, вопрос алгебры;).

Дайте мне знать, что вы думаете!

_

Ответил Джейсон С:

Answer (by radial range: -PI-PI):
$backToRadial = atan2(2*cos($transformed), -1.5*sin($transformed));

Answer (by radial range: 0-2PI):
$backToRadial = PI() + atan2(-(2*cos($transformed)), -(-1.5*sin($transformed)));

Ответы [ 2 ]

2 голосов
/ 20 июня 2011

Простой ответ, который будет работать для главных углов (углов в диапазоне от θ = -π до + π), выглядит следующим образом:

θ '= -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π), чтобы диапазон выходных углов не изменился.

2 голосов
/ 20 июня 2011

Во-первых, atan2 - это не то же самое, что tan -1 или arctan, как показано ниже из статьи Wiki на atan2:

enter image description here

Как видите, вы не можете отобразить его обратно без некоторой информации относительно x и y.Однако, если x>0 всегда истинно, тогда вы просто используете обратную функцию тангенса и т. Д.

Вы можете использовать это представление для вычисления обратной функции:

enter image description here

В вашем примере y = 2cos (r) и x = 1,5sin (r) .Поэтому, если вы разделите вышеприведенное выражение на y , вы получите его в виде x / y , которое в вашем случае равно 4/3 cot (r) .

Если это представление верно, некоторая простая алгебра дает вам:

enter image description here

где r = radial и k = кроватка (transformed / 2 )

WolframAlpha дал решение для этого:

enter image description here

Но в зависимости от ваших ресурсов, вероятно, лучше найти корень функции с фиксированным значением k .Например, если k = 1,35 , то вам нужно решить:

enter image description here

Любой достойный решатель (и, следовательно, комментарий к имеющимся у вас ресурсам), такой как MATLAB.решит это. WolframAlpha при условии следующего приблизительного реального решения:

enter image description here

...