2017-09-12 5 views
2

부스트 기하학을 사용하여 다각형 (데카르트)에 행렬 변환의 예가 있습니까? 간단한 std :: vectors로 행렬을 정의하려고합니다.다각형의 부스트 기하학 행렬 변환

또한 ublas을 사용하여 matrix_transformers의 예를 하나만 찾을 수 있지만 간단한 매트릭스 변환에 너무 복잡합니다. 이것이 유일한 방법이라면, 나는 그것에 충실 할 것이다. 그러나 다른 옵션을 가지고있는 것이 좋을 것이다. 대신에 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