दो बेजियर घटता के चौराहे के लिए विश्वसनीय परीक्षण


9

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

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

अब तक मैंने जो सबसे करीबी चीज़ पाई, वह सेडरबर्ग और मेयर्स द्वारा " बाउंडिंग वेज " है, लेकिन यह "केवल" सबसे अधिक-एक और दो-या-अधिक चौराहे के बीच अंतर करता है, जबकि मैं जानना चाहता हूं कि क्या सबसे-शून्य है और एक या अधिक चौराहों।


Im यकीन है कि यह इस तरह मौजूद नहीं है, वेटहर का निर्धारण या 0-1 या 2 या अधिक के लिए एक संभावना theres बहुत तुच्छ है, लेकिन सूत्रीकरण वास्तव में यह ieasy सुनिश्चित करने के लिए अपने 0 या 1 वास्तव में जाँच के बिना बनाने के लिए नहीं करता है।
पूजा

रनटाइम आवश्यकताएँ क्या है? एक समाधान जो कि बहुत सटीक परिणाम उत्पन्न करने में सक्षम होना चाहिए, दोनों वक्रों को बड़ी संख्या में छोटे सीधे खंडों द्वारा अनुमानित करना और फिर उन्हें एक जोड़ीदार फैशन में अन्तर्विभाजित करना होगा। लेकिन इतना समय और स्मृति खर्च होती है।
ड्रैगनसेल २

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

दिलचस्प समस्या है। मुझे नहीं लगता कि कोई आसान जवाब है, लेकिन मैं गलत होना चाहता हूं। क्या आपके पास सेडरबर्ग और मेयर्स पेपर के लिए लिंक है?
डैनियल एम गेसल

@DanielMGessel हाँ, ऊपर संपादित देखें।
इकिर हाना

जवाबों:


6

समस्या को तैयार करने का एक वैकल्पिक तरीका एक फ़ंक्शन को परिभाषित करना है जो दो घटता पर बिंदुओं के बीच की दूरी को घटता मापदंडों के एक फ़ंक्शन के रूप में परिभाषित करता है। फिर इस फ़ंक्शन के वैश्विक न्यूनतम को खोजने का प्रयास करें। यदि घटता प्रतिच्छेद करता है, तो न्यूनतम शून्य होगा; अन्यथा न्यूनतम कुछ सकारात्मक दूरी होगी।

स्पष्ट होने के लिए, द्वारा परिभाषित 2D वक्रों की एक जोड़ी को देखते दूरी-वर्ग को इस प्रकार परिभाषित करेंc1,c2:[0,1]R2

f(u,v):[0,1]2R0|c2(v)c1(u)|2

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


अगर हम क्यूबिक बेज़ियर्स के बारे में बात कर रहे हैं, तो यह 6 डिग्री बहुपद और 3 जी क्यों नहीं है? और जिन दो तरीकों से आप जुड़े हैं, क्या वे केवल में समाधान खोजने के लिए उत्तरदायी हैं , पूरे विपरीत ? [0,1]2R2
1948 में ईकिर हाना

1
@EcirHana यह 6 वीं डिग्री है क्योंकि यह चुकता दूरी है। (आप इसे वर्गाकार कर सकते हैं, लेकिन तब यह बहुपद नहीं रह जाता है, और यह शून्य में निर्विघ्न हो जाएगा।) ध्यान दें कि पैरामीटर स्पेस है, स्पेस नहीं है जिसमें स्प्लीन रहते हैं, अर्थात ये समापन बिंदुओं के साथ विभाजित करता है। किसी भी स्थिति में, विधियाँ में ठीक काम करेंगी , लेकिन वे प्रारंभिक अनुमान से केवल "डाउनहिल की यात्रा" करते हैं और स्थानीय न्यूनतम पाते हैं; पूरे पैरामीटर क्षेत्र की जांच करने और वैश्विक न्यूनतम खोजने के लिए कुछ और आवश्यक है । पैरामीटर स्थान को सीमित करना संभवतः वहां सहायक होता है। [0,1]R2
नाथन रीड

