2017-09-12 61 views
2

使用Boost几何体,多边形(笛卡尔)上是否存在任何矩阵转换示例?我用简单的std :: vectors定义矩阵。在多边形上提升几何矩阵转换

此外,我只能找到matrix_transformers的一个例子,使用ublas,但它对于简单的矩阵转换太复杂了。如果这是唯一的方法,我会坚持下去,但它有其他选择是很好的,广告与std::vector而不是ublas::matrix

+0

没有,令人惊讶的(?)的几何库没有做矩阵运算 – sehe

+0

@sehe升压几何实际上有一个叫做'matrix_transformer'这工作就像一个魅力策略(见配液) –

+0

我......认错。我不知道'qvm'指的是什么,我也没有在你的代码中看到它,但是谢谢你向我介绍了Boost库的新方面:) – sehe

回答

2

这是我的解决方案,任何可能感兴趣的人。 Boost几何实际上添加了一个名为matrix_transformer的策略,该策略依靠Boost的qvm::mat进行矩阵转换。有没有那么多的例子摆在那里,所以这里是我的代码:

#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