ゆとりーなの日記

日記的な事を書いて行くと思はれる

Boost.Polygonの謎

Boost.Polygonをなんとかしてゲームに使ってみようと言うことでいじっているのですが、謎が多いです。

謎1 boost::polygon::move

VC++2010のコード補完とかで引数を見ると、

boost::polygon::move(vertex_, x, y); // x,yは各方向の移動量

と出来そうなものですがこれはコンパイルエラーになり次のようにしないといけないみたいです。

boost::polygon::move(vertex_, boost::polygon::HORIZONTAL, x);
boost::polygon::move(vertex_, boost::polygon::VERTICAL, y);

謎2 boost::polygon::polygon_dataがpstade::oven::for_eachに対応してない

const boost::polygon::polygon_data<float> p;
std::for_each(p.begin(), p.end(), [](const boost::polygon::polygon_data<float>::point_type &x) {}); // OK
pstade::oven::for_each(p, [](const boost::polygon::polygon_data<float>::point_type &x) {}); // ERROR

テンション下がります。

謎3 DirectXよりもOpenGLの方が相性いいかも

OpenGLはglVertex2dに頂点を順次突っ込んでいけばいいので比較的簡単にboost::polygon::polygon_dataを渡せます。

const boost::polygon::polygon_data<float> p;
// 仕方がないからstd::for_each
std::for_each(p.begin(), p.end(), [](const boost::polygon::polygon_data<float>::point_type &v) {
  glVertex2d(boost::polygon::x(v), boost::polygon::y(v));
});

DirectXだと、

struct vertex2d {
  float x, y, z;
  float rhw;
  DWORD color;
};

のような構造体の配列に頂点を突っ込んでいく必要があるので少々コードが複雑になります。というかアルゴリズムを使ったいい感じの初期化方法が思いつきません。
取り敢えずfor文でごり押ししました。

std::array<vertex2d, 4> v = {{
  {0.f, 0.f, 0.f, 1.f, 0xFFFFFFFF},
  {0.f, 0.f, 0.f, 1.f, 0xFFFFFFFF},
  {0.f, 0.f, 0.f, 1.f, 0xFFFFFFFF},
  {0.f, 0.f, 0.f, 1.f, 0xFFFFFFFF}
}};
const boost::polygon::polygon_data<float> p;
auto v_it = v.begin();
auto p_it = p.begin();
for (v_it = v.begin(), p_it = p.begin(); v_it != v.end() || p_it != p.end(); ++v_it, ++p_it) {
  v_it->x = boost::polygon::x(*p_it);
  v_it->y = boost::polygon::y(*p_it);
}

う〜ん、美しくありません。