何か真面目にライブラリを作ってみようと思います

画像解析のアルゴリズムとか作りたくなって、作り始めました。
adobegilを参考にしてますが、
単に画像処理に限定しないで、セルオートマトンとか遺伝的アルゴリズムとかのアルゴリズムなども使えるようにして
ジェネリックなライブラリを作ってみようと思います。

とりあえず、コンテナのプロトタイプができました。

http://mad-projects.iobb.net/svn/gail

こんな感じで。

#include <iostream>
#include <iomanip>

#include <gail/gridmap/rect2d.hpp>


using namespace gail;
using namespace rect2d;

template <class Map>
void print(int xmin, int xmax, int ymin, int ymax, const Map& map){
  for(int y = ymax; y >= ymin; --y){
    for(int x = xmin; x <= xmax; ++x){
      std::cout << std::right << std::setw(3) << map[point(x, y)] << ' ';
    }
    std::cout << '\n';
  }
  std::cout << std::endl;
}

int main(){

  typedef rect2d_gridmap<int>::type map_type;
  map_type map(range(-5, 5, -5, 5)); // create map (-5 <= x <= 5, -5 <= y <= 5)

  int c = -60;
  for(int y=-5; y <= 5; ++y){
    for(int x=-5; x <= 5; ++x){
      map[point(x, y)] = c++;
    }
  }

  print(-5, 5, -5, 5, map);

  print(0, 1, 0, 1, map[rotate_90()]);

  print(0, 1, 0, 1, map[translate(2, 0) >> rotate_90() >> translate(-2, 0)]);

  return 0;
}

出力は

 50  51  52  53  54  55  56  57  58  59  60 
 39  40  41  42  43  44  45  46  47  48  49 
 28  29  30  31  32  33  34  35  36  37  38 
 17  18  19  20  21  22  23  24  25  26  27 
  6   7   8   9  10  11  12  13  14  15  16 
 -5  -4  -3  -2  -1   0   1   2   3   4   5 
-16 -15 -14 -13 -12 -11 -10  -9  -8  -7  -6 
-27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 
-38 -37 -36 -35 -34 -33 -32 -31 -30 -29 -28 
-49 -48 -47 -46 -45 -44 -43 -42 -41 -40 -39 
-60 -59 -58 -57 -56 -55 -54 -53 -52 -51 -50 

(0 <= x <= 1, 0 <= y <= 1の範囲を90回転させてマップを参照)
 -1  10 
  0  11 

(変換を合成することもできる)
 19  30 
 20  31 

変換の合成でexpression templateを初めて使ってみました。

todo:
1. rangeとconverterの合成

map[range(0, 1, 0, 1) >> rotate_90() >> translate(1, 2)];

みたいに書けるようにします。

2. イテレータを作る

map1 = map2[range(0, 1, 0, 1) >> rotate_90() >> translate(1, 2)];

とか

foreach(map[range(-1, 1, -1, 1) >> rotate_90()]);

みたいに特定の範囲内の要素を取り出せるようにします。

3. converterを増やす
例えば任意角度の回転とか。
実数値の座標を格子に対応させる為にsamplerって仕組みを用意します。
例えば
rotate(30, nearlest_sampler()) <- 30度回転させて一番近くの格子を取得。
みたいに。

4. 画像処理のアルゴリズムとかconverter。
まずはJPEG画像などを読み込めるようにします。

今はconverterは座標の変換しかしてないけど、要素の変換もconverterから指定できるようにできると嬉しいかもしれません。

//100x100ピクセルの範囲をグレースケールにして取得。
gridmap<hogehoge> gray_scale_image = rgb_image[range(100, 100) >> convert_gray_scale()];

でも

transform(rgb_image[range(100, 100)], gray_scale_image, convert_gray_scale());

みたいにできるし、効率が落ちてしまうようなら止めた方がいいかもしれません。