यह एक बहुत अच्छा सवाल है। मैंने कुछ समय पहले सी # पर एक ही एल्गोरिदम लागू किया था। एल्गोरिथ्म दो बहुभुजों का एक सामान्य समोच्च बनाता है (यानी छेद के बिना एक संघ का निर्माण करता है)। यही पर है।
चरण 1. पॉलीगनों का वर्णन करने वाला ग्राफ़ बनाएं।
इनपुट: पहला बहुभुज (n अंक), दूसरा बहुभुज (m अंक)। आउटपुट: ग्राफ। वर्टेक्स - चौराहे के बिंदु का बहुभुज बिंदु।
हमें चौराहों को ढूंढना चाहिए। दोनों बहुभुज [O (n * m)] में सभी बहुभुज पक्षों के माध्यम से प्रवेश करें और किसी भी चौराहों को ढूंढें।
यदि एक चौराहा नहीं मिला है, तो बस कोने जोड़ें और उन्हें किनारे से कनेक्ट करें।
यदि कोई चौराहे पाए जाते हैं, तो उन्हें उनके प्रारंभ बिंदु तक लंबाई के आधार पर क्रमबद्ध करें, सभी शीर्षों (प्रारंभ, अंत और चौराहों) को जोड़ें और उन्हें (पहले से क्रमबद्ध क्रम में) किनारे से कनेक्ट करें।
चरण 2. निर्मित ग्राफ की जाँच करें
यदि ग्राफ़ बनाते समय हमें कोई प्रतिच्छेदन बिंदु नहीं मिला, तो हमारे पास निम्नलिखित में से एक स्थिति है:
- पॉलीगोन 1 में पॉलीगॉन 2 - रिटर्न पॉलीगॉन 1 होता है
- पॉलीगोन 2 में पॉलीगोन 1 - रिटर्न पॉलीगॉन 2 शामिल हैं
- बहुभुज 1 और बहुभुज 2 प्रतिच्छेद नहीं करते हैं। बहुभुज 1 और बहुभुज 2 लौटाएँ।
चरण 3. बाईं-बाईं ओर शीर्ष ढूंढें।
न्यूनतम x और y निर्देशांक (मिनएक्स, मिनी) का पता लगाएं। फिर (न्यूनतम, मिनी) और बहुभुज के बिंदुओं के बीच न्यूनतम दूरी का पता लगाएं। यह पॉइंट लेफ्ट-बॉटम पॉइंट होगा।
चरण 4. आम समोच्च का निर्माण।
हम बाएं-निचले बिंदु से ग्राफ को पीछे हटाना शुरू करते हैं और तब तक जारी रखते हैं जब तक हम उसमें वापस नहीं आ जाते। शुरुआत में हम सभी किनारों को अप्रकाशित के रूप में चिह्नित करते हैं। प्रत्येक पुनरावृत्ति पर आपको अगले बिंदु का चयन करना चाहिए और इसे चिह्नित के रूप में चिह्नित करना चाहिए।
अगला बिंदु चुनने के लिए, काउंटर-क्लॉकवाइज दिशा में अधिकतम आंतरिक कोण के साथ एक किनारे चुनें।
मैं दो वैक्टरों की गणना करता हूं: वर्तमान बढ़त के लिए वेक्टर 1 और प्रत्येक अगले अनिर्धारित किनारे के लिए वेक्टर 2 (जैसा कि चित्र में प्रस्तुत किया गया है)।
वैक्टर के लिए मैं गणना करता हूं:
- स्केलर उत्पाद (डॉट उत्पाद)। यह वैक्टर के बीच के कोण से संबंधित मान लौटाता है।
- वेक्टर उत्पाद (क्रॉस उत्पाद)। यह एक नया वेक्टर लौटाता है। यदि इस वेक्टर का z- समन्वय सकारात्मक है, तो स्केलर उत्पाद मुझे काउंटर-क्लॉकवाइज दिशा में सही कोण देता है। एल्स (z- समन्वय नकारात्मक है), मैं वैक्टर के बीच कोण को 360 के रूप में गणना करता हूं - स्केलर उत्पाद से कोण।
परिणामस्वरूप मुझे अधिकतम कोण के साथ एक किनारे (और एक अगला अगला शीर्ष) मिलता है।
मैं परिणाम सूची में प्रत्येक उत्तीर्ण शीर्ष को जोड़ता हूं। परिणाम सूची संघ बहुभुज है।
टिप्पणियों
- यह एल्गोरिथ्म हमें बहुभुज के कई विलय करने की अनुमति देता है - बहुभुज के जोड़े के साथ चलने के लिए।
- यदि आपके पास एक पथ है जिसमें कई बीज़ियर वक्र और रेखाएँ हैं, तो आपको पहले इस पथ को समतल करना चाहिए।