2014-04-17 7 views
7


मैं संघ के लिए कई बढ़ावा :: polgons है, लेकिन मेरे दृष्टिकोण विशेष रूप से बहुभुज (> 2000) की बड़ी संख्या के साथ बहुत performant (> 15 मिनट) नहीं लगता है,।
मैं एक multipolygon में सभी बहुभुज मैं संघ करना चाहते हैं धक्का और फिर multipolygon में शामिल होने,
मेरी कोड देखें:कई बूस्ट :: बहुभुजों का संघ बनाने का सबसे तेज़ तरीका क्या है?

BOOST_FOREACH(polygon, multipolygon) 
{ 
    boost::geometry::clear(tmp_union); //tmp_union is a multipolygon 
    boost::geometry::union_(result, poly, tmp_union); 
    result = tmp_union; 
} 

परिणाम शायद बहुत अधिक बहुभुज, क्योंकि बहुभुज का सबसे संघ को शामिल नहीं होंगे होगा एक दूसरे को काटना।

क्या यह अधिक प्रदर्शन करने वाला कोई तरीका है, जैसे कि कुछ विशिष्ट क्रम में बहुभुज को सॉर्ट करना या पूरी तरह से अलग दृष्टिकोण?

धन्यवाद

+1

'बढ़ावा :: ज्यामिति :: polygons' http://www.boost.org/doc/libs/ से इन बहुभुज हैं 1_58_0/libs/ज्यामिति/दस्तावेज़/एचटीएमएल/ज्यामिति/संदर्भ/अवधारणाओं/concept_polygon.html 'बूस्ट :: बहुभुज :: बहुभुज' http://www.boost.org/doc/libs/1_53_0/libs/polygon/ डॉक/gtl_polygon_concept.htm? – alfC

उत्तर

1

आप देख सकते हैं कि CGAL चीजें कर रहा है। कम से कम उनके पास एक से अधिक बहुभुज में शामिल होने के लिए a function है। कोड को देखते हुए, मुझे एक फ़ंक्शन _devide_and_conquer पर कॉल दिखाई देता है। जिसे boost पर भी अनुवाद करना चाहिए: बहुभुज की सूची को दो में विभाजित करें, प्रत्येक के लिए यूनियन की गणना करें। कम से कम अगर परिणामस्वरूप बहुभुज मूल की तुलना में अधिक जटिल है, तो आपको कुछ सुधार देना चाहिए।

हैं कि अभी भी पर्याप्त नहीं है, आप CGAL यदि आपका कोई और जादू जो यह तेजी से बढ़ावा से बनाता है यह देखने के लिए एक कोशिश दे सकता है। यदि नहीं, तो आपको खुद को गणना को लागू करना पड़ सकता है।

मुझे लगता है मैं छोड़ दिया endpoint की x मूल्य में वृद्धि के क्रम में बहुभुज किनारों को सॉर्ट चाहते हैं। फिर आप अपने बहुसंख्यक के बाहरी सीमाओं को ट्रैक करते हुए समानांतर में सभी बहुभुज के किनारों पर फिर से सक्रिय कर सकते हैं। संघ के वर्तमान सीमाओं के भीतर पूरी तरह से स्थित किसी भी किनारों को बहुत जल्दी छोड़ दिया जा सकता है। लेकिन संख्यात्मक अस्थिरता के मुकाबले कार्यान्वयन को मजबूत बनाना संभवतः एक बड़ी समस्या है यदि आप इसे स्वयं से निपटते हैं। इसके लिए आप robust predicates देख सकते हैं।

+3

कहाँ गति एक मुद्दा मैं CGAL की सिफारिश नहीं होगा के रूप में यह है [परिमाण के एक आदेश धीमी] (http://rogue-modron.blogspot.com.au/2011/04/polygon-clipping-wrapper-benchmark.html) अन्य बहुभुज क्लिपिंग पुस्तकालयों की तुलना में। –

0

यह अपने बहुभुज की तरह लग रही है कि कैसे देखे बिना जमीन सलाह देने के लिए मुश्किल है।

अंतर्ज्ञान मुझसे कहता है कि आप इलाके में सुधार और बहुभुज कि हस्तक्षेप करने की संभावना है विलय, एक नीचे-ऊपर फैशन में करना चाहिए।

इस के लिए, बहुभुज के केन्द्रों में से मंझला भुज पता लगाने और उन्हें मंझला के दोनों तरफ में विभाजन; प्रत्येक आधा के लिए, ordinate के साथ दोहराना; और इतनी बार फिर से। यह केंद्रों के केडी पेड़ (http://en.wikipedia.org/wiki/Kd_tree) के निर्माण के समान है।

जब आप दो बहुभुज के साथ खत्म हो, उन्हें मर्ज। फिर, रिकर्सिव पेड़ ऊपर, जोड़े में बहुभुज मर्ज करें।

2

तुम भी वर्ग property_merge http://www.boost.org/doc/libs/1_55_0/libs/polygon/doc/gtl_property_merge.htm द्वारा संघ के Boost.Polygon कार्यान्वयन की कोशिश कर सकते हैं।

अनिवार्य रूप से, आप एक छोटी सी पूर्णांक संपत्ति के साथ एक property_merge वस्तु बनाने:

namespace bgp = boost::polygon; 
typedef int property_type; 
typedef int coordinate_type; 
const property_type FAKE_PROPERTY = 99; 

typedef std::map<std::vector<property_type>, bpg::polygon_set_data<coordinate_type> > merge_result; 
//in fact, merge_map will have 1 element only 

merge_map merger; 
for (polygon: my_polygons) 
    merger.insert(polygon, FAKE_PROPERTY); 

merge_result mresult; 
merger.merge(mresult); 

//now use the only element result should have 
assert(mresult.size()<=1); 
if (mresult.empty()) 
{ 
    //use empty bpg::polygon_set_data() 
} 
else 
{ 
    //use 
    const bpg::polygon_set_data & result = mresult.begin()->second; 
    ... 
} 
+0

क्या आप इस उत्तर पर थोड़ा सा विस्तार कर सकते हैं? यह स्पष्ट नहीं है (मेरे लिए) property_merge का उपयोग करके आप बहुभुज के सेट को कैसे मर्ज करेंगे? –

+1

@PaulR, कृपया –

+0

से ऊपर अपडेट किया गया कोड देखें - ऐसा करने के लिए समय निकालने के लिए धन्यवाद - यह वास्तव में सहायक है! –

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