2008-09-20 15 views
14

मैं दो मनमानी भरे 2 डी ऑब्जेक्ट्स के चौराहे (एक नई भरे ऑब्जेक्ट) की गणना करने के लिए एल्गोरिदम खोजने/बनाने का प्रयास कर रहा हूं। ऑब्जेक्ट्स को लाइन या क्यूबिक बेजियर का उपयोग करके परिभाषित किया जाता है और इसमें छेद या आत्म-अंतर हो सकता है। मैं बहुभुज, listed here के साथ ऐसा करने वाले कई मौजूदा एल्गोरिदम से अवगत हूं। हालांकि, मैं बहुभुज में उन्हें विभाजित किए बिना बेजियर का समर्थन करना चाहता हूं, और आउटपुट में लगभग समान नियंत्रण बिंदु होना चाहिए जहां उन क्षेत्रों में इनपुट है जहां कोई चौराहे नहीं है।बेजियर क्लिपिंग

यह कुछ सीएसजी करने के लिए एक इंटरैक्टिव प्रोग्राम के लिए है लेकिन क्लिपिंग को वास्तविक समय की आवश्यकता नहीं है। मैंने थोड़ी देर के लिए खोज की है लेकिन अच्छे शुरुआती अंक नहीं मिला है।

उत्तर

10

मैं निम्नलिखित प्रकाशन पाया बेज़ियर कतरन के बारे में जानकारी का सबसे अच्छा होना करने के लिए:

टी डब्ल्यू Sederberg, BYU, कंप्यूटर एडेड ज्यामितीय डिजाइन पाठ्यक्रम नोट्स

अध्याय 7 कि वक्र चौराहे बारे में बात करती ऑनलाइन उपलब्ध है। यह छेड़छाड़ खोजने के लिए 4 अलग-अलग दृष्टिकोणों की रूपरेखा तैयार करता है और विस्तार से बेजियर क्लिपिंग का वर्णन करता है:

http://www.tsplines.com/technology/edu/CurveIntersection.pdf

1

बेज़ियर कतरन कर रही पर शैक्षिक शोध पत्र की एक संख्या हैं:

http://www.andrew.cmu.edu/user/sowen/abstracts/Se306.html

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.61.6669

http://www.dm.unibo.it/~casciola/html/research_rr.html

मैं अंतराल तरीकों क्योंकि के रूप में आप का वर्णन सलाह देते हैं, तुम नहीं बहुभुज को विभाजित करना होगा, और आप गारंटीकृत परिणाम प्राप्त कर सकते हैं और साथ ही परिणामों के लिए अपने मनमाना परिशुद्धता को परिभाषित कर सकते हैं। अंतराल प्रतिपादन के बारे में अधिक जानकारी के लिए, आप http://www.sunfishstudio.com

3

का उल्लेख भी कर सकते हैं मैंने लंबे समय से ऐसा करने के लिए कोड लिखा था। प्रोजेक्ट मैं परिभाषित 2 डी ऑब्जेक्ट्स पर काम कर रहा था जो टुकड़े की तरह बेजियर सीमाओं का उपयोग कर पोस्टस्सिप्ट पथ के रूप में उत्पन्न किया गया था।

दृष्टिकोण मैं का इस्तेमाल किया गया था:

Let घटता पी, क्यू, बेज़ियर नियंत्रण बिंदुओं से परिभाषित किया जा। क्या वे छेड़छाड़ करते हैं?

नियंत्रण बिंदुओं के बाध्यकारी बक्से की गणना करें। अगर वे ओवरलैप नहीं करते हैं, तो दो घटता अंतर नहीं करते हैं। अन्यथा:

पी.एक्स (टी), पी.ए. (टी), q.x (u), q.y (u)= टी,= 1.0 पर क्यूबिक बहुपद हैं। दूरी वर्ग (पी.एक्स - q.x) ** 2 + (पी.ई. - q.y) ** 2 एक बहुपद है (टी, यू)। शून्य के लिए कोशिश करने और हल करने के लिए न्यूटन-रैफसन का उपयोग करें।= टी के बाहर किसी भी समाधान को छोड़ दें, टी 0 यू= 1.0

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

