2010-10-15 21 views
7

पर लाइन क्लिपिंग यदि मुझे एक रेखा खंड मिलता है जो किसी दिए गए बहुभुज को पार करने के लिए काफी लंबा था, जो अवतल या उत्तल बहुभुज हो सकता है। पॉलीगॉन में मौजूद सभी छेड़छाड़ वाले प्रकाश खंडों को मैंने कैसे पाया?अरबी 2 डी पॉलीगॉन

alt text

लक्ष्य क्षेत्र बहुभुज नहीं है, लेकिन एक अंतर्निहित वक्र समारोह या पट्टी की अवस्था है, यह कैसे करना है, तो?

धन्यवाद!

उत्तर

5

वास्तव में आपकी समस्या का एक आसान समाधान नहीं है, खासकर वक्र (बेजियर और स्प्लिंस) के साथ। पॉलीगॉन क्लिपिंग की जटिलताओं के शीर्ष पर, क्लिप किए गए वक्रों के पुनर्निर्माण की काफी चुनौती है (मान लीजिए कि आप क्लिपिंग परिणाम बेजियर और स्प्लिंस के रूप में बने रहें और न केवल 'फ़्लैटेड' लाइन अनुमानों के रूप में बने रहें)।

मैंने हाल ही में अपने पॉलीगॉन क्लिपिंग लाइब्रेरी 'क्लिपर' में एक बीटा अपडेट * जारी किया है जो लाइन-पॉलीगॉन और लाइन-लाइन क्लिपिंग करता है (जहां रेखाएं वक्र भी हो सकती हैं)। हालांकि, मुख्य पुस्तकालय डेल्फी में लिखा गया है, सी ++ & सी #, नया बीटा कोड अब तक डेल्फी में है जो आपकी मदद नहीं कर सकता है। फिर भी यदि आप कोड देखते हैं तो आप देखेंगे कि मैं क्यों कहता हूं कि कोई 'सरल' समाधान नहीं है।

  • संपादित 15 जुला 2011: यह 'अपडेट' इस बीटा रिलीज से परे नहीं मिला है और अब बस 'सबूत अवधारणा-का-' है। यह अब मेरे क्लिपर लाइब्रेरी के पुराने संस्करण पर आधारित है और इसे बनाए रखने योग्य और एक्स्टेंसिबल होने के लिए एक प्रमुख पुनर्लेख की आवश्यकता होगी। (कुछ स्तर पर मैं इसे फिर से मिलना हो सकता है लेकिन मैं वर्तमान में आगे कोर पुस्तकालय में सुधार करने पर आमादा कर रहा हूँ।) फिर भी, यह 'सबूत अवधारणा-का-' डेल्फी कोड here

Clipper demo image

+0

धन्यवाद।वक्र क्लिपिंग के लिए आपने किस विधि का उपयोग किया था? – Buzz

+0

जिस दृष्टिकोण को मैंने लिया था वह प्रारंभ में वक्र (और प्रत्येक फ़्लैटेड सेगमेंट को लेबल करने) को फ़्लैट करने के लिए था क्योंकि क्लिपिंग एल्गोरिदम केवल लाइनों पर काम करता है। एक बार छेड़छाड़ मिलने के बाद लेबल वाले सेगमेंट का उपयोग वक्र उप-सेगमेंट (डी कास्टेलजौ के एल्गोरिदम) की पहचान के लिए किया जाता है। फिर यह मूल वक्र में डी Casteljau के एल्गोरिदम को फिर से लागू करने का मामला है, लेकिन केवल घुमाव के भाग में घुमावदार भाग के लिए। क्या इसका कोई मतलब है? –

+0

हां। सही बात। धन्यवाद! – Buzz

3
  • चरण एक: किसी भी क्रम में सभी चौराहे अंक खोजें। बहुभुज के लिए, आपको लाल लाइन और प्रत्येक सेगमेंट की रेखा के चौराहे को खोजने की आवश्यकता है। बस दो रैखिक समीकरणों की प्रणाली को हल करें। यदि समाधान बहुभुज सेगमेंट सीमा तक सीमित है, तो आप में एक चौराहे है।
  • चरण दो: क्रमशः लाल रेखा पर स्थिति मिली। आप जानते हैं कि पहले और आखिरी बिंदु बाहरी हैं। "कोमलता" प्रत्येक बिंदु के साथ flips - बाहरी-आंतरिक-बाहरी और इतने पर। दो आसन्न बाहरी बिंदुओं के बीच आपके भीतर आंतरिक रेखा खंड (हरा) होता है। संपादित करें: सच नहीं है ... बिंदु # 0 से शुरू करें, सेगमेंट # 0 - # 1 आंतरिक है, अगला बाहरी है, अगला फिर से आंतरिक है और इसी तरह।

यदि क्षेत्र बहुभुज नहीं है, लेकिन कुछ अंतर्निहित कार्य द्वारा दिया जाता है, तो आपको यह पता लगाना होगा कि वह कार्य लाल रेखा के बराबर है (दृष्टिकोण निश्चित रूप से कार्य पर निर्भर करता है)।

+0

हो सकता है कि डाउनलोड किया जा सकता मैं एक जटिल बहुभुज देने की जरूरत है। – Buzz

+0

उन्हें कैसे क्रमबद्ध करें। मुझे लगता है कि इन/आउट रिश्ते को ढूंढना मुश्किल है। चौराहे बिंदु सूची बहुभुज किनारों पर निर्भर करता है। – Buzz

+0

कैसे सॉर्ट करें? सबसे कम निर्देशांक के साथ बिंदु खोजें और उस बिंदु की दूरी से अन्य सभी को क्रमबद्ध करें। – alxx