मैं उत्तल बहुभुज कैसे जोड़ और घटा सकता हूं?


12

मेरे पास दो 2D उत्तल बहुभुज हैं जो एक दूसरे को ओवरलैप कर रहे हैं । मैं उन्हें घटाना और जोड़ने के लिए एक एल्गोरिथ्म की तलाश कर रहा हूं । परिणाम एक एकल अवतल बहुभुज या (और भी बेहतर) होना चाहिए जो अवतल परिणाम (जैसे त्रिकोण) बनाने वाले सबसे बड़े उत्तल लोगों का एक समूह हो।

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

( वाम: प्रारंभिक अतिव्यापी बहुभुज। मध्य: जोड़ने के बाद परिणामी अवतल बहुभुज। सही: उत्तल बहुभुज का एक सेट अवतल परिणाम बनाता है। यहां प्रदर्शन के कारणों से एक त्रिकोण से बड़ा उत्तल बहुभुज प्राप्त करना बेहतर होगा। एक घटाव दो अतिव्यापी बहुभुज बाईं ओर के रूप में एक ही तस्वीर का नेतृत्व करेंगे, लेकिन अतिव्यापी क्षेत्र के परिणामस्वरूप बहुभुज का हिस्सा नहीं होगा।)

मैं यह कैसे कर सकता हूँ?


क्या हम यहां 2D की बात कर रहे हैं? क्योंकि 3 डी संयोजन बहुभुज वास्तव में बहुत मायने नहीं रखते हैं।
कॉन्सेप्ट

हाँ, संतरी, मैं 2D के बारे में बात कर रहा हूँ! हालांकि मैं यह नहीं देखता कि यह 2 डी की तुलना में 3 डी में कम क्यों नहीं है।
सेबस्टियन बर्थ

2
3 डी में दो बहुभुज जोड़ना, अगर वे सपाट हैं, तो इसका कोई मतलब नहीं है जब तक कि वे एक ही विमान में न हों, यदि उनके पास मात्रा (ठोस) है तो यह एक अलग कहानी है।
concept3d

ठीक है, मुझे मिल गया है। मैं ग्राफिक्स के बारे में नहीं सोच रहा था, लेकिन वस्तुओं को टकरा रहा था। स्पष्टीकरण के लिए धन्यवाद।
सेबस्टियन बर्थ

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

जवाबों:


9

टीएल; डीआर आपको बीएसपी पेड़ों का उपयोग करके बूलियन संचालन को लागू करने की आवश्यकता है।

खैर, ऐसा लगता है कि हम यहां कंस्ट्रक्टिव सॉलिड जियोमेट्री की बात कर रहे हैं। मैंने व्यावसायिक स्तर पर CSG को लागू किया है इसलिए मुझे इसके बारे में एक या दो बातें पता हैं।

CSG के बारे में क्लासिक पेपर को मर्जिंग BSP ट्रीज यील्ड्स पॉलीहेड्रल सेट ऑपरेशंस कहा जाता है , ईमानदार होने के लिए यहाँ व्याख्या करना बहुत अधिक है, लेकिन संक्षेप में पॉलीगॉन (ओं) के साथ एल्गोरिथ्म सौदों के बारे में बताया जा रहा है जो एक बाइनरी स्पेस पार्टीशनिंग के रूप में एक ही विमान पर आते हैं, मूल रूप से निर्माण प्रत्येक बहुभुज जाल से एक बसपा का पेड़। दूसरा कदम उन बीएसपी पेड़ों का विलय करना है; आप बस एक पेड़ लेते हैं और इसे दूसरे में डालते हैं। एल्गोरिथ्म फिर यह समझाने के लिए आगे बढ़ता है कि नोड्स को विभाजित करने और स्थानांतरित करने के लिए प्रत्येक पत्ती के नोड से कैसे निपटना है, अंतिम आकृति में जिन नोड्स की आवश्यकता नहीं है, उन्हें हटा दिया जाएगा, अन्य को उपयुक्त माता-पिता दिए जाएंगे।

लेकिन रुकें! वह कागज मूल रूप से बहुभुज और 3 डी विमानों के बारे में बोल रहा है, नहीं?

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

ध्यान दें कि यह एल्गोरिथ्म और CSG सामान्य रूप से रेंडरिंग और मेष चेहरों से सीधे नहीं निपटता है और वास्तव में रेंडरिंग तैयार नहीं करता है, इसलिए आपको अंतिम BSP पेड़ों के चेहरे को निकालने की आवश्यकता होती है। मुझे यह भी पता चलता है कि CSG परिणाम प्रदान करने के लिए किरण एक आसान तरीका है, आपको केवल पेड़ों को निकालने के लिए किरणों की आवश्यकता होती है और वास्तव में चेहरे को विभाजित करना (याद रखें कि हम केवल द्विआधारी विभाजन से निपटते हैं)।

