1

离开大学后,我不必在代码中做太多数学,所以我决定复习一下,使用名为“程序员数学和物理学”的书。

这本书在第 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 的角度(alpha),坐标应该几乎没有任何变化,但我得到的是某些坐标分量的符号被否定。

例如,(-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 的角度会导致坐标的变化可以忽略不计。

4

1 回答 1

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)

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

于 2012-12-17T22:31:40.750 回答