簡易円描画用アルゴリズム

やあ子供たち元気にしてたかな。最近はおじさんも日記の更新もすっかりせずに購読者も一人二人と減ってしまった次第だが日記に書けるほど普遍性の高いコードを開発することが出来なくなっていたのも事実だ。
そんな中、今日紹介するのは誰でも簡単に円周上の各点における処理ができてしまうアルゴリズムを紹介するよ。その名もForEachCircularPointだ。
以下にソースを紹介しよう。

 template< class Func >
  // Func:: void operator()( const float x, const float y )
  void ForEachCircularPoints( const int nres, const float radii, Func& func )
  {
    const float uni = 2*M_PI /(float)nres;
    for( int i=0; i<nres; ++i ){
      const float phi = uni*i;
      float x = radii * cos( phi );
      float y = radii * sin( phi );
      func( x, y );
    }// i
    return;
  }

これは上記コメントにもある、演算子ポリシーを満たす関数オブジェクトなら何でも受け付けるというものだ。使い方は以下のようになるかな。

 struct MyFunc{
    void operator()( const float x, const float y ){
      glVertex3f( 0, x, y );
    }
  };
  // OpenGLで、23角形を描画します。
  glBegin( GL_LINES );
  ForEachCircularPoints( 23, 10.0, MyFunc() );
  glEnd();

どうだろうか。これはOpenGLでYZ平面状(x=0)に23角形を描画するプログラムだ。
円を描画するためのループを毎回書くのはとても面倒だ。360度を何等分して描画するから何度ずつ加算して、cos, sin計算して、、といちいち考えて実装してテストするのは時間がもったいない。
そこで本アルゴリズムの登場だ。まーこんなものでもWEBからさくっとコピペして使えるようにしておけば、仕事時間の5分くらいは短縮できる場合もあるだろうということでここに掲載しておくよ。
最後に、上記コードはもちろん円周率としてM_PIは定義済みなことを前提としてるからそこは各自用意するなり気をつけてくれ。