मैं 2-आयामी निरंतर डेटा के लिए विज़ुअलाइजेशन प्रोजेक्ट पर काम कर रहा हूं। यह एक ऐसी चीज है जिसका उपयोग आप 2 डी मानचित्र पर ऊंचाई डेटा या तापमान पैटर्न का अध्ययन करने के लिए कर सकते हैं। इसके मूल में, यह वास्तव में दो-आयामों-प्लस-रंग में 3-आयामों को फ़्लैट करने का एक तरीका है। अध्ययन के अपने विशेष क्षेत्र में, मैं वास्तव में भौगोलिक ऊंचाई डेटा के साथ काम नहीं कर रहा हूं, लेकिन यह एक अच्छा रूपक है, इसलिए मैं इस पोस्ट में इसके साथ रहूंगा।एक भौगोलिक मानचित्र चित्रण
ढाल मानक रंग पहिया, जहां लाल पिक्सल के साथ निर्देशांक संकेत मिलता है:
किसी भी तरह, इस बिंदु पर, मैं एक "सतत रंग" रेंडरर है कि मैं के साथ बहुत खुश हूँ है उच्च मूल्य, और बैंगनी पिक्सेल कम मान इंगित करता है।
अंतर्निहित डेटा संरचना मानचित्र के विवरण में मनमाने ढंग से गहरी ज़ूमिंग सक्षम करने के लिए कुछ बहुत चालाक (यदि मैं खुद ऐसा कहता हूं) इंटरपोलेशन एल्गोरिदम का उपयोग करता है।
इस बिंदु पर, मैं कुछ भौगोलिक समोच्च रेखाएं (क्वाड्रैटिक बेजियर वक्र का उपयोग करके) आकर्षित करना चाहता हूं, लेकिन मैं उन घटता को खोजने के लिए कुशल एल्गोरिदम का वर्णन करने वाला कोई भी अच्छा साहित्य नहीं ढूंढ पाया।
आप मैं क्या सोच रहा हूँ के लिए एक विचार देने के लिए, यहाँ एक गरीब आदमी के कार्यान्वयन है (जहां रेंडरर सिर्फ एक काला आरजीबी मान का उपयोग करता जब भी यह एक पिक्सेल है कि एक समोच्च रेखा काटती है मुठभेड़ों):
वहाँ इस दृष्टिकोण के साथ कई समस्याएं हैं, हालांकि इस प्रकार हैं:
पतली (और अक्सर टूट) टोपो लाइनों में बाद एक बड़े ढलान परिणाम के साथ ग्राफ के क्षेत्र। आदर्श रूप में, सभी टॉपो लाइनों को निरंतर होना चाहिए।
चापलूसी ढलान वाले ग्राफ के क्षेत्र व्यापक शीर्ष रेखाओं (और अक्सर काले रंग के पूरे क्षेत्र, विशेष रूप से प्रतिपादन क्षेत्र के बाहरी परिधि में) के परिणामस्वरूप होते हैं।
तो मैं उन अच्छे, सही 1-पिक्सेल-मोटी घटता प्राप्त करने के लिए वेक्टर-ड्राइंग दृष्टिकोण देख रहा हूं। एल्गोरिथ्म के बुनियादी ढांचे को इन चरणों का शामिल करना होगा:
प्रत्येक असतत ऊंचाई पर जहां मैं एक टोपो रेखा खींचना निर्देशांक जहां कि कम से ऊंचाई समन्वय का एक सेट लगाना चाहते हैं बेहद करीब है (दिए गए एक मनमानी ईपीएसलॉन मूल्य) वांछित ऊंचाई पर।
अनावश्यक बिंदुओं को हटा दें। उदाहरण के लिए, यदि तीन बिंदु पूरी तरह से सीधी रेखा में हैं, तो केंद्र बिंदु अनावश्यक है, क्योंकि इसे वक्र के आकार को बदलने के बिना समाप्त किया जा सकता है। इसी तरह, बेजियर वक्र के साथ, आसन्न नियंत्रण बिंदुओं की स्थिति को समायोजित करके अक्सर केटेन एंकर पॉइंट को खत्म करना संभव होता है।
शेष बिंदुओं को एक अनुक्रम में इकट्ठा करें, जैसे कि दो बिंदुओं के बीच प्रत्येक सेगमेंट ऊंचाई-तटस्थ प्रक्षेपवक्र का अनुमान लगाता है, और ऐसा कोई भी दो रेखा खंड कभी पथ पार नहीं करता है। प्रत्येक बिंदु अनुक्रम को या तो एक बंद बहुभुज बनाना चाहिए, या प्रतिपादन क्षेत्र के बाध्यकारी बॉक्स को छेड़छाड़ करना चाहिए।
प्रत्येक चरम के लिए, नियंत्रण बिंदुओं की एक जोड़ी खोजें जैसे परिणामस्वरूप वक्र चरण # 2 में समाप्त अनावश्यक बिंदुओं के संबंध में न्यूनतम त्रुटि प्रदर्शित करता है।
सुनिश्चित करें कि वर्तमान प्रतिपादन पैमाने पर दिखाई देने वाली स्थलाकृति की सभी विशेषताएं उपयुक्त टॉपो लाइनों द्वारा प्रदर्शित की जाती हैं। उदाहरण के लिए, यदि डेटा में उच्च ऊंचाई वाले स्पाइक होते हैं, लेकिन बेहद छोटे व्यास के साथ, टॉपो लाइनों को अभी भी खींचा जाना चाहिए। लंबवत विशेषताओं को केवल अनदेखा किया जाना चाहिए यदि उनकी सुविधा व्यास छवि की समग्र प्रतिपादन ग्रैन्युलरिटी से छोटी है।
लेकिन फिर भी उन सीमा के अन्दर, मैं अभी भी लाइनों को खोजने के लिए कई अलग अलग heuristics के बारे में सोच सकते हैं:
प्रतिपादन बाउंडिंग बॉक्स के भीतर उच्च बिंदु का पता लगाएं। उस उच्च बिंदु से, कई अलग-अलग ट्रैजेक्टोरियों के साथ डाउनहिल यात्रा करें। किसी भी समय ट्रैवर्सल लाइन ऊंचाई ऊंचाई को पार करती है, उस बिंदु को ऊंचाई-विशिष्ट बाल्टी में जोड़ें। जब ट्रैवर्सल पथ स्थानीय न्यूनतम तक पहुंचता है, पाठ्यक्रम बदलता है और चढ़ाई करता है।
प्रतिपादन क्षेत्र के आयताकार सीमा-बॉक्स के साथ एक उच्च-रिज़ॉल्यूशन ट्रैवर्सल करें। प्रत्येक ऊंचाई सीमा पर (और घुमावदार बिंदुओं पर, जहां भी ढलान दिशा को उलट देता है), उन बिंदुओं को ऊंचाई-विशिष्ट बाल्टी में जोड़ें। सीमा पार करने के बाद, उन बाल्टीओं में सीमा बिंदुओं से अंदर की ओर ट्रेसिंग शुरू करें।
पूरे प्रतिपादन क्षेत्र को स्कैन करें, एक दुर्लभ नियमित अंतराल पर ऊंचाई माप लेना। प्रत्येक माप के लिए, यह तय करने के लिए एक तंत्र के रूप में एक ऊंचाई सीमा के लिए इसकी निकटता का उपयोग करें कि अपने पड़ोसियों के एक अंतरित माप को लेना है या नहीं। इस तकनीक का उपयोग करते हुए पूरे प्रतिपादन पूरे क्षेत्र में कवरेज की बेहतर गारंटी प्रदान होगा, लेकिन यह पथ के निर्माण के लिए एक समझदार क्रम में परिणामी अंक इकट्ठा करने के लिए मुश्किल होगा।
तो, उन मेरे विचारों में से कुछ हैं ...
एक कार्यान्वयन में गहरी डाइविंग से पहले, मैं चाहे StackOverflow पर किसी और को इस समस्या की इस तरह के साथ अनुभव है देखना चाहता था और के लिए संकेत प्रदान कर सकता है एक सटीक और कुशल कार्यान्वयन।
संपादित करें:
मैं विशेष रूप से ellisbben द्वारा किए गए "ढाल" सुझाव में दिलचस्पी रखता हूँ। और मेरे कोर डेटा संरचना (अनुकूलन के प्रक्षेप से कुछ शॉर्टकट अनदेखी) 2D गाऊसी कार्यों का एक सेट है, जो पूरी तरह से विभेदक है के संकलन के रूप में प्रतिनिधित्व किया जा सकता है।
मुझे लगता है मैं एक तीन आयामी ढाल, और मनमाने ढंग से बिंदु पर के लिए कि ढलान वेक्टर की गणना के लिए एक समारोह का प्रतिनिधित्व करने के लिए एक डेटा संरचना की आवश्यकता होगी लगता है। मेरे सिर के ऊपर से, मुझे लगता है कि कैसे करना है (हालांकि यह है कि यह आसान होना चाहिए लगता है) पता नहीं है, लेकिन यदि आप गणित समझा एक कड़ी है, मैं बहुत आभारी होगी!
अद्यतन:
ellisbben और अजीम द्वारा उत्कृष्ट योगदान के लिए धन्यवाद, मैं अब क्षेत्र में किसी भी मनमाना बिंदु के लिए समोच्च कोण की गणना कर सकते हैं। ड्राइंग असली टोपो लाइनों शीघ्र ही पालन करेंगे!
यहां गेटो रास्टर-आधारित टॉपो-रेंडरर के साथ और बिना उपयोग किए गए प्रस्तुतिकरण अपडेट किए गए हैं। प्रत्येक छवि में एक हजार यादृच्छिक नमूना बिंदु शामिल होते हैं, जो लाल बिंदुओं द्वारा दर्शाए जाते हैं। उस बिंदु पर कोण का समोच्च एक सफेद रेखा द्वारा दर्शाया जाता है। कुछ मामलों में, दिए गए बिंदु (इंटरपोलेशन की ग्रैन्युलरिटी के आधार पर) पर कोई ढलान नहीं मापा जा सकता है, इसलिए लाल बिंदु एक समान कोण-समोच्च रेखा के बिना होता है।
आनंद लें!
(नोट: -, के बाद से मैं बेतरतीब ढंग से प्रत्येक यात्रा पर डेटा संरचनाओं उत्पन्न जबकि मैं प्रोटोटाइप हूँ - ये प्रतिपादन पिछले प्रतिपादन तुलना में एक अलग सतह स्थलाकृति का उपयोग लेकिन कोर प्रतिपादन विधि एक ही है, इसलिए मैं 'सुनिश्चित करें कि आप अंदाजा हो रहा हूँ)
यहाँ एक मजेदार तथ्य है:। इन प्रतिपादन के दाएँ हाथ की साइड पर अधिक है, तो आप अजीब समोच्च के एक झुंड देखेंगे सही क्षैतिज और ऊर्ध्वाधर पर लाइनें ical कोण। ये इंटरपोलेशन प्रक्रिया की कलाकृतियों हैं, जो मुख्य प्रतिपादन संचालन करने के लिए आवश्यक गणनाओं की संख्या (लगभग 500%) को कम करने के लिए इंटरपोलेटर के ग्रिड का उपयोग करती हैं। उन सभी अजीब समोच्च रेखाएं दो इंटरपोलेटर ग्रिड कोशिकाओं के बीच की सीमा पर होती हैं।
सौभाग्य से, उन कलाकृतियों वास्तव में कोई फर्क नहीं पड़ता। यद्यपि कलाकृतियों ढलान गणना के दौरान पता लगाने योग्य हैं, अंतिम प्रस्तुतकर्ता उन्हें नोटिस नहीं करेगा, क्योंकि यह एक अलग गहराई से संचालित होता है।
अपडेट को पुन:
Aaaaaaaand, एक अंतिम भोग के रूप में इससे पहले कि मैं सो जाओ, यहां 20,000 ढाल नमूने के साथ प्रतिपादन का एक और जोड़ी, ओल्ड-स्कूल में एक "सतत रंग" शैली, और एक है । प्रस्तुतिकरण के इस सेट में, मैंने बिंदु-नमूने के लिए लाल बिंदु को समाप्त कर दिया है, क्योंकि यह अनावश्यक रूप से छवि को अव्यवस्थित करता है।
यहां, आप वास्तव में उन इंटरपोलेशन कलाकृतियों को देख सकते हैं जिन्हें मैंने पहले संदर्भित किया था, इंटरपोलेटर संग्रह की ग्रिड-संरचना के लिए धन्यवाद। मुझे जोर देना चाहिए कि उन कलाकृतियों को अंतिम समोच्च प्रतिपादन पर पूरी तरह अदृश्य हो जाएगा (क्योंकि किसी भी दो आसन्न इंटरपोलेटर कोशिकाओं के बीच परिमाण में अंतर प्रस्तुत छवि की बिट गहराई से कम है)।
बॉन एपेटिट !!
आप मौजूदा लाइब्रेरी, टूल (जैसे कि gnuplot, tecplot) का उपयोग क्यों नहीं करते? – jfs
आप कहते हैं कि डेटा निरंतर है - क्या इसका मतलब यह है कि आप एल्गोरिदमिक रूप से अंतर-पिक्सेल निर्देशांक के मानों की गणना कर सकते हैं? – Alnitak
हाँ, मैं किसी भी समन्वय (64-बिट फ्लोटिंग पॉइंट परिशुद्धता के साथ) पर मान की गणना कर सकता हूं। डेटा संरचना वास्तव में 2 डी गाऊसी कार्यों का संग्रह है, प्रत्येक के अपने आयाम और मानक विचलन के साथ, और इंटरपोलेशन उन मध्यवर्ती मूल्यों को खोजने के लिए कर्नेल घनत्व अनुमानक का उपयोग करता है। – benjismith