1
नातान - अच्छा सूत्रीकरण! मैं कठोर हूँ, लेकिन: मुझे लगता है कि आप प्रत्येक बीज़ियर वक्र को अधिकतम 5 सेगमेंट में विभाजित कर सकते हैं, जहाँ वक्र में या दिशा बदलते हैं। , एक फ़ंक्शन के रूप में , सबसे अधिक दो बार दिशा की दिशा बदलता है (व्युत्पन्न की जड़ें) वक्र को 3 खंडों में , जिनमें से 2 को दिशा में परिवर्तन करके फिर से विभाजित किया जा सकता है । अब आपके पास सीधे सेगमेंट नहीं हैं, लेकिन ऐसे सेगमेंट हैं जो "बहुत ज्यादा वक्र नहीं करते हैं"। मुझे लगता है कि यदि आप सेगमेंट जोड़े द्वारा चुने गए 25 बिंदुओं पर अपनी खोज शुरू करते हैं, तो आपको हमेशा वैश्विक मिनीमा मिल सकता है, लेकिन मैं यह नहीं देख सकता कि इसे कैसे साबित किया जाए (या इसे अस्वीकृत करें)। xyxciy
डैनियल एम गेसल

@ नथन: मैंने माना था कि लेकिन, बनावट संपीड़न प्रारूपों में मिनीमा को खोजने के लिए कोड लिखने में बहुत समय लगा, यह सब थोड़ा छुपा हुआ लग रहा था।
साइमन एफ

5

[अस्वीकरण: मुझे लगता है कि निम्नलिखित को काम करना चाहिए लेकिन वास्तव में इसे खुद कोड नहीं किया है]

मैं हां / ना में जवाब देने के "तुच्छ" तरीके के बारे में नहीं सोच सकता था, लेकिन निम्नलिखित प्रश्न के व्यावहारिक समाधान के लिए एक उचित दृष्टिकोण होगा।

मान लेते हैं कि हमारे घटता क्रमशः नियंत्रण बिंदु { A0, A1..An } और { B0, .. Bm } के साथ A (s) और B (t) हैं।

यह मुझे लगता है कि, 2 डी बेज़ियर की एक जोड़ी दी गई है जिसके लिए हम यह निर्धारित करना चाहते हैं कि क्या करना है या नहीं करना है, इस पर विचार करने के लिए छह मामले हैं:

  1. मामला जहां हम "तुच्छ" कर सकते हैं निर्धारित करते हैं कि वे अंतर नहीं करते हैं

  2. मामला जहां वे कई बार परिमित संख्या में अंतर करते हैं और हम "आसानी से" यह निर्धारित कर सकते हैं कि वे निश्चित रूप से कम से कम एक बार प्रतिच्छेद करते हैं (लेकिन हम वास्तव में उन चौराहों की परवाह नहीं करते हैं)

  3. बेज़ियर में से एक पतित है, अर्थात एक बिंदु (जो तब होगा जब सभी नियंत्रण बिंदु समान हों)। हम मान सकते हैं कि हम पहले ही उस मामले को संभाल चुके हैं जहां दोनों बिंदु हैं।

  4. एक या एक से अधिक कर्व्स बंद हैं, जैसे। A0 == एक। जीवन को सरल बनाने के लिए, हम ऐसे वक्रों को तोड़ेंगे और फिर से शुरू करेंगे।

  5. चौराहे के अनंत अंक हैं क्योंकि प्रत्येक "पैरेंट" बेज़ियर का सबसेट है और वे ओवरलैप करते हैं।

  6. हम उपरोक्त मामलों के बारे में निश्चित नहीं हैं और आगे की जांच की आवश्यकता है

फिलहाल हम 3 और 4 को अनदेखा करेंगे, लेकिन बाद में उनके पास वापस आएँगे।

मामला एक

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

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

केस 2

यदि मामला 1 परीक्षण विफल हो जाता है, तो आप एक चौराहे के "तुच्छ" अस्तित्व की जांच कर सकते हैं। अब शायद ऐसा करने के बेहतर तरीके हैं, लेकिन निम्नलिखित, अपेक्षाकृत सस्ते, दृष्टिकोण मेरे लिए हुए:

सिर्फ वक्र A पर विचार करें:

"फैट लाइन" एक बेज़ियर की सीमा

हम पर वक्र शुरू होता है पता , पर समाप्त , और उत्तल पतवार के अंदर झूठ होगा। सादगी के लिए, हम लाइन सेगमेंट की दिशा की गणना करें और दोनों तरफ की सीमा की गणना करें (यानी सीधा नियंत्रण बिंदु के शेष बिंदुओं के डॉट उत्पादों को )।A0AnA0An¯A0An¯

यदि हम वक्र B के साथ भी ऐसा करते हैं तो हमें निम्नलिखित (संभव) मामले मिलते हैं: यहाँ छवि विवरण दर्ज करें