संख्यात्मक मजबूती के बारे में। यह नोट करना अच्छा है कि दो प्रकार के ज्यामितीय अभिकलन हैं,

  • जो निर्माण पर आधारित हैं, आप पिछले ऑपरेशन के परिणाम के आधार पर एक आकार का निर्माण करते हैं। उदाहरण के लिए y = sqrt(x)और फिर yएक नए ऑपरेशन में उपयोग करें । इसे निर्माण कहा जाता है; समस्या यह है कि संख्यात्मक त्रुटियां जल्दी से जमा होंगी।
  • वैकल्पिक रूप से ऐसे ऑपरेशन होते हैं जो इसके बजाय विधेय का उपयोग करते हैं, अनिवार्य रूप से निर्माण का उपयोग करने के बजाय आप बस यह पूछते हैं कि क्या कोई शर्त सही / गलत है और अलग-अलग ऑपरेशन में एक ही मूल्य का उपयोग करें। क्लासिक परीक्षणों में अंतर्वृत्त और अभिविन्यास परीक्षण शामिल हैं; यह संख्यात्मक त्रुटियों के लिए भी संदिग्ध है, खासकर यदि आप एकल या दोहरी परिशुद्धता का उपयोग करते हैं, लेकिन आमतौर पर बहुत बेहतर परिणाम देंगे। अन्य समाधान जो गति और सटीकता पर भिन्न होते हैं। यहाँ हाल ही में एक कागजात है जो सटीक परिणाम देने के लिए एक विमान आधारित ज्यामिति का उपयोग करके निर्माण से बचता है। कागज से भी उद्धृत करूंगा:

पॉलीगोनल मेषों के विमान-आधारित प्रतिनिधित्व की अवधारणा को सबसे पहले सुगिहारा और इरी [SI89] द्वारा वर्णित किया गया था। इस तरह का प्रतिनिधित्व एक महत्वपूर्ण लाभ प्रदान करता है जब यह उन कार्यों के लिए आता है जिसमें बूलियन अभिव्यक्तियों के मूल्यांकन की तरह मेष द्वारा दर्शाए गए ठोस पदार्थों की टोपोलॉजी को बदलना शामिल है: परिणामस्वरूप पॉलीहेड्रॉन प्राप्त करने के लिए कोई नई प्राथमिक ज्यामिति जानकारी का निर्माण नहीं किया जाना है।

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

और अंत में मैं, जोड़ने के लिए यदि आप अपने बसपा CSG कार्यान्वयन मैं से शुरू होने की सिफारिश करेंगे शुरू करना चाहते चाहते हैं बसपा पूछे जाने वाले प्रश्न


कूल, लेकिन काउंटर-सहज ज्ञान युक्त, यह देखते हुए कि उत्तल बहुभुज या पॉलीहेड्रोन का बीएसपी एक सूची है। बढ़िया कागज।
३०:४४ पर ३

@DavidLively हाँ, लेकिन चेहरे के गैर होने के लिए रूट विमान का चयन करके इसे एक संतुलित पेड़ बना सकते हैं। वास्तव में यह उस चुनौती का हिस्सा है जिसके बारे में वे बात नहीं करते हैं
concept3d

आह, यह समझ में आता है। एक संकर बीएसपी की तरह, फिर।
डीएवी

@DavidLively बीएसपी वास्तव में रेंडर करना आसान नहीं है, हालांकि ओपी सवाल एक साधारण मामला है, लाखों पॉलीगोन के ज्यामिति के साथ एक और अधिक जटिल मामले में, एक बार जब आप पेड़ का निर्माण पूरा कर लेते हैं तो आप बहुत दूर हैं।
अवधारणा 3

@ concept3d मुझे आशा है कि यह बहुत कष्टप्रद नहीं होगा क्योंकि यह 5 साल पुराना उत्तर है, लेकिन दो चीजें हैं जो मुझे वास्तव में समझ में नहीं आती हैं: जब यह निर्धारित करने की कोशिश की जा रही है कि क्या एक बिंदु विमान या रेखा के बाईं या दाईं ओर स्थित है? यह आसान नहीं होगा कि पूरी चीज़ को घुमाया जा सके, इसलिए विमान / रेखा एक तुच्छ विमान / रेखा से मेल खाती है, और फिर केवल घुमाए गए बिंदु के निर्देशांक पर विचार करें? बीएसपी पेड़ों के बजाय सदरलैंड-हॉजमैन एल्गोरिथ्म का उपयोग कैसे करें? इस दृष्टिकोण के समान लगता है।
जॉन पी

1

आपके उदाहरण द्वारा जाना:

बहुभुज A पर एक प्रारंभिक शीर्ष चुनें, और फिर किनारों को दक्षिणावर्त (या वामावर्त) के लिए जाँचना शुरू करें। यदि कोई चौराहा नहीं है, तो अपने परिणामित बहुभुज में पिछले शीर्ष को जोड़ें। यदि कोई चौराहा है, तो उस बिंदु को जोड़ें, जिस पर वे आपके परिणामस्वरूप बहुभुज को काटते हैं, और फिर उसी घुमावदार क्रम में बहुभुज बी के ऊपर चलना शुरू करते हैं। एक ही काम करें, यदि एक चौराहा होता है, तो बहुभुज ए पर फिर से स्वैप करना।

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

