2009-08-03 15 views
5

मैं पिछले कुछ दिनों के लिए किसी वास्तविक समाधान के बिना पथ प्रतिपादन पर परेशान रहा हूं।डेटा बिंदुओं के एक सेट दिए गए एक चिकनी पथ को कैसे प्रस्तुत किया जाए?

पथ प्रतिपादन से मेरा मतलब है कि डेटा सेट पॉइंट्स के बीच नियमित अंतराल पर एक निश्चित रेखा के लिए एक धराशायी रेखा (या मेरे मामले में घुमावदार क्वाड) खींचने के लिए एक्स, वाई डेटा पॉइंट्स (अलग दूरी पर) का एक सेट दिया गया है। एक चिकना रास्ता बनाएँ।

यदि आपके पास आईफोन के लिए उड़ान नियंत्रण है तो मैं उस गेम में पथ प्रतिपादन के लिए एक समान प्रभाव बनाने की कोशिश कर रहा हूं।

यहां मेरी समस्या है। यदि ग्राफिक + की चौड़ाई 2 डेटासेट बिंदुओं के बीच की दूरी के बीच बिल्कुल अक्षम नहीं है तो मुझे ओवरलैप या अंडरलैप के साथ छोड़ दिया जाता है। इसका मेरा एकमात्र समाधान या तो

1) ओवरलैप/अंडरलैप बिंदु को अगले डेटा सेट पॉइंट का अंतिम बिंदु होने के लिए ले जाएं और फिर वहां से निम्न बिंदु पर जाएं।

2) हमेशा अंतिम अंतराल के नीचे आते हैं और अगले डेटा बिंदु से ताज़ा शुरू करते हैं।

इनमें से कोई भी समाधान आदर्श नहीं है और दोनों में समस्याएं हैं।

क्या किसी के पास बेहतर समाधान है?

किसी भी मदद की बहुत सराहना की जाएगी। http://www.firemint.com/flightcontrol/screenshots-peaceful.html

मोटी बिंदीदार रेखा:

निम्न स्क्रीन है कि मैं क्या बनाने के लिए कोशिश कर रहा हूँ को दिखाता है।

अद्यतन:

हाय मैं घटता के माध्यम से प्रतिपादन करने की कोशिश की, मैं एक घन वक्र गणना (4 नियंत्रण बिंदुओं के माध्यम से)। हालांकि समस्या इंटरपोलेशन में से एक है। दिया गया 0 और 1 मैं किसी भी 2 अंक से कदम उठा सकता हूं। हालांकि मैं पूरे पथ (एकाधिक नियंत्रण बिंदु) के माध्यम से कदम उठाना चाहता हूं। समस्या यह है कि कुछ नियंत्रण बिंदु अलग-अलग दूरी होंगे, और इस प्रकार निरंतर चरणबद्ध वृद्धि (0.2 कहें) पर चलने से अनियमित परिणाम सामने आएंगे। मुझे पूरे रास्ते से सही ढंग से कदम उठाने के लिए एहसास है कि मुझे पूरे वक्र की लंबाई की गणना करने की आवश्यकता होगी ... सवाल यह है कि मैं यह कैसे कर सकता हूं? ... क्या कोई और तरीका है?

चीयर्स रिच

+0

क्या आपको कभी इस विषय पर समाधान मिला है? –

उत्तर

0

आप पूरी तरह से निश्चित-आकार quads के लिए प्रतिबंधित कर रहे हैं? आदर्श समाधान सही आकार के लिए अंतिम चौकोर को छोटा करना है।

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

संपादित करें:

आह, तस्वीर मदद करता है। मुझे लगता है कि यह आईफोन पर है क्योंकि आपको अंक की एक श्रृंखला मिल रही है, जिससे उनके बीच ड्राइंग लाइन एक स्वीकार्य वक्र उत्पन्न करती है। यदि यह मामला स्प्लिंस/वक्र प्राइमेटिव का उपयोग कर शायद अधिक है। मैं संभवतः ड्राइंग लाइनों तक पहुंचता हूं जैसा कि प्रत्येक डेटा बिंदु पर quads ड्राइंग करके दिखाया गया है जो अंतिम डेटा बिंदु से दी गई दूरी है।कुछ

एल्गोरिथ्म होगा जैसे:

  1. पहले डेटा बिंदु पर ट्रैक्टर (उचित रूप से घुमाया)
  2. ड्रा बिंदु सूची पार जब तक आप अंतिम बिंदु से कम से कम X दूरी पर हैं
  3. अगले बिंदु के लिए सटीक केंद्र खोजने के लिए वर्तमान बिंदु और आखिरी विज़िट पॉइंट के बीच लापरवाही करें।
  4. चरण 2 पर
  5. आप पिछले ट्रैक्टर के लिए एक आंशिक बिंदु है, तो सामान्य रूप में यह आकर्षित (यह यह छोटा तुलना में एक बेहतर दृश्य दे देंगे) ट्रैक्टर (उचित रूप से घुमाया)
  6. जाओ ड्रा।

मस्ती के लिए, कुछ दूरी डी कि दो अंक के बीच की दूरी से भी कम है से दो अंक के बीच lerp (यह शायद 2 डी मामले में और अधिक सरल है, लेकिन मैं आम तौर पर काम करना पसंद):

vector v = point2 - point1; 
normalize(v); 
v *= D; 
finalPoint = point1 + v; 
+0

मैं केवल उन डेटा बिंदुओं को स्वीकार करता हूं जो वर्तमान से दी गई दूरी हैं, इसलिए अंक के मेरे संयोजन में न्यूनतम दूरी होगी। मेरे घूर्णन ग्राफिक के समान दूरी कौन सा है। हालांकि यदि उपयोगकर्ता अपनी अंगुली को जल्दी से ले जाता है तो अंक के बीच की दूरी बड़ी हो जाती है (इसलिए इंटरपोलिंग)। क्या आप कृपया लेपिंग भाग को थोड़ा और विस्तार से बता सकते हैं, क्योंकि यह वर्तमान में जो कुछ भी कर रहा है उसके समान लगता है, और यह स्क्रीन शॉट के रूप में चिकनी पथ के रूप में उत्पन्न नहीं होता है। – Rich

+0

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

+0

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

1

आप Bezier curves या hermite curves पर एक नज़र रखना चाहते हैं, तो वे गणना करने के लिए कठिन नहीं हैं और आपको अच्छे मुलायम वक्र मिलते हैं।

3

एक कोरग्राफिक्स फ़ंक्शन है जिसे "CGPathAddQuadCurveToPoint" कहा जाता है जिसका उपयोग चिकनी पथ बनाने के लिए किया जाता है। An example on how to use it is on GitHub

+0

धन्यवाद, मैं घर जाने पर इसे जाने दूंगा। मुझे बताओ, क्या चीज ओपन जीएलएस में की जा सकती है? जैसा कि मुझे पता है कि कोरग्राफिक्स की बहुत सारी चीजें ओपन जीएलएस में काम नहीं करती हैं। – Rich

+0

@Rich इसे ओपनजीएल के साथ एकीकृत किया जा सकता है कि किसी भी कोरग्राफिक्स सामान को ओपनजीएल के साथ एकीकृत किया जा सकता है। मुझे इस मामले पर कोई अनुभव नहीं है। =) –

+0

मुझे नहीं लगता था कि आप एक खुली gl es सतह पर कोर ग्राफिक्स सामान प्रस्तुत कर सकते हैं ??? – Rich

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