有没有办法扭转atan2的影响?

时间:2011-06-20 12:56:56

标签: math atan2

我有一个关于反转atan2的具体问题,我将用PHP编写我的代码示例。

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

有没有办法将转换后的值反转到起始径向,而不知道起始径向? 这就是代码流的方式:$radial => transform($radial) => transformback(transform($radial)) => $radial

我在网上搜索过(包括堆栈),但我找不到任何正确的代码。也看了维基百科,但它是压倒性的。我的问题是我认为更多的代数问题;)。

让我知道你的想法!

_

Jason S回答:

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 个答案:

答案 0 :(得分:2)

首先,atan2 tan -1 arctan不同,如下文{{3}上的Wiki文章所示}:

enter image description here

如您所见,如果没有关于xy的一些信息,则无法将其映射回来。但是,如果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 = cot transformed / 2

atan2为此提供了解决方案:

enter image description here

但是根据您的资源,最好找到具有固定值 k 的函数的根。例如。如果 k = 1.35 ,那么你需要解决:

enter image description here

任何像样的求解器(以及对你所拥有的资源的评论)都可以解决这个问题。 WolframAlpha提供了以下近似实际解决方案:

enter image description here

答案 1 :(得分:2)

一个适用于主角(θ=-π到+π范围内的角度)的简单答案如下:

  

θ'= -atan2(2cosθ,1.5sinθ)

     

θ= atan2(2cosθ', - 1.5sinθ')

其中第一个等式是前向变换,第二个等式是许多逆变换之一。

这样做的原因是你所做的相当于r =笛卡尔坐标对(x,y)=(rcosθ,rsinθ)的反射+缩放+单位幅度归一化1,因为atan2(y,x)=θ。

可行的特定转换是(x',y')=(1.5y,-2x)

θ'= atan2(y',x')= atan2(-2x,1.5y)= atan2(-2Rcosθ,1.5Rsinθ)= -atan2(2cosθ,1.5sinθ), 最后一步是真的,因为对于任何k> atan2(ky,kx)= atan2(y,x) 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(2cosθ', - 1.5sinθ')

Q.E.D。


编辑:Jason正确地指出,你的示例角度1.12π不在主角度范围-π到+π之内。您需要定义希望能够处理的角度范围,并且它必须是最大长度为2π的范围。

我的答案可以相应调整,但需要一些工作才能验证,如果你坚持-π到+π范围,你会更容易自己,因为你正在使用atan2()和它的输出在这个范围内。

如果你想使用atan2()的修改版本输出0-2π范围内的角度,我建议使用

atan2b(y,x) = pi+atan2(-y,-x)

其中atan2b现在在0和2π之间输出,因为atan2(-y,-x)的计算与atan2(y,x)的差值为π(mod2π)

如果您打算采用这种方法,请不要计算-atan2b(y,x);而是计算atan2b(-y,x),(等效mod2π),以便输出角度的范围保持不变。