【问题标题】:Boost Geometry Matrix Transformations on Polygons增强多边形上的几何矩阵变换
【发布时间】:2018-02-21 10:22:41
【问题描述】:

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

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

【问题讨论】:

  • @sehe Boost Geometry 实际上有一个名为matrix_transformer 的策略,它就像一个魅力(见解决方案)
  • 我... 正确。我不知道qvm 指的是什么,我也没有在您的代码中看到它,但感谢您向我介绍了 Boost 库的新方面 :)
  • qvm 是一个用于矩阵、向量和四元数运算的 Boost 库,似乎是最近才引入的。它不在我的代码中,因为它在 matrix_transformer 内部
  • 再次感谢,我一定会试试这个

标签: c++11 boost boost-geometry


【解决方案1】:

这是我为可能感兴趣的人提供的解决方案。 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;
}

这是我的结果,绿色多边形是原始多边形,蓝色多边形是经过变换的(记住旋转是关于原点的):

【讨论】:

  • 这是一个非常漂亮的答案。感谢分享
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
相关资源
最近更新 更多