इंटरसेक्टिंग लाइनों के एक सेट से बहुभुज बनाएं


10

यह एक सरल और काफी सामान्य प्रश्न है जो पहले से ही विभिन्न उद्देश्यों के लिए पूछा गया है ( इस लिंक को देखें और यह भी , उदाहरण के लिए), हालांकि, हम एक सॉफ्टवेयर पैकेज नहीं बल्कि एल्गोरिदम की तलाश कर रहे हैं जिसे हम इसे कहने के लिए लागू करने का प्रयास कर सकते हैं अजगर

तो, जैसा कि नीचे दिखाया गया है कि रेखाओं के एक सेट को मैप किया जाता है (वे पहले से ही छंटनी की जाती हैं, BTW)।
पॉलीगोन उत्पन्न करने के लिए एल्गोरिदम / विचार (जैसा कि लाल दिखाया गया है) ?

यहां छवि विवरण दर्ज करें


क्या बाहरी वर्ग सीमा ज्ञात है, या वह भी इनपुट लाइनों से पढ़ने के लिए है?
देवदत्त तेंग्शे

जवाबों:


6

ठीक है, हम यहाँ एक उत्तर देते हैं जो हमारे प्रश्न का पूर्ण उत्तर नहीं है , अर्थात यह प्रश्न " उत्तर देने के लिए खुला " रहेगा । हालांकि यह सवाल में समस्या का समाधान है। यहां हमने जो ट्रिक प्रयोग किया है:

पहले परिणाम देखें :
यहां छवि विवरण दर्ज करें

तो में दी गई leftबहुभुज में दी गई लाइनें middle। वे वास्तविक बहुभुज हैं जैसा कि में दिखाया गया है right;)

नीचे दिए गए एल्गोरिदम के लिए हमने पायथनShapely में पैकेज का उपयोग किया ।

  • लाइनें ==> MultiLineString {:: एम}
  • एक छोटा जोड़ें buffer, eps{:: MB}
  • क्षेत्र ==> Polygon {:: पी} (यहां क्षेत्र एक वर्ग है)
  • P.difference(MB) {परिणामी बहुभुज}

ध्यान दें कि यह ऑपरेशन में तेजी से शांत है। हालांकि, लापता बिंदु यह है कि एल्गोरिथ्म लाइनों से बहुभुज के निर्माण के लिए एक मूल विधि नहीं है । फिर भी इसने हमारे हाथ में जो समस्या थी उसके लिए पूरी तरह से काम किया।


4

JTS टोपोलॉजी सूट में एक बहुभुज वर्ग होता है, जो बहुत कुछ करता है।

आप यहाँ उपलब्ध सोर्स कोड पर एक नज़र डाल सकते हैं , और इसे पायथन में बदल सकते हैं।


जैसा कि कोड विवरण कहता है कि यह प्रश्न लेखक द्वारा अपेक्षित के रूप में काम नहीं करेगा: "किनारों को सही ढंग से noded होना चाहिए; अर्थात, उन्हें केवल अपने समापन बिंदु पर मिलना चाहिए। बहुभुज गलत तरीके से noded इनपुट पर चलेगा, लेकिन गैर से बहुभुज नहीं बनाएगा। -नोडेड किनारों "
पाब्लो

1
जेआरटीएस के भीतर एक ऑपरेशन है जो लाइनों को कोने पर सही ढंग से विभाजित करने के लिए है। हो सकता है कि ओपी उस पर भी गौर कर सके।
देवदत्त तेंग्शे

3

आप पायथन शेपली पैकेज पर एक नज़र डाल सकते हैं, विशेष रूप से बहुभुज ()


एक त्वरित ध्यान दें कि Shapely ( from shapely.ops import polygonize) में बहुभुज GEOS से GEOS.Polygonize का उपयोग करता है । तो यह एक लिंक है जहाँ एक लिंक का लिंक है ...: |
डेवलपर

हमारे परीक्षण polygonizeबिल्कुल सफल नहीं थे। हालाँकि हमें याद दिलाने के लिए धन्यवाद Shapelyजिसके साथ हम उत्तर के रूप में एक समाधान (एक चाल, वास्तव में) पा सकते हैं।
डेवलपर

2

यहाँ एक और उपाय है जो हम पा सकते हैं।

का उपयोग करके DCELहम स्पर्श रेखाओं से ब्लॉक बना सकते हैं।

के लिए अजगर वहाँ एक पैकेज है {यहाँ} । यह कुछ बग के साथ एक छोटा कार्यान्वयन है। फिर भी कुछ प्रयासों के साथ इसका उपयोग इस समस्या के लिए किया जा सकता है। निम्नलिखित चरणों पर भी ध्यान दें:

एक पूर्व-प्रसंस्करण चरण जिसके साथ लाइनों के बीच सभी चौराहे पाए जाते हैं। फिर तदनुसार सभी पंक्तियों को अंतःक्रिया बिंदुओं पर खंडों में तोड़ दिया जाता है। प्रतिच्छेदन बिंदुओं की एक सूची और संबंधित किनारों की एक सूची DCEL के लिए आवश्यक है।


जैसा कि यह विधि एक मूल समाधान है और दूसरी विधि की तुलना में बेहतर प्रदर्शन देती है जिसमें differenceऑपरेशन का उपयोग किया जा रहा है।
डेवलपर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.