我有一个关于反向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)));发布于 2011-06-20 22:06:01
适用于主要角度(范围θ= -π到+π的角度)的简单答案如下:
θ‘= -atan2(2cosθ,1.5sinθ)
θ= atan2(2cosθ',-1.5inθ')
其中第一个方程是您的正向变换,第二个方程是许多逆变换之一。
这样做的原因是,由于atan2(y,x) =θ,因此您所做的等同于对r =1的笛卡尔坐标对(x,y) = (r cosθ,r sinθ)的反射+缩放+单位幅度归一化。
一个有效的特定变换是(x',y') = (1.5y,-2x)。
Atan2‘= atan2(y',x') = atan2(-2x,1.5y) = atan2(-2Rcosθ,1.5Rsinθ) =atan2(2cosθ,1.5Rsin),最后一步为真,因为对于任何大于0的k,-atan2(ky,kx) = atan2(y,x),并且-y(y,x) =θ(2Rcosθ,1.5Rsin)。
这可以通过求解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以保持角度不变:
sin = atan2(2x'/R,-1.5y'/R) = atan2(2 cosθ',-1.5θθ')
Q.E.D。
编辑: Jason正确地指出,您的示例角度1.12π不在主要角度范围-π到+π中。您需要定义希望能够处理的角度范围,并且该范围必须最大长度为2π。
我的答案可以相应地调整,但它需要一些工作来验证,而且由于您使用的是atan2(),并且它的输出在这个范围内,如果您坚持使用-πto +π范围,那么您会更容易。
如果您想使用输出角度在0-2π范围内的atan2()的修改版本,我建议您使用
atan2b(y,x) = pi+atan2(-y,-x)其中,由于计算atan2(-y,-x)与atan2(y,x)的角度相差π(mod2π),因此现在atan2b的输出介于0和2 mod之间。
如果你打算采用这种方法,不要计算-atan2b(y,x);而是计算atan2b(-y,x),(相当于mod 2π),这样输出角度的范围就保持不变。
https://stackoverflow.com/questions/6411484
复制相似问题