2017-09-12 9 views
2

ブーストジオメトリを使用して、ポリゴン(デカルト)のマトリックス変換の例はありますか?私は単純なstd :: vectorsで行列を定義しています。ポリゴンのブーストジオメトリマトリックス変換

また、ublasを使用してmatrix_transformersという1つの例しか見つかりませんでしたが、単純な行列変換のために複雑すぎます。しかし、これが唯一の方法であれば、私はそれに固執しますが、ublas::matrixの代わりにstd::vectorでこれを行うこともできます。

+0

いや、意外に(?) – sehe

+0

ジオメトリを後押し@sehe行列演算を行いませんジオメトリライブラリが実際に魅力のように働いた 'matrix_transformer'と呼ばれる戦略を持っている –

+0

私は...修正スタンド(ソリューションを参照してください) 。私は 'qvm'が何を参照しているのかわからないし、あなたのコードでもそれを見ることはできませんが、私をブーストライブラリの新しい側面に紹介してくれてありがとう:) – sehe

答えて

2

ここに興味のある人のための私のソリューションです。ブーストジオメトリには実際には、ブーストのqvm::matに基づいてマトリックス変換を行うmatrix_transformerという戦略が追加されました。そこにそこにいる多くの例では、ありませんので、ここに私のコードです:

#include <boost/geometry.hpp> 
#include <boost/geometry/geometries/point_xy.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 

using namespace boost::geometry::strategy::transform; 

typedef boost::geometry::model::d2::point_xy<double> point_2f; 
typedef boost::geometry::model::polygon<point_2f> polygon_2f; 

int main() { 
    polygon_2f pol; 
    boost::geometry::read_wkt("POLYGON((10 10,10 27,24 22,22 10,10 10))", pol); 

    polygon_2f polTrans; 

    // Set the rotation angle (in radians) 
    double angleDeg = 45; 
    double angleRad = angleDeg * 3.14159/180.0; 

    vector<vector<double> > mat = {{cos(angleRad), sin(angleRad), 0}, {-sin(angleRad), cos(angleRad), 0}, {0, 0, 1}}; 

    // Create the matrix_trasformer for a simple rotation matrix 
    matrix_transformer<double, 2, 2> rotation(mat[0][0], mat[0][1], mat[0][2], mat[1][0], mat[1][1], mat[1][2], mat[2][0], mat[2][1], mat[2][2]); 

    // Apply the matrix_transformer 
    boost::geometry::transform(pol, polTrans, rotation); 

    // Create svg file to show results 
    std::ofstream svg("transformationExample.svg"); 
    boost::geometry::svg_mapper<point_2f> mapper(svg, 400, 400); 

    mapper.add(pol); 
    mapper.map(pol, "fill-opacity:0.5;fill:rgb(153,204,0);stroke:rgb(153,204,0);stroke-width:2"); 

    mapper.add(polTrans); 
    mapper.map(polTrans, "fill-opacity:0.5;fill:rgb(153,204,255);stroke:rgb(153,204,255);stroke-width:2"); 

    return 0; 
} 

そしてここでは、緑の多角形がオリジナルであると青のポリゴンが変換され、私の結果は、(回転が起源についてだったことを覚えておいてください)です。

enter image description here

+1

これはとても素敵な答えです。それを分かち合いに感謝 – sehe

関連する問題