आसन्न त्रिकोण बनाने के लिए एल्गोरिथ्म


14

मेरे पास एक प्रणाली है जहां आप एक दृश्य में एक नोड रखने के लिए एक बार क्लिक कर सकते हैं। जब आप 3 नोड्स रखते हैं, तो यह एक त्रिकोण बनाता है। जब आप भविष्य के किसी भी नोड को रखते हैं, तो यह उस नोड को 2 निकटतम मौजूदा नोड्स में शामिल करके एक नया त्रिकोण बनाता है।

यह ज्यादातर समय ठीक काम करता है लेकिन बहुत तीव्र कोणों के साथ त्रिकोण के पास उपयोग किए जाने पर त्रुटिपूर्ण है, क्योंकि 2 निकटतम नोड्स में से एक अक्सर ऐसा नहीं होता है जिसका उपयोग किया जाना चाहिए।

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

वास्तविक और वांछित व्यवहार का उदाहरण

नए त्रिभुज बनाते समय मैं यह कैसे निर्धारित कर सकता हूं कि कौन से 2 मौजूदा वर्तन का उपयोग करना है ताकि त्रिकोण इस तरह से तैयार न हो?

संपादित करें : निकटतम किनारे की खोज बेहतर परिणाम देती है , लेकिन पूर्ण नहीं। इस स्थिति पर विचार करें:

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

'निकटतम किनारा' परीक्षण अस्पष्ट है, और एबी या एसी (दोनों के लिए एक्स के निकटतम बिंदु के रूप में ए पर है) वापस कर सकते हैं। वांछित परिणाम एसी होगा, एसीएक्स त्रिकोण बनाने के लिए जिसमें कोई किनारा ओवरलैपिंग नहीं होगा। मैं यह कैसे सुनिश्चित कर सकता हूं? (यदि मुझे संभव नहीं है कि टाई-ब्रेकर के रूप में व्यक्तिगत बढ़त ओवरलैप परीक्षण करना है, तो संभव है कि मैं चिंतित हूं कि निकटतम किनारे परीक्षण जरूरी नहीं होगा कि 2 बिल्कुल समान हैं, फ्लोटिंग पॉइंट सटीक मुद्दों को देखते हुए।)


क्या यह अच्छा नहीं है कि आखिरी 5 छोरों को देखा जाए और दोनों को नए लगाए गए शीर्ष के सबसे करीब का चयन करें? मैं आपको त्रिभुज स्ट्रिप्स ( codercorner.com/Strips.htm ) के लिए एल्गोरिदम की ओर इंगित करता हूं, लेकिन वे अक्सर अंतिम दो या अंतिम तीन लंघन का उपयोग करते हैं।
रॉय टी।

1
क्या हरे रंग का त्रिकोण मैजेंटा को ओवरलैप कर रहा है? इसका लक्ष्य क्या है? क्या उपयोगकर्ता को इस बात पर नियंत्रण की आवश्यकता है कि कहाँ और कैसे त्रिभुज बनाए जाते हैं या बिंदु-बादल का त्रिभुज स्वीकार्य होगा?
बंमज़ैक

इसे ग्राफ़ के संदर्भ में रखने के लिए, अनिवार्य रूप से आप अपने नोड्स को कनेक्ट करना चाहते हैं, बिना किसी किनारे के ओवरलैपिंग के? (मैजेंटा / हरी त्रिकोण मान लिया जाये कि एक बढ़त का हिस्सा होगा)
MichaelHouse

रॉय टी: नहीं - सिर्फ 2 निकटतम चुनना गलत है, जैसा कि मैंने सोचा था कि उदाहरण दिखाता है। कुछ स्पष्ट नहीं है? बुमज़ैक - हरे रंग की मेजेंटा के साथ ओवरलैप नहीं होता है। लक्ष्य इन त्रिकोणों का एक जाल या ग्राफ बनाना है। उपयोगकर्ता को नियंत्रण की आवश्यकता है, हाँ। बाइट 56 - हां, कोई किनारा पार नहीं करना चाहिए।
काइलोटन

2
क्या उपयोगकर्ता वास्तव में व्यक्तिगत त्रिकोण देखेंगे? या यह एक निरंतर सतह होने जा रहा है?
बुमज़ैक

जवाबों:


11

नोड्स के लिए न्यूनतम दूरी खोजने के बजाय, किनारे से न्यूनतम दूरी (यानी नोड्स द्वारा परिभाषित लाइन खंड) ढूंढें ।

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

