2010-09-30 16 views
5

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

बेसिक उत्तल मामलों में हमेशा 2 उप-बहुभुजों में परिणाम आसान होते हैं, लेकिन मैं एक जटिल अवतल आकार से कैसे निपटूं? उदाहरण के लिए "ई" आकार बहुभुज लें। एक लंबवत टुकड़ा 4 बहुभुज पैदा कर सकता है। मैं यह निर्धारित कैसे कर सकता हूं कि कौन से शिखर उन उप-बहुभुजों में से प्रत्येक को बनाते हैं?

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

छद्म कोड या यहां तक ​​कि सामान्य सलाह भी अच्छी है; एक सी # कार्यान्वयन आदर्श है।

+1

क्या यह कोई मदद है? http://stackoverflow.com/questions/1775457/generate-new-polygons-from-a-cut-polygon-2d – fredley

उत्तर

2

कुछ समय पहले मैंने this answer को कुछ अलग प्रश्नों के लिए दिया था।

वह उत्तर उस आकार की त्रिकोणीय अपघटन के कारण, आकार की रूपरेखा स्थापित करने का एक तरीका प्रदान करता है।

मूल विचार निर्देशित वैक्टर के रूप में सभी त्रिकोणों के किनारों पर विचार करना है, और उसके बाद बराबर लेकिन विपरीत किनारों को रद्द करना है।

आपके मामले में, आपके पास मूल आकार का प्रतिनिधित्व करने वाले त्रिकोणों का एक गुच्छा होगा। आप लाइन के साथ व्यक्तिगत त्रिकोण टुकड़ा करेंगे। इसके बाद आप उपरोक्त विधिवत विधि का उपयोग करके त्रिकोणों को आकार में रेखांकित करेंगे, साबित करने के साथ कि किनारों वाले किनारों को रद्द नहीं किया जाएगा।

ऊपर उल्लिखित उत्तर में विवरण और चित्र हैं। लेकिन संक्षेप में प्रस्तुत करने के लिए कदम होगा

  1. त्रिकोण प्रदर्शन विभाजन

  2. प्रत्येक परिणामस्वरूप त्रिकोण के लिए, एक सेट करने के लिए तीन निर्देशित किनारों जोड़ें। घड़ी के अनुसार आदेश निर्धारित करने के लिए, the the answers to this question देखें।

  3. किनारे के माध्यम से जाओ किनारों की जोड़ी है कि बराबर लेकिन विपरीत (जब तक कि वे टुकड़ा किनारों हैं)

  4. सेट में बढ़त लेने हैं को दूर करने के लिए सेट है, तो बढ़त जिसका पूंछ के सिर मिलान प्राप्त पहला किनारा फिर उस किनारे के लिए दोहराएं, जब तक कि आप शुरुआत किनारे तक नहीं पहुंच जाते। जब आप इसे प्राप्त करते हैं तो किनारे सेट से प्रत्येक किनारे को हटा दें। जब भी आप शुरुआती किनारे पर जाते हैं तो आपके पास पॉलीगॉन के परिणामस्वरूप एक बंद लूप होता है।

  5. कोई चरण नहीं छोड़े जाने तक चरण 4 करें।

यह सब आपके बहुभुज के त्रिभुज से शुरू करने की आपकी इच्छा को समायोजित करता है। लेकिन जैसा कि आपके मूल प्रश्न के टिप्पणीकर्ताओं में से एक ने बताया है, आप Generate new polygons from a cut polygon (2D) पर दिए गए विकल्पों पर विचार करना चाहेंगे।

+0

अच्छा दृष्टिकोण। हालांकि मैं इसे लागू करने के बारे में अभी भी कुछ खो गया हूं। क्या आप कुछ विनिर्देश प्रदान कर सकते हैं? लूप तर्क कैसे चलाएगा? 1) यादृच्छिक त्रिकोण ए और बी लें 2) बी के साथ ए के प्रत्येक पक्ष से मेल करें 3) यदि कोई पक्ष ए + कोई पक्ष बी = शून्य, पक्ष को हटा दें? लेकिन जब हम पियोन से निपट रहे हैं तो मैं एक तरफ कैसे हटा सकता हूं? 4) अब मेरे पास एक वर्ग सी है। क्या अब मैं यादृच्छिक त्रिकोण डी के साथ वर्ग सी के संघ को ले कर फिर से लूप करता हूं? और फिर मैं दूसरे उप-बहुभुज पर कैसे स्थानांतरित करूं? – Liquid

+0

@ तरल, लूप तर्क से आपका क्या मतलब है? – brainjam

+0

मुझे वास्तव में एक लूप लिखना है जो मेरी सरणी में प्रत्येक त्रिकोण के माध्यम से चलता है और आपके द्वारा सुझाए गए सभी तुलना करता है। मुझे अंततः एकल त्रिभुज सरणी को टुकड़ा करने के बाद कई बहुभुज परिणामस्वरूप विभाजित करने की आवश्यकता है। – Liquid

5

मेरे पास मेरी लाइब्रेरी PolyK में यह एल्गोरिदम है। यहां the demo है। यदि आप जावास्क्रिप्ट को समझते हैं, तो मुझे यकीन है कि इसे अपनी प्रोग्रामिंग भाषा में फिर से लिखना आसान होगा।