C++11 多边形上的Boost几何矩阵变换

C++11 多边形上的Boost几何矩阵变换,c++11,boost,boost-geometry,C++11,Boost,Boost Geometry,是否有使用Boost Geometry对多边形(笛卡尔)进行矩阵变换的示例?我用简单的std::vectors定义矩阵 此外,我只能找到一个使用ublas的matrix\u transformers示例,但对于简单的矩阵变换来说,它太复杂了。如果这是唯一的方法,我会坚持下去,但如果有其他选择,那就太好了,用std::vector而不是ublas::matrix,为可能感兴趣的人提供我的解决方案。Boost geometry实际上添加了一个名为的策略,该策略依赖于Boost的qvm::mat进行矩

是否有使用Boost Geometry对多边形(笛卡尔)进行矩阵变换的示例?我用简单的std::vectors定义矩阵


此外,我只能找到一个使用
ublas
matrix\u transformers
示例,但对于简单的矩阵变换来说,它太复杂了。如果这是唯一的方法,我会坚持下去,但如果有其他选择,那就太好了,用
std::vector
而不是
ublas::matrix

为可能感兴趣的人提供我的解决方案。Boost geometry实际上添加了一个名为的策略,该策略依赖于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;
}
#包括
#包括
#包括
使用名称空间boost::geometry::strategy::transform;
typedef boost::geometry::model::d2::point_xy point_2f;
typedef boost::geometry::model::polygon_2f;
int main(){
多边形_2f pol;
boost::geometry::read_wkt(“多边形((1010,1027,2422,2210,1010))”,pol);
多边形_2f polTrans;
//设置旋转角度(以弧度为单位)
双角度度=45;
双角度弧度=角度度*3.14159/180.0;
向量mat={cos(angleRad),sin(angleRad),0},{-sin(angleRad),cos(angleRad),0},{0,0,1};
//为简单旋转矩阵创建矩阵变换器
矩阵_变压器旋转(矩阵[0][0]、矩阵[0][1]、矩阵[0][2]、矩阵[1][0]、矩阵[1][1]、矩阵[1][2]、矩阵[2][0]、矩阵[2][1]、矩阵[2][2];
//应用矩阵变换器
boost::geometry::transform(pol、polTrans、旋转);
//创建svg文件以显示结果
std::ofstreamsvg(“transformationExample.svg”);
boost::geometry::svg\U映射器映射器(svg,400400);
地图绘制者添加(pol);
贴图(pol,“填充不透明度:0.5;填充:rgb(153204,0);笔划:rgb(153204,0);笔划宽度:2”);
mapper.add(polTrans);
map(polTrans,“填充不透明度:0.5;填充:rgb(153204255);笔划:rgb(153204255);笔划宽度:2”);
返回0;
}
这是我的结果,绿色多边形是原始多边形,蓝色多边形被变换(记住旋转是围绕原点的):


@sehe Boost Geometry实际上有一种称为“矩阵变压器”(matrix_transformer)的策略,它的工作方式非常有魅力(参见解决方案)。。。站直了。我不知道
qvm
指的是什么,我在你的代码中也看不到,但感谢你向我介绍Boost库的新方面:)
qvm
是一个用于矩阵、向量和四元数运算的Boost库,似乎最近才引入。它不在我的代码中,因为它是矩阵变压器的内部部分。再次感谢,我一定会尝试这个方法。这是一个非常好的答案。谢谢分享