2012-03-13 11 views
9

मैं दो ट्रांसफार्मर, एक अनुवाद और एक रोटेशन के रूप में निम्नानुसार है:दो बूस्ट ज्यामिति ट्रांसफार्मर को कैसे गठबंधन करें?

namespace bg = boost::geometry; 
namespace trans = bg::strategy::transform; 

trans::translate_transformer<point, point> translate(px, py); 
trans::rotate_transformer<point, point, bg::radian> rotate(rz); 

कैसे मैं उन्हें एक में गठबंधन है, इसलिए है कि मैं bg::transform दो बार हर बार फोन और एक मध्यवर्ती चर का उपयोग करने के लिए नहीं है?

+0

मुझे पूरी तरह से यकीन नहीं है लेकिन मुझे नहीं लगता कि यह अभी तक किया जा सकता है। उम्मीद है कि कोई मुझे गलत साबित करता है। – owagh

उत्तर

7

दोनों अनुवाद और घुमावदार एफ़िन ट्रांसफॉर्मेशन हैं, यानी, उन्हें मैट्रिक्स का उपयोग करके प्रदर्शित किया जा सकता है। इसलिए, आपको केवल एक नया ट्रांसफॉर्मर बनाना है जिसका मैट्रिक्स दो परिवर्तनों के मैट्रिस के उत्पाद के बराबर है।

#include <boost/geometry/geometries/point_xy.hpp> 
#include <boost/geometry/strategies/transform/matrix_transformers.hpp> 

namespace bg = boost::geometry; 
namespace trans = bg::strategy::transform; 

typedef bg::model::d2::point_xy<double> point; 

int main() 
{ 
    trans::translate_transformer<point, point> translate(0, 1); 
    trans::rotate_transformer<point, point, bg::degree> rotate(90); 

    trans::ublas_transformer<point, point, 2, 2> translateRotate(prod(rotate.matrix(), translate.matrix())); 

    point p; 
    translateRotate.apply(point(0, 0), p); 
    std::cout << bg::get<0>(p) << " " << bg::get<1>(p) << std::endl; 
} 

गुणन में मैट्रिक्स के आदेश के बारे में बहुत सावधान:

trans::ublas_transformer<point, point, 2, 2> translateRotate(prod(rotate.matrix(), translate.matrix())); 

यहाँ एक पूर्ण काम कर उदाहरण है। उपरोक्त उदाहरण पहले अनुवाद करता है, फिर घुमाता है।

+0

'प्रोड' फ़ंक्शन कहां से आता है? –

+0

भविष्य के संदर्भ के लिए: 'prod' फ़ंक्शन 'boost :: numeric :: ublas' नेमस्पेस में रहता है। इसके अलावा, बूस्ट 1.64 से शुरू होने वाली लाइन, 'ट्रांस :: ublas_transformer ...' से शुरू होने वाली रेखा 'trans :: matrix_transformer rotateTranslate (translate.matrix() * rotate.matrix() होना चाहिए) ; ' –

संबंधित मुद्दे