यदि एन-आर समाधान पर अभिसरण नहीं करता है, तो एक वक्र (कहें, पी) को दो घटता पी, पीबी में टी = 0.5 में विभाजित करें। यह आसान है, यह सिर्फ मध्यबिंदुओं की गणना कर रहा है, क्योंकि लिंक किए गए आलेख से पता चलता है। फिर घुसपैठ के लिए पुनरावृत्ति परीक्षण (क्यू, पीए) और (क्यू, पीबी)। (ध्यान दें कि पुनरावृत्ति की अगली परत में क्यू पी बन गया है, ताकि पी और क्यू को रिकर्सन के प्रत्येक प्ली पर वैकल्पिक रूप से विभाजित किया जा सके।)

अधिकांश रिकर्सिव कॉल जल्दी से लौटते हैं क्योंकि बाउंडिंग बॉक्स गैर-ओवरलैपिंग होते हैं ।

आपको अजीब मामलों को संभालने के लिए कुछ मनमानी गहराई पर रिकर्सन काटना होगा, जहां दो घटता समानांतर हैं और काफी स्पर्श नहीं करते हैं, लेकिन उनके बीच की दूरी मनमाने ढंग से छोटी है - शायद अंतर का केवल 1 यूएलपी ।

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

6

मुझे पता है कि मुझे अनावश्यक होने का खतरा है, लेकिन मैं एक ही मुद्दे की जांच कर रहा था और एक समाधान मिला जिसे मैंने अकादमिक पत्रों में पढ़ा था लेकिन उसे एक समाधान समाधान नहीं मिला था।

आप इस तरह दो द्वि-variate घन समीकरण का एक सेट के रूप में बेज़ियर घटता पुनर्लेखन कर सकते हैं:

  • Δx = ax₁ * t₁^3 + bx₁ * t₁^2 + cx₁ * t₁ + dx₁ - ax₂ * t₂^3 - bx₂ * t₂^2 - cx₂ * t₂ - dx₂
  • Δy = ay₁ * t₁^3 + by₁ * t₁^2 + cy₁ * t₁ + dy₁ - ay₂ * t₂^3 - by₂ * t₂^2 - cy₂ * t₂ - dy₂

जाहिर है, घटता (t₁, t₂) के मूल्यों के लिए एक दूसरे को काटना जहां Δx = Δy = 0. दुर्भाग्य से, यह इस तथ्य से जटिल है कि मैं टी को दो आयामों में जड़ों को ढूंढना मुश्किल है, और अनुमानित दृष्टिकोण (जैसा कि एक और लेखक इसे डालते हैं) उड़ाते हैं।

लेकिन अगर आप अपने नियंत्रण अंक के लिए पूर्णांक या तर्कसंगत नंबर का उपयोग कर रहे हैं, तो आप Groebner ठिकानों (संभवत:-अप-टू-ऑर्डर-9- में अपने द्वि-variate क्रम -3 बहुआयामी पद के पुनर्लेखन के लिए उपयोग कर सकते हैं इस प्रकार-आपके-नौ-संभावित-चौराहे) monovariate polynomial। इसके बाद आपको केवल एक आयाम में अपनी जड़ें (के लिए, टी₂ कहें) ढूंढनी होंगी, और अन्य आयामों को ढूंढने के लिए अपने परिणामों को अपने मूल समीकरणों में से एक में प्लग करें।

बर्चबर्गर के पास "" ग्रॉबर्नर बेसिस: सिस्टम थियोरिस्ट्स "के लिए एक संक्षिप्त परिचय है जो मेरे लिए बहुत उपयोगी था, जिसे ग्रोबेनर बेसिस के लिए एक आम-मित्रवत परिचय दिया गया है। यह गूगल। अन्य पेपर जो मददगार था, उसे "कहा जाता है जिसे टीएफ हैन द्वारा क्यूबिक बेज़ीर पथ और ऑफसेट वक्र" के तेज, सटीक फ़्लैटनिंग, जिसमें बेजियर वक्र के लिए बहुत सी उपयोगिता समीकरण हैं, जिसमें एक्स और वाई के लिए बहुपद गुणांक कैसे ढूंढें समीकरण।

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

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

यदि आप छेड़छाड़ खोजने के लिए हास्केल में कुछ तैयार कोड चाहते हैं, तो मुझे बताएं।

संबंधित मुद्दे