やあ子どもたち。今夜あたりはまた雪が降るとかいう噂だけど雪かきはちゃんとやっているか。とくに道のことだよ。自分ちの駐車場なんかより家の前の道の雪かきをしっかりやって、通りを行く人の利便性を計った方がよっぽど世のためになるぞ。
さて、今日は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++の標準関数に
それならばということで、上記のように一行で2次元の回転処理が書けてしまうねというわけさ。
おっとこれは言うまでもないことかも知れないが、今回のこの「一行回転」は、複素数どうしの掛け算においては、その絶対値は積に、そしてその偏角は和になるという性質を利用したものだよ。
2x2の回転行列を実装するよりは手間もバグ混入の危険性もはるかに少なくて済むんじゃないかと思って敢えて緊急寄稿してみたぞ。
じゃ今回はこの辺で失礼しよう。チャオ!