कौन से त्रिभुज बिंदुओं में हैं ढूँढना


16

मान लें कि मेरे पास एक 2 डी मेष है जिसमें त्रिकोण , और बिंदुओं का एक सेट । यह निर्धारित करने का सबसे अच्छा तरीका है कि प्रत्येक अंक किस त्रिकोण में निहित है?{टी}=1एन{पीमैं}मैं=1=1एनटी

उदाहरण के लिए, निम्न छवि में हमारे पास , , , तो मैं एक समारोह चाहते हैं कि रिटर्न सूची ।पी1टी2पी2टी4पी3टी2(पी1,पी2,पी3)=[2,4,2]

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

मतलाब में फंक्शन पॉइंटलोकेशन होता है, जो मुझे डेलौने मेशेस के लिए चाहिए होता है, लेकिन यह सामान्य मेश के लिए असफल होता है।

मेरा पहला (गूंगा) विचार है, सभी नोड्स के लिए , सभी त्रिकोणों के माध्यम से लूप यह पता लगाने के लिए कि कौन सा त्रिकोण है। हालांकि, यह बेहद अक्षम है - आपको हर बिंदु के लिए प्रत्येक त्रिकोण के माध्यम से लूप करना पड़ सकता है, इसलिए यह हो सकता है। ले काम करते हैं।पीमैंपीमैंहे(एन)

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

  • इसके लिए एक कुशल निकटतम-पड़ोसी खोज (या एक पुस्तकालय है जो यह है) को लागू करने की आवश्यकता है, जो एक nontrivial कार्य हो सकता है।
  • इसके लिए प्रत्येक नोड से जुड़े त्रिभुजों की एक सूची संग्रहीत करने की आवश्यकता होती है, जो मेरा कोड वर्तमान में सेट नहीं है - अभी अभी नोड निर्देशांक की एक सूची और तत्वों की एक सूची है।

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

धन्यवाद!

जवाबों:


16

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

हे(लॉगएन)हे(लॉगएन)

एडिट 2: इस पीडीएफ को ऐसी "वॉकिंग" स्कीम का वर्णन मिलता है, जिसे समाप्त करने की गारंटी दी जाती है, और अधिक भोली दृष्टिकोणों की समीक्षा की जाती है।

Quadtrees का उपयोग करने का एक अन्य विकल्प एक त्रिभुज पदानुक्रम का उपयोग कर रहा है। ओलिवियर डेविलर्स देखें। बेहतर वृद्धिशील यादृच्छिकता Delaunay त्रिभुज। प्रोक में। 14 वां अन्नू। ACM संगोष्ठी। कंप्यूटर। Geom।, पृष्ठ 106-115, 1998. यह Delaunay triangulations के लिए सबसे अच्छा काम करता है, लेकिन गैर-Delaunay के लिए भी काम कर सकता है।

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


विक्टर - क्या आपको ऐसे किसी भी ओपन-सोर्स कोड के बारे में पता है, जिसका मतलब होता है एज-हॉपिंग अप्रोच? यह मेरे मामले के लिए एक बहुत अच्छा समाधान हो slike यह कुदाल देखो। (कण ट्रैकिंग मॉडल एक ट्रिंगुअल जाल ग्रिड में वर्तमान क्षेत्रों द्वारा संचालित) -थैंक
क्रिस बार्कर

मेरे पास इसके लिए कोड है और मैं इसे आपके पास भेज सकता हूं; यह C / C ++ में है। इसे साफ करने और गीथुब पर अभी तक पोस्ट करने का समय नहीं था। मुझे इसे अपने जीवन में कम से कम दो बार लिखना है, एक बार एक आधा डेटा संरचना के साथ, एक बार फिर से एक चतुर्भुज के साथ, लेकिन यह आसानी से उपयोग किया जा सकता है जब वे उपलब्ध नहीं होते हैं और आपको अपने आप को टोपोलॉजिकल संरचना बनाने की आवश्यकता होती है। मेरी वेबसाइट के लिए मेरा प्रोफाइल पेज देखें, जहाँ आप संपर्क जानकारी पा सकते हैं। हम इस पर आगे ऑफ़लाइन चर्चा कर सकते हैं।
विक्टर लियू

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

2
के बारे में: "" एज होपिंग ओ होना चाहिए (logN) "" "मैं वह नहीं देखता। उदाहरण के लिए, एक बड़ी लंबी त्रिभुज पट्टी (केवल एक चौड़ा चैनल जैसे त्रिकोण चौड़ा) के विकृति विज्ञान के मामले में, सबसे खराब स्थिति पर, आपको एक त्रिकोण से अगले सभी तरह से अंत तक हॉप करना होगा। औसत मामले में, आधा रास्ता। इसलिए यदि आप त्रिभुजों की संख्या को दोगुना करते हैं, तो यह O (N) होगा, त्रिकोण के वर्ग-ईश व्यवस्था के अधिक सामान्य मामले में, मैं O (sqrt (N)) की अपेक्षा करूंगा। या क्या मैं कुछ न कुछ भूल रहा हूं? -क्रिस
क्रिस बार्कर

@ क्रिस - आपका स्वागत है! स्किकॉम्प के हाउसकीपिंग के हिस्से के रूप में, मैंने आपके उत्तरों और आगामी वार्तालाप को विक्टर के उत्तर पर टिप्पणियों के रूप में माइग्रेट किया है। हम साइट पर आपकी भागीदारी के लिए उत्सुक हैं।
एरन अहमदिया

8

मुझे यकीन नहीं है कि आपका समाधान वास्तव में सही है। उस स्थिति पर विचार करें जहां आपके पास ये नोड हैं:

  • एक: (-3, 1)
  • बी: (0, 2)
  • सी: (3, 1)
  • डी: (0, -5)

त्रिकोण एबीसी और एसीडी हैं। अब बी मूल का निकटतम बिंदु है, लेकिन मूल त्रिकोण एसीडी में है, जिसमें बी नहीं है।

हे(एन)

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

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

जब एक बिंदु P दिया जाता है, तो क्वाडट्री की जड़ से पथ पर सभी नोड्स को P से युक्त सबसे छोटे बॉक्स तक ले जाएं। आपको उन नोड्स में सामना करने वाले सभी त्रिकोणों की जांच करने की आवश्यकता होगी। एक 'अच्छी तरह से व्यवहार' त्रिकोणासन के लिए, केवल जैसा कुछ होना चाहिएnnलॉगnहे(एन)


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

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