离开大学后,我的代码中没有多少数学,所以我决定使用“程序员的数学和物理”这本书进行复习。
本书在第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的角度会导致坐标变化微不足道。
答案 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)
对于它的价值,你上面的第二个公式既快又更常用。