促进多边形上的几何矩阵变换
Boost Geometry Matrix Transformations on Polygons
是否有使用 Boost Geometry 对多边形(笛卡尔)进行矩阵变换的示例?我用简单的 std::vectors.
定义矩阵
此外,我只能找到 1 个使用 ublas
的 matrix_transformers
示例,但对于简单的矩阵变换来说它太复杂了。如果这是唯一的方法,我会坚持下去,但有其他选择会很棒,广告用 std::vector
而不是 ublas::matrix
.
这是我的解决方案,供任何可能感兴趣的人使用。 Boost geometry 实际上添加了一个名为 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;
}
这是我的结果,其中绿色多边形是原始多边形,蓝色多边形是经过变换的(记住旋转是关于原点的):
是否有使用 Boost Geometry 对多边形(笛卡尔)进行矩阵变换的示例?我用简单的 std::vectors.
定义矩阵此外,我只能找到 1 个使用 ublas
的 matrix_transformers
示例,但对于简单的矩阵变换来说它太复杂了。如果这是唯一的方法,我会坚持下去,但有其他选择会很棒,广告用 std::vector
而不是 ublas::matrix
.
这是我的解决方案,供任何可能感兴趣的人使用。 Boost geometry 实际上添加了一个名为 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;
}
这是我的结果,其中绿色多边形是原始多边形,蓝色多边形是经过变换的(记住旋转是关于原点的):