यदि हमें पता चलता और बी के बाहर विपरीत सीमा रहे हैं और कि और एक की सीमा से आउटसाइड पर हैं, तो, Beziers की निरंतरता से, वहाँ कम से कम एक चौराहे होना चाहिए।A0AnB0Bm

केस 6

यदि हम उपरोक्त मामलों में से किसी को भी तुरंत नहीं दिखा सकते हैं, तो प्रत्येक बेज़ियर को दो "हिस्सों" में विभाजित करें, जैसे कि । यह अपेक्षाकृत सीधा है (पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है) लेकिन द्विघात बेज़ियर के लिए विशेष रूप से तुच्छ है :A1,A2,B1,B2

पुनरावर्ती 4 संयोजनों की तुलना करें: । स्पष्ट रूप से यदि सभी पास केस 1, कोई चौराहा नहीं है। यदि कोई भी 1 विफल हो जाता है, तो उस कम हो चुके सबसेट के साथ बाकी परीक्षणों को जारी रखें।(A1,B1),(A2,B1)...(A2,B2)

केस 3 और 5

यह वह जगह है जहाँ यह थोड़ा अधिक थकाऊ हो जाता है।

यदि "केस 3" "केस 1" परीक्षण से पहले हो जाता है, तो मुझे लगता है कि आपको वास्तविक चौराहे के लिए हल करने की आवश्यकता है। यह देखते हुए कि बेजियर, ए (एस) के एन नियंत्रण बिंदुओं को मैप करने के लिए एक सरल प्रक्रिया है, जो बेजियर, ए '(ओं) के एन -1 बिंदुओं के लिए है, इसके 1 व्युत्पत्ति का प्रतिनिधित्व करता है (फिर ध्यान रखा जाता है) अपेक्षाकृत दुर्लभ, तथाकथित "पतित" स्थितियों में जहां 1 व्युत्पन्न शून्य पर होता है), फिर न्यूटन पुनरावृत्ति (एक आयाम पर) का उपयोग संभावित समाधान खोजने के लिए किया जा सकता है।
यह भी ध्यान दें कि, ए 'के नियंत्रण अंक व्युत्पन्न मूल्यों पर एक बाध्य हैं, कुछ मामलों के जल्दी उन्मूलन करने की क्षमता है।

केस 5 अपेक्षाकृत असंभव लगता है, इसलिए शायद तभी जब कुछ पुनरावृत्तियों के बाद कोई निर्णायक सबूत नहीं होता है, कोई भी क और ख के विपरीत ए के प्रत्येक अंतिम बिंदु की कोशिश कर सकता है। यह केवल चौराहे का प्रमाण देगा - गैर-चौराहे का प्रमाण नहीं।


हां, लेकिन व्यक्तिगत रूप से उस मामले में अधिक रुचि रखते हैं, जहां उस मामले के बारे में जहां Bm और / या B0 दोनों A के अधिकतम और न्यूनतम बाउंड की मात्रा के भीतर हैं, लेकिन यह छेद नहीं करता है तो आपको उपविभाजित करने की आवश्यकता है और सबसे खराब स्थिति में चौराहे की गणना करें बिंदु। बेहतर तरीका यह होगा कि न्यूनतम बाउंडिंग बॉक्स का उपयोग मोटी लाइन सन्निकटन के रूप में भी किया जाए।
पूजा

यह देखते हुए कि, प्रत्येक द्विआधारी उपखंड के साथ, वक्र और खंड के बीच का अंतर अंतिम बिंदुओं को जोड़ने वाला उचित कारक द्वारा नीचे चला जाता है (और, मेरे सिर के ऊपर से, मुझे लगता है कि यह क्वाड्रैटिक्स के लिए 4x रहा होगा) निश्चित रूप से सीमाएं जा रही हैं एक "पतली" रिबन को काफी तेजी से परिवर्तित करने के लिए।
सिमोन एफ

हां, लेकिन सबसे खराब स्थिति यह है कि दूसरा बेज़ियर दूसरे पर शुरू होता है।
पूजा

आप का मतलब है, उदाहरण के लिए, An == B0 । क्या आप इसे एक चौराहे के रूप में परिभाषित करते हैं या नहीं?
सिमोन एफ

B0 की तरह कोई और कहीं वक्र पर नहीं है। या यहां तक ​​कि एक न्यूनतम पार
joojaa
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.