boost::polygon::point_data ⇔ D3DXVECTOR2 続き
前回の続き。
geometry_concept、point_traits、point_mutable_traits の3つのクラスを特殊化すれば互換性の壁をぶっ壊せるらしい。
#include <assert.h> #include <d3dx9.h> #include <boost/polygon/polygon.hpp> #include <boost/array.hpp> #include <pstade/oven/copied.hpp> namespace boost{ namespace polygon{ // D3DXVECTOR2 を boost::polygon で使用するための特殊化 template<> struct geometry_concept<D3DXVECTOR2>{ typedef point_concept type; }; template<> struct point_traits<D3DXVECTOR2>{ typedef float coordinate_type; static inline coordinate_type get(const D3DXVECTOR2& point, orientation_2d orient) { return point[orient.to_int()]; } }; template<> struct point_mutable_traits<D3DXVECTOR2>{ typedef float coordinate_type; static inline void set( D3DXVECTOR3& point, orientation_2d orient, point_traits<D3DXVECTOR2>::coordinate_type value) { point[orient.to_int()] = value; } static inline D3DXVECTOR2 construct( point_traits<D3DXVECTOR2>::coordinate_type x_value, point_traits<D3DXVECTOR2>::coordinate_type y_value) { return D3DXVECTOR2(x_value, y_value); } }; } } // namespace boost{ namespace polygon{ int main(){ namespace oven = pstade::oven; namespace gtl = boost::polygon; D3DXVECTOR2 d3d_vec(1.0f, 2.0f); gtl::point_data<float> point = d3d_vec; // コピーされるよ assert(gtl::x(d3d_vec) == 1.0f); // 関数も問題なく処理される boost::array<D3DXVECTOR2, 4> d2d_array = { D3DXVECTOR2(0.0f, 0.0), D3DXVECTOR2(1.0f, 0.0), D3DXVECTOR2(0.0f, 1.0), D3DXVECTOR2(0.0f, 0.0), }; // 配列のコピーも問題ない std::vector<gtl::point_data<float> > point_data_array = d2d_array|oven::copied; // d3d_vec = point; // ただし逆の代入、てめーはダメだ! return 0; }
これで、point_data 以外の型も処理することが出来るので使い勝手が良くなったんじゃなかろうかと。
代入や関数の処理も問題ないみたいです。
ただし、point_3d_data は、まだ未実装みたいです。
(各 traits は用意されてるけど代入部分が真っ白でした。)
あと逆の代入は無理なので、相変わらず自前で変換してやれないとダメみたい。
しかし、やろうとしてた事を先にやられてしまったのでまったく面白くないな!
コメントありがとうございます。
[boost]
ver 1.44.0
[参照]
http://www.boost.org/doc/libs/1_44_0/libs/polygon/doc/gtl_point_concept.htm