2

我有一个关于反转的具体问题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)));
4

2 回答 2

2

首先,atan2tan -1不同,或者arctan如下面的 Wiki 文章所示atan2

在此处输入图像描述

如您所见,如果没有一些关于x和的信息,您无法将其映射回来y。但是,如果x>0始终为真,那么您只需使用反正切函数等。

您可以使用此表示来计算反函数:

在此处输入图像描述

在您的示例中,y = 2cos(r)x = 1.5sin(r)。因此,如果您将上述表达式除以y,您将得到x/y的形式,在您的情况下为4/3 cot(r)

如果这个表示是正确的,一些简单的代数会给你:

在此处输入图像描述

其中r =radialk = cot ( transformed/2 )

WolframAlpha对此给出了解决方案:

在此处输入图像描述

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

在此处输入图像描述

任何像样的求解器(以及因此对您拥有的资源的评论),例如 MATLAB 都可以解决这个问题。WolframAlpha提供了以下近似实解:

在此处输入图像描述

于 2011-06-20T13:20:18.137 回答
2

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

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

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

其中第一个方程是您的正向变换,第二个方程是许多逆变换之一。

这样做的原因是您所做的相当于 r =1 的笛卡尔坐标对 (x,y) = (r cos θ, r sin θ) 的反射 + 缩放 + 单位幅度归一化,因为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 θ),最后一步为真对于任何 k > 0,atan2(ky,kx) = atan2(y,x),并且 -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 θ')

量子点


编辑:杰森正确地指出,您的示例角度 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), (等效于 mod 2π),以使输出角度的范围保持不变。

于 2011-06-20T14:06:01.303 回答