二次元の回転は複素数を使って一行で書け!

やあ子どもたち。今夜あたりはまた雪が降るとかいう噂だけど雪かきはちゃんとやっているか。とくに道のことだよ。自分ちの駐車場なんかより家の前の道の雪かきをしっかりやって、通りを行く人の利便性を計った方がよっぽど世のためになるぞ。
さて、今日は2次元ベクトルの回転の話だよ。2次元ベクトルの回転というと高校数学なんかでやったあの2x2のsinやcosからなる回転行列を考えてしまいがちだが、C++の標準関数が使える俺達にそんなものは必要ないというネタだ。
では今日のネタをみて行こう。

#include <iostream>
#include <cmath>
#include <complex>
using namespace std;

 //..
    double x = 1.0;
    double y = 0.0;
    {
     //回転させたい2次元ベクトルを複素数として作成
        complex< double > comp( x, y );
       // 以下たった一行で、回転が完了する。
        comp *= exp( complex< double >( .0, 60.0*M_PI/180.0 ) );
        // 結果の回収
        x = comp.real();
        y = comp.imag();
    }
    cout << x<<", "<<y<<endl;

そしてこれの出力は以下のようになったよ。

  0.5, 0.866025

うんうん。まさにベクトル(1.0, 0.0)をCCW向きに60度回転させた結果だね。
さてさていつの日からか、C++の標準関数になるヘッダが利用可能となっており、これが複素数クラスというわけだ。さらにこれさえ組み込めばexp()関数の、複素数対応版(あの有名なオイラーの公式に対応したやつだよ)もがオーバーロードされるという便利な様相を呈している。
それならばということで、上記のように一行で2次元の回転処理が書けてしまうねというわけさ。
おっとこれは言うまでもないことかも知れないが、今回のこの「一行回転」は、複素数うしの掛け算においては、その絶対値は積に、そしてその偏角は和になるという性質を利用したものだよ。
2x2の回転行列を実装するよりは手間もバグ混入の危険性もはるかに少なくて済むんじゃないかと思って敢えて緊急寄稿してみたぞ。
じゃ今回はこの辺で失礼しよう。チャオ!