MinAngle(newPoint, vertex, edge1, edge2)
{
   newEdgeUnit = norm(newPoint - vertex); // don't actually need to normalize this
   edge1Unit = norm(edge1 - vertex);      // you probably have these from your dist to line tests
   edge2Unit = norm(edge2 - vertex);

   edge1Dot = dot(edge1Unit, newEdgeUnit);
   edge2Dot = dot(edge2Unit, newEdgeUnit);

   // you can simply compare dot products to find the minimum absolute angle
   if (edge1Dot > edge2Dot) return edge1;     // set up this way so you can generalize to an array
   return edge2;
}

** पतित त्रिकोणों को जोड़ने से बचने के लिए, जो एप्सिलॉन परीक्षण को बाधित कर सकता है, आप प्रत्येक शीर्ष के चारों ओर एक क्षेत्र डालना चाह सकते हैं, जहां अंक जोड़ना बंद है, (ऊपर इस्तेमाल किए गए एप्सिलॉन के कुछ गुणकों के भीतर कुछ बिंदुओं को अस्वीकार करने जैसा)।


3
+1 - यह IMHO दूसरों की तुलना में बहुत अधिक सीधा उत्तर है, और सही परिणाम प्रदान करने की अधिक संभावना है। दूरी-सेगमेंट को एक स्मार्ट योजना के साथ, गणना करना आसान है।
स्टीवन स्टैडनिक

सहमत, यह एक क्लीनर विधि है। शायद मैं क्या करता है, तो मैं और अधिक इसके बारे में सोचा था पर आ चुके हैं जाएगा: /
MichaelHouse

आह, इतने करीब! लेकिन, जैसा कि बाइटे 56 के जवाब और जिमी के आरेख के साथ, कभी-कभी 2 समकालिक किनारों होते हैं, और उनमें से एक बाधा का उल्लंघन करता है। मैंने अपना प्रश्न अपडेट कर दिया है।
काइलोटन

@ कियलोतन शायद उस मामले में, बस एक ओवरलैप की जाँच कर रहा है और दूसरा विकल्प क्या करेगा? आपके द्वारा चुने गए किनारे को साझा करने वाले त्रिकोण के लिए देखें, और जांचें कि क्या आपका नया त्रिकोण मौजूदा किनारे के समान किनारे पर है।
केविन रीड

@ किलोटन क्या आप सुनिश्चित करते हैं कि आपके त्रिकोण हमेशा एक ही घुमावदार होते हैं? यदि हाँ, तो आप उस किनारे को नियंत्रित कर सकते हैं, जो आपके नए शीर्ष (डॉट-उत्पाद का उपयोग करके) से दूर एक सामान्य इंगित करता है।
बंमज़ैक

6

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

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

यदि आपके शीर्ष से किनारे के केंद्र तक की रेखा अन्य दो किनारों में से किसी को पार नहीं करती है , तो आपके पास अपना साझा किनारा है। साझा किनारा आपको बताएगा कि आपके नए शीर्ष को जोड़ने के लिए कौन से दो कोने हैं।

जिमी ने एक ऐसे बिंदु के लिए मामला लाया जो अस्पष्ट है कि नया त्रिकोण इस तरह से कहां जाएगा:

अस्पष्ट त्रिभुज

इससे आपको दो वैध त्रिकोणों के बीच चयन करने का अवसर मिलेगा। शायद टाई ब्रेकिंग जो कि केंद्र बिंदु है निकटतम है।

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

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


ऐसी स्थिति होना संभव है, जहां दो पंक्तियों को किनारों के साथ नहीं लगाया जाता है (जब एक्स किनारे से एक शीर्ष के करीब होता है)
जिमी

@ जिमी क्या आप ऐसी स्थिति की छवि बना सकते हैं?
MichaelHouse


आह हाँ, तो आपके पास दो विकल्प हैं कि त्रिकोण कहाँ रखा जाए! दोनों तरफ काम होगा। शायद आप उस ब्रेक के साथ टाई कर सकते हैं जिसकी केंद्र की दूरी सबसे कम है।
MichaelHouse

@ Kylotan क्या यह समाधान काम नहीं करता है? आपने जेफ की एक टिप्पणी में उल्लेख किया है कि जिमी की छवि में दो मामले हैं और एक बाधा का उल्लंघन करता है, लेकिन यह सच नहीं है। जिमी की छवि में दोनों मामले मेरे तरीके का उपयोग करके वैध त्रिकोण उत्पन्न करेंगे।
MichaelHouse

1

अपने मैजेंटा त्रिकोण एबीसी होने के बाद, आप फिर एक नया वर्टेक्स एक्स को शामिल करते हैं। मुझे लगता है कि यह स्पष्ट है कि डी पर शुरू होने वाली दो लाइनें होंगी जो त्रिकोण एबीसी के किसी भी किनारों के बीच अंतर नहीं करेगी।

ये दो रेखाएँ AX & BX, BX और CX या AX & CX हो सकती हैं। तब आप अपनी समस्या को "दो पंक्तियों को प्रतिच्छेदन" की शास्त्रीय समस्या के रूप में मान सकते हैं? फिर आप जाँच सकते हैं कि निम्न में से कौन सी जोड़ी किसी भी एबीसी त्रिकोण किनारों के साथ प्रतिच्छेद नहीं करती है, उदाहरण के लिए, इस प्रश्न के किसी भी तरीके के लिए । इसलिए, आपके पास नए त्रिभुज के दो नए किनारे होंगे।


यह अच्छा लगता है, लेकिन जिस तरह से आपने कहा है कि यह लगता है कि केवल एक मौजूदा त्रिकोण है। यह कई लोगों के लिए सामान्य कैसे होगा?
काइलोटन

हम ... अगर आपका एक्स और आपका त्रिकोण एबीसी तय हो गया है, तो मुझे लगता है कि केवल एक ही है, है न?
दान

सिस्टम 2 के बाद प्रत्येक नोड के लिए एक नया त्रिकोण बनाता है।
काइलोटन

क्षमा करें, मैंने आपके प्रश्न को गलत समझा। मुझे देखने दो कि मैं इसे कई त्रिकोणों तक कैसे बढ़ा सकता हूं।
डैन

ठीक है, मुझे लगता है कि आप एक्स के लिए दो निकटतम कोने खोज सकते हैं जो एक्स से जुड़े होने पर किसी भी किनारे को पार नहीं करते हैं?
बम्मुजैक

1

यह पता लगाना कि यदि आप असंदिग्ध क्षेत्रों (1, 2, 3 नीचे) में से एक में हैं, तो यह काफी आसान है: अपने त्रिकोण के प्रत्येक किनारे को 2 डी प्लेन के रूप में समझें और परीक्षण करें कि आपके नए बिंदु पर विमान किस तरफ है। यदि आप उनमें से दो के अंदर हैं लेकिन एक के बाहर हैं, तो वह त्रिकोण के किनारे से मेल खाती है जो आपके नए त्रिकोण में दो कोने का योगदान देता है।

एक त्रिकोण के वोरोनोई क्षेत्र

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

ध्यान दें कि 2 डी में एक विमान परीक्षण उसी तरह से काम करता है जैसे कि 3 डी में: प्लेन के सामान्य बिंदु (2 डी में, यह लाइन का लंबवत है) के साथ प्लेन पर कहीं से भी एक वेक्टर है।

(संयोग से, इस छवि में मैजंटा-सीमांकित क्षेत्रों को वोरोनोई क्षेत्र कहा जाता है; वे अंतरिक्ष के क्षेत्र हैं, जो ऐसे बिंदु हैं जो त्रिकोण के किसी विशेष विशेषता-किनारे या शीर्ष के निकटतम हैं। संपादित करें: मेरी शब्दावली यहां वास्तव में नहीं है। बिल्कुल सही, ये बिल्कुल वोरोनोई क्षेत्र नहीं हैं।)


यह मेरे लिए तुरंत स्पष्ट नहीं है कि यह दृश्य में कई त्रिकोणों के लिए कैसे सामान्य है - खासकर अगर निकटतम विशेषता एक शीर्ष है जिसे 1 से अधिक त्रिकोण द्वारा साझा किया जा सकता है।
कियलोतन

@ कियलोतन बस सभी त्रिकोणों के लिए एल्गोरिथ्म चलाते हैं, और समग्र निकटतम सुविधा को चुनते हैं। आपको कुछ टाई-ब्रेकिंग लॉजिक की जरूरत है, इससे कोई फर्क नहीं पड़ता। यदि आप निकटतम विशेषता साझा करने वाले शीर्ष के साथ समाप्त होते हैं, तो आपको केवल एक त्रिभुज के लिए किनारे-क्षेत्र (# 1, # 2, # 3) में होना चाहिए , ताकि शायद आप उसे चुन सकें?
जॉन कलसेबेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.