离开大学后,我不必在代码中做太多数学,所以我决定复习一下,使用名为“程序员数学和物理学”的书。
这本书在第 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 的角度会导致坐标的变化可以忽略不计。