महत्वपूर्ण: सुनिश्चित करें कि आप जिस शीर्ष पर शुरू करते हैं वह अन्य बहुभुज के अंदर नहीं है ( बहुभुज परीक्षणों में बिंदु के लिए इस लेख की जांच करें )।

प्रत्येक किनारे पर घूमते हुए, एक चौराहे की जांच करने के लिए एक ओ (एन ^ 2) एल्गोरिदम होगा। आप इसे पहले दूसरे पॉलीगॉन के अंदर वाले कोने को ढूंढकर इसे गति दे सकते हैं, क्योंकि उन कोने से जुड़े किनारे एक दूसरे को जोड़ने वाले होंगे।


0

यदि आप एक अवतल बहुभुज चाहते हैं , तो बस दो इनपुट बहुभुजों के बीच निकटतम किनारा चुनें, और दो नए किनारों को जोड़ें:

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

उत्तल थोड़ा और अधिक जटिल हो जाता है:

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

एक दृष्टिकोण इसमें पुनरावृत्त है कि यह दूसरे बहुभुज से पहले की ओर कोने जोड़ता है, एक समय में, पहले बहुभुज को एक कंटेनर में विकसित करता है जो सब कुछ शामिल करता है।

मूल रूप से:

  • दूसरे बहुभुज के कोने से गुजरना।
  • प्रत्येक शीर्ष V के लिए, पहले बहुभुज के किनारों के माध्यम से पुनरावृति करें:
  • किनारों की "रेंज" ढूंढें जो सभी शीर्ष का सामना करते हैं
  • उस श्रेणी को परिभाषित करने वाले बाहरी जोड़े को लें, और उन्हें जोड़ने वाली सीमा में सभी किनारों को हटा दें
  • उन नए शीर्षों से दो नए खंडों को नए शीर्ष (दूसरी बहुभुज से) में खींचना, यह सुनिश्चित करना कि नए किनारे सही दिशा का सामना कर रहे हैं।
  • दूसरी बहुभुज से अगले शीर्ष पर आगे बढ़ें

यहाँ पहले रेखा के लिए प्रक्रिया को दर्शाने वाला आरेख है:

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

एक तेज़ विधि प्रत्येक बहुभुज पर किनारों की सूची ढूंढना है जो अन्य बहुभुज का सामना नहीं करते हैं, बाकी सब को हटा दें, और शेष रेखा स्ट्रिप्स के समापन बिंदुओं को एक दूसरे से कनेक्ट करें।

शायद किसी और को कुछ घटाव सलाह के साथ झंकार कर सकता है।


यह केवल आधी समस्या (जोड़) को संबोधित करता है। यह इंगित करना भी अच्छा हो सकता है कि पॉलीगॉन ओवरलैप होने पर एल्गोरिदम कैसे काम करता है या अनुकूलित किया जा सकता है।

एल्गोरिथ्म में लक्ष्य बहुभुज के "अंदर" होने वाले अव्यवस्थाओं को नजरअंदाज किया जाता है, जो उस मुद्दे के लिए भी क्षतिपूर्ति करता है जहां दूसरे बहुभुज से एक किनारा पहले को पार करता है।
डीवेव

यह मर्ज चरण के लगभग बराबर होता है ( मर्ज हल एल्गोरिथम का बिंदु 4। मेरे मामले में पॉलीगोन के संयोजन के बाद अधिक क्षेत्र को घेरने के लिए यह एक सही समाधान नहीं है। सही समाधान दोनों बहुभुजों को रखना होगा क्योंकि वे तब से हैं जब तक वे नहीं हैं)। t ओवरलैपिंग, न ही छूना।
सेबेस्टियन बर्थ

@luftgewehrindianer आह - हाँ, इससे बहुत फर्क पड़ता है। शायद मैंने इस सवाल को गलत समझा। क्या आप इस बात की परवाह किए बिना कि क्या परिणाम उत्तल या अवतल है, पॉलीगोन को एक साथ जोड़ना चाहते हैं? या चौराहे के आधार पर उत्तल सेट उत्पन्न करते हैं? (इस समय के लिए घटाव को नजरअंदाज करते हुए।)
डीएवी

@DavidLively एक ही रंग के दो उत्तल बहुभुज और सीमा स्टोक के बिना कल्पना करें। जब वे ओवरलैप करते हैं, तो यह एक नए उत्तल या अवतल बहुभुज जैसा दिखता है। वह संयुक्त आकार का एक त्रिकोण खोजने की कोशिश करता है। दोनों बहुभुजों के बीच का क्षेत्र न जोड़ें।
दानियार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.