में यह काफी नियंत्रण बिंदुओं आकर्षित और उपयोगकर्ता उनके आसपास खींचें करने के लिए अनुमति देने के लिए आसान है। दुर्भाग्य से, वक्र सभी नियंत्रण बिंदुओं से गुजरता नहीं है, इसलिए अनुभव जो आप सुझा रहे हैं उससे काफी मेल नहीं खाता है।
आप क्या सुझाव दे रहे हैं, तो आपको पहले प्रश्न का उत्तर देना ऐसा करने के लिए "उपयोगकर्ता की अवस्था को छू रहा है?" यह वही है जैसा कि "वक्र की एक निश्चित दूरी के भीतर एक दिया गया बिंदु है।" यह एक मामूली सवाल नहीं है, लेकिन इसकी गणना की जा सकती है। शायद सबसे आसान तरीका केवल वक्र के साथ एक्स बिंदुओं की गणना करना है (जहां एक्स आपको उचित परिशुद्धता देने के लिए पर्याप्त रूप से उच्च है), और प्रत्येक के लिए दूरी की जांच करें। सिद्धांत रूप में, आप दूरी समीकरण के व्युत्पन्न भी ले सकते हैं और इसे अपने शून्य के लिए हल कर सकते हैं, लेकिन इसके लिए पुनरावृत्ति की आवश्यकता है। मेरे अनुभव में आप आवश्यक 1000 या इतनी दूरी की गणना कर सकते हैं (यहां तक कि एक आईपैड 1 पर भी) कि यह अतिरिक्त जटिलता के लायक नहीं हो सकता है।
एक बार जब आप पाते हैं कि उपयोगकर्ता की अवस्था को छू वास्तव में है, यह पता लगाने की जो नियंत्रण बिंदु के सबसे करीब है आसान है। इस बिंदु पर कठिन बात यह तय कर रही है कि इसके बारे में क्या करना है। कुछ विकल्प:
- दिशा में निकटतम नियंत्रण बिंदु पर ले जाएं कि उपयोगकर्ता बढ़ रहा है। जब तक आपको टच पॉइंट से गुजरने वाला कोई नया वक्र न मिल जाए, तब तक आपको कई गणना करने की आवश्यकता हो सकती है। यह सबसे आसान दृष्टिकोण है और शायद जहां मैं शुरू करूंगा।
- आप छुपे हुए बिंदु पर वक्र को उप-विभाजित कर सकते हैं और नव निर्मित अंतराल को स्थानांतरित कर सकते हैं। (इसके लिए De Casteljau's एल्गोरिदम देखें।) यह तब तक तेज कोनों को बनाएगा जब तक कि आप मिलान किए गए ढलानों को बनाने के लिए अन्य नियंत्रण बिंदुओं को समायोजित न करें। यह अधिक मनमाने ढंग से घटता है, लेकिन यह जानना बहुत मुश्किल हो सकता है कि उपयोगकर्ता वास्तव में क्या चाहता था। आपकी वक्र को विस्फोट से रखने के लिए आपको लगभग निश्चित रूप से Ramer-Douglas-Peucker लागू करने की आवश्यकता होगी।
मैं वर्तमान में उद्देश्य-सी में बेज़ीयर वक्र समस्याओं में काफी रूचि रखता हूं। आपको मेरे first post on the subject में रुचि हो सकती है। इस क्षेत्र में मेरा प्रारंभिक कार्य GitHub पर iOS:PTL नमूना कोड में उपलब्ध है। उम्मीद है कि इस सप्ताह मेरे पास एक और पोस्ट होगा। आपकी विशेष समस्या दिलचस्प है, इसलिए मैं देख सकता हूं कि मैं इसके आसपास क्या बना सकता हूं।
स्रोत
2012-02-13 16:01:22
उत्कृष्ट सूचक। हालांकि, मैं इस तरह एक पॉलीलाइन खींचने की कोशिश करने के लिए थोड़ा परेशान होगा। मेरा अनुभव यह है कि बहुत बड़े CGPaths आकर्षित करने के लिए बेहद महंगा होते हैं। लेकिन कैटमुल-रोम को बेज़ीर में परिवर्तित करना संभव है: http://stackoverflow.com/questions/1030596/drawing-hermite-curves-in-opengl। यह एक उपयोगी उपकरण हो सकता है। अभी भी वक्र को विभाजित करने की जटिलता को छोड़ देता है और फिर इसे वापस घन में सरल बना देता है, लेकिन एक उत्कृष्ट प्रारंभिक बिंदु। –
मैं प्रक्रिया को अनुकूलित करने के लिए कुछ खंडों में पथ विभाजित करूंगा (अपडेट, ड्राइंग), साथ ही एक चाल है: टी पैरामीटर चरण चर हो सकता है। हम वक्र सेगमेंट की लंबाई की जांच कर सकते हैं और टी को समायोजित कर सकते हैं, इसलिए करीबी बिंदुओं को कुछ "चिकनाई लाइनें" मिलेंगी जबकि दूरी बिंदुओं में अनुमानित लाइनों का दर्जन हो सकता है। – Gobra
सच है। नीचे दिए गए मेरे लिंक किए गए कोड में "मुझे पथ के साथ दी गई दूरी के लिए 'टी' दें," ताकि आप सुनिश्चित कर सकें कि आप कभी भी छोटी छोटी रेखाएं खींचने की कोशिश नहीं करते हैं (निश्चित रूप से 1px से कम कभी नहीं, जो आसानी से हो सकता है यदि आप आगे बढ़ते हैं 't' रैखिक रूप से)। 4000-5000 लाइन सेगमेंट के पड़ोस में मेरी गंभीर प्रदर्शन समस्याएं हुईं, और यह तकनीक आपको इसके तहत अच्छी तरह से रख सकती है। –