2013-03-13 5 views
7

मैं एक एसटीएल ऑब्जेक्ट में बूस्ट :: ज्यामिति पॉलीगॉन कैसे प्राप्त करूं?एक बूस्ट ट्रांसफॉर्म करना :: एक एसटीएल ऑब्जेक्ट में ज्यामिति पॉलीगॉन

मुझे यकीन है कि यह आसान होना चाहिए क्योंकि मुझे दस्तावेज़ में कहीं भी उदाहरण नहीं मिल सकते हैं। फिर भी मैंने इस छोटे से काम करने की कोशिश कर रहे 4 पूर्ण कार्य दिवस बिताए हैं। मैं सी ++ (लंबे समय तक आर प्रोग्रामर) के लिए नया हूं, लेकिन इन छोटी डेटा रूपांतरण चीजें मुझे पागल कर रही हैं। Getting the coordinates of points from a Boost Geometry polygon

लेकिन कोड (और पोस्टर इसे बदल तो कई बार रखा) है कि मैं सिर या यह की पूंछ नहीं बना सकते तो जटिल है, और न ही कर सकते हैं:

हाँ वहाँ एक सवाल जिसका शीर्षक ज्यादा मेरा की तरह है मुझे कल्पना है कि अन्य सी ++ नए लोग सक्षम होंगे।

यह एक साधारण उदाहरण है जिसे कुछ अन्य बढ़ावा :: ज्यामिति डेटा प्रकारों में अनुवाद करना चाहिए, इसलिए उम्मीद है कि कोई भी इसका अनुसरण कर सकता है।

#include <iostream> 

#include <boost/geometry.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 
#include <boost/geometry/geometries/adapted/boost_tuple.hpp> 

BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian) 

//One thing I tried is a function to use with `for_each_point()` so I set that up first. 

    template <typename Point> 
    void get_coordinates(Point const& p) 
    { 
    using boost::geometry::get; 
    std::cout << get<0>(p) get<1>(p) << std::endl; 
    } 

    int main() 
    { 
    typedef boost::tuple<double, double> point; 
    typedef boost::geometry::model::polygon<point> polygon; 

    polygon poly; 
    boost::geometry::read_wkt("polygon((2.0 1.3, 2.4 1.7, 2.8 1.8, 3.4 1.2, 3.7 1.6, 3.4 2.0, 4.1 3.0, 5.3 2.6, 5.4 1.2, 4.9 0.8, 2.9 0.7, 2.0 1.3))", poly); 

    polygon hull; 
    boost::geometry::convex_hull(poly, hull); 

// Now I know I can `dsv()` and print to the screen like this: 

    using boost::geometry::dsv; 
    std::cout 
    << "hull: " << dsv(hull) << std::endl; 

    // And/Or I can use my function with for_each_point() 



    boost::geometry::for_each_point(hull, get_coordinates<point>); 

return 0; 
} 

मैं इन निर्देशांकों को एक एसटीएल कंटेनर में कैसे प्राप्त करूं? मैं एक्स के लिए दो std :: वेक्टर एक और वाई के लिए एक पसंद करेंगे, लेकिन कुछ भी करेगा।

उत्तर

5

पॉलीगॉन पहले से ही एक एसटीएल कंटेनर प्रारूप में हैं, बूस्ट :: ज्यामिति :: बहुभुज की बाहरी अंगूठी और आंतरिक अंगूठी डिफ़ॉल्ट रूप से एक std :: वेक्टर संग्रहित है।

क्या आप (अपनी टिप्पणी पर विचार) चाहते हो सकता है है:

polygon hull; 
    boost::geometry::convex_hull(poly, hull); 
    boost::geometry::for_each_point(boost::geometry::exterior_ring(hull), get_coordinates<point>); 

यदि आप करने के लिए अपने get_coordinates समारोह (ध्यान दें < < उपयोग) को ठीक से काम करेगा:

template <typename Point> 
    void get_coordinates(Point const& p) 
    { 
     using boost::geometry::get; 
     std::cout << get<0>(p) << ", " << get<1>(p) << std::endl; 
    } 

और यह परिवर्तन आपके टिप्पणी संकेतक // ;-)

+1

** मैंने आपके कोड में चीजों को बेहतर बनाने के लिए अपने कोड में कुछ त्रुटियों को ठीक किया है। प्रतिक्रिया देने के लिए बहुत बहुत धन्यवाद, दुर्भाग्यवश मुझे अभी भी यह नहीं मिल रहा है। मैंने [मॉडल :: बहुभुज के लिए प्रलेखन] (http://www.boost.org/doc/libs/1_53_0/libs/geometry/doc/html/geometry/reference/models/ को समझने का प्रयास करने में काफी समय लगाया model_polygon.html) और दस लाख वर्षों में कभी नहीं पता होगा कि अंक कैसे प्राप्त करें।मुझे कुछ प्रश्न पूछने दें: – politicalEconomist

+0

1) आपने यह कैसे निर्धारित किया कि बहुभुज वस्तु में समन्वय बिंदु * बाहरी अंगूठी * कहा जाता है? मैं प्वाइंट, प्वाइंटलिस्ट, रिंगलिस्ट, अंक, आंतरिक अंगूठी देखता हूं, लेकिन कभी * बाहरी अंगूठी * नहीं देखता हूं। 2) फिर आपने यह निर्धारित कैसे किया कि * बाहरी अंगूठी * std :: vector के रूप में संग्रहीत है? 3) std :: vector तक पहुंचने के लिए आप 'exterior_ring() 'का उपयोग कैसे जानते थे? – politicalEconomist

+0

4) भले ही मैं उन सभी को समझता हूं, फिर भी मैं उन सभी चीजों को नहीं कर सकता जो मुझे आमतौर पर उम्मीद है कि मैं एक std: vector के साथ कर सकता हूं। उदाहरण के लिए: डबल vectSize = boost :: ज्यामिति :: exterior_ring (हल)। आकार(); // रिटर्न 8 लेकिन तत्वों तक पहुंचने का प्रयास नहीं करता है: डबल एलिमेंट 1 = बूस्ट :: ज्यामिति :: बाहरी_रिंग (हल) [0]; त्रुटि: प्रारंभ में 0 बूस्ट :: tuples :: tuple 'to' double 'को परिवर्तित नहीं कर सकता – politicalEconomist

0

उदाहरण के लिए:

boost::geometry::model::polygon<Point> polygon; 
polygon.outer().push_back(point); 

तो, polygon.outer() std :: vector (बाहरी एक, जैसा कि बेरेन्ड गेहरल्स ने कहा) है। यहां देखें: boost reference

0

आप सभी बिंदुओं पर पुनरावृत्त करने के लिए बूस्टर मॉडल के साथ इटरेटर का उपयोग कर सकते हैं और उन्हें किसी भी प्रकार के कंटेनर में जोड़ सकते हैं।

पॉलीगॉन मॉडल थोड़ा अधिक जटिल हैं क्योंकि उनके पास एक बाहरी, और संभावित रूप से कई आंतरिक, अंगूठियां हैं।

मान लीजिए कि आप "हल" ऑब्जेक्ट की बाहरी अंगूठी (या मूल "पॉली" सहित किसी भी बहुभुज) में सभी बिंदुओं को चाहते हैं, बस इसे फिर से चालू करें और उन्हें मानक वेक्टर पॉइंट-बाय-पॉइंट में जोड़ें।

यदि आप एक्स का वेक्टर चाहते हैं, और वाई का वेक्टर चाहते हैं, तो उसी विधि का उपयोग करें।

::std::vector<point> hullPoints; 
::std::vector<double> hullXPoints; 
::std::vector<double> hullYPoints; 

// the auto keyword makes declaring iterators easy 
for (auto hullIterator = hull.outer().begin; 
     hullIterator != hull.outer().end(); 
     ++hullIterator) 
{ 
    // for a vector of point types, just add the points one by one 
    hullPoints.push_back(*hullIterator); 

    // for vectors of x and y, extract the x/y from the point 
    hullXPoints.push_back(get<0>(*hullIterator)); 
    hullYPoints.push_back(get<1>(*hullIterator)); 
} 
संबंधित मुद्दे