Book中的2D旋转公式不起作用

时间:2012-12-17 22:19:09

标签: geometry

离开大学后,我的代码中没有多少数学,所以我决定使用“程序员的数学和物理”这本书进行复习。

本书在第113页说,要围绕原点旋转一个点,公式为(角度为弧度):

new_x = sqrt(x*x + y*y) * cos(alpha - atan(y,x))
new_y = sqrt(x*x + y*y) * sin(alpha - atan(y,x))

听起来很简单,但与我在Google中看到的有关旋转的所有示例不同。谷歌搜索时,似乎其他人都这样做:

new_x = x * cos(angle) - y * sin(angle)
new_y = y * cos(angle) + x * sin(angle)

(这似乎给出了正确的结果)

现在我的问题是它不起作用,我想知道原因。我的假设是使用接近0.0的角度(α),坐标几乎没有任何变化,但我得到的是一些坐标分量的符号被否定。

例如,(-3.333,-1.667)转动为(-3.333,1.667),旋转角度为0.004弧度。

Java代码如下所示:

double h = sqrt(x*x + y*y);
double atanyx = atan2(y,x);
double angle = alpha - atanyx;
return new Point(h*cos(angle), h*sin(angle));

那么问题是什么?这本书的公式错了吗?如果没有,为什么它与其他人的不同呢?为什么我的Java实现没有按预期工作?我的期望是,接近0的角度会导致坐标变化微不足道。

1 个答案:

答案 0 :(得分:1)

书中的公式是错误的。它应该是:

new_x = sqrt(x*x + y*y) * cos(atan(y,x) + alpha)
new_y = sqrt(x*x + y*y) * sin(atan(y,x) + alpha)

对于它的价值,你上面的第二个公式既快又更常用。