大学を卒業してからコードで数学をあまりする必要がなかったので、「プログラマーのための数学と物理」という本を使って復習することにしました。
この本は、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)は、0.004ラジアンの回転で(-3.333、1.667)に変わります。
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に近い角度では、座標の変化はごくわずかです。