首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法扭转atan2的影响?

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

Stack Overflow用户
提问于 2011-06-20 20:56:56
回答 1查看 6.7K关注 0票数 2

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

代码语言:javascript
复制
$radial = 1.12*PI();
$transformed = -atan2(cos($radial)*2, sin($radial)*1.5);
$backToRadial = ?

有没有一种方法可以将变换后的值反转到起始径向,而不需要知道起始径向?代码流应该是这样的:$radial => transform($radial) => transformback(transform($radial)) => $radial

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

让我知道你的想法!

_

由Jason S回答:

代码语言:javascript
复制
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)));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()的修改版本,我建议您使用

代码语言:javascript
复制
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π),这样输出角度的范围就保持不变。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6411484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档