2012-02-13 18 views
5

मैं कोर ग्राफिक्स में खींचना और इसे खींचकर एक घन बेजियर वक्र को दोबारा बदलने और पुन: स्वरूपित करने में सक्षम होना चाहता हूं। मैं मूल आकार खींच सकता हूं और आकार के WHOLE को स्थानांतरित करने के लिए मैं स्पर्श और खींच सकता हूं लेकिन यह वह नहीं है जिसे मैं करने में सक्षम होना चाहता हूं।उद्देश्य सी बेजियर वक्र रीशेपिंग

मैं क्या चाहते हैं जैसे कि वह स्ट्रिंग एक मेज पर झूठ बोल रही है मेरी उंगली से चारों ओर खींचा जा रहा है के एक टुकड़े थे कदम और बेज़ियर यह वक्र नयी आकृति प्रदान करने में सक्षम होना है। मैं बेजियर वक्र के हिस्से पर छू रहा हूं और कुल मिलाकर वक्र के आकार को बदलने के लिए इसे दिशा में खींच रहा हूं।

किसी को भी ऐसा करने के तरीके पता है? किसी भी मदद का स्वागत किया जाएगा।

अग्रिम धन्यवाद

उत्तर

5

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

आप क्या सुझाव दे रहे हैं, तो आपको पहले प्रश्न का उत्तर देना ऐसा करने के लिए "उपयोगकर्ता की अवस्था को छू रहा है?" यह वही है जैसा कि "वक्र की एक निश्चित दूरी के भीतर एक दिया गया बिंदु है।" यह एक मामूली सवाल नहीं है, लेकिन इसकी गणना की जा सकती है। शायद सबसे आसान तरीका केवल वक्र के साथ एक्स बिंदुओं की गणना करना है (जहां एक्स आपको उचित परिशुद्धता देने के लिए पर्याप्त रूप से उच्च है), और प्रत्येक के लिए दूरी की जांच करें। सिद्धांत रूप में, आप दूरी समीकरण के व्युत्पन्न भी ले सकते हैं और इसे अपने शून्य के लिए हल कर सकते हैं, लेकिन इसके लिए पुनरावृत्ति की आवश्यकता है। मेरे अनुभव में आप आवश्यक 1000 या इतनी दूरी की गणना कर सकते हैं (यहां तक ​​कि एक आईपैड 1 पर भी) कि यह अतिरिक्त जटिलता के लायक नहीं हो सकता है।

एक बार जब आप पाते हैं कि उपयोगकर्ता की अवस्था को छू वास्तव में है, यह पता लगाने की जो नियंत्रण बिंदु के सबसे करीब है आसान है। इस बिंदु पर कठिन बात यह तय कर रही है कि इसके बारे में क्या करना है। कुछ विकल्प:

  • दिशा में निकटतम नियंत्रण बिंदु पर ले जाएं कि उपयोगकर्ता बढ़ रहा है। जब तक आपको टच पॉइंट से गुजरने वाला कोई नया वक्र न मिल जाए, तब तक आपको कई गणना करने की आवश्यकता हो सकती है। यह सबसे आसान दृष्टिकोण है और शायद जहां मैं शुरू करूंगा।
  • आप छुपे हुए बिंदु पर वक्र को उप-विभाजित कर सकते हैं और नव निर्मित अंतराल को स्थानांतरित कर सकते हैं। (इसके लिए De Casteljau's एल्गोरिदम देखें।) यह तब तक तेज कोनों को बनाएगा जब तक कि आप मिलान किए गए ढलानों को बनाने के लिए अन्य नियंत्रण बिंदुओं को समायोजित न करें। यह अधिक मनमाने ढंग से घटता है, लेकिन यह जानना बहुत मुश्किल हो सकता है कि उपयोगकर्ता वास्तव में क्या चाहता था। आपकी वक्र को विस्फोट से रखने के लिए आपको लगभग निश्चित रूप से Ramer-Douglas-Peucker लागू करने की आवश्यकता होगी।

मैं वर्तमान में उद्देश्य-सी में बेज़ीयर वक्र समस्याओं में काफी रूचि रखता हूं। आपको मेरे first post on the subject में रुचि हो सकती है। इस क्षेत्र में मेरा प्रारंभिक कार्य GitHub पर iOS:PTL नमूना कोड में उपलब्ध है। उम्मीद है कि इस सप्ताह मेरे पास एक और पोस्ट होगा। आपकी विशेष समस्या दिलचस्प है, इसलिए मैं देख सकता हूं कि मैं इसके आसपास क्या बना सकता हूं।

5

हम्म, क्या आपको यकीन है कि आपको बिल्कुल बेजियर वक्र की आवश्यकता है? या आपको पथ पर कुछ चिकनी वक्र की आवश्यकता है? आपको जिस व्यवहार की आवश्यकता है वह अन्य वक्र प्रकारों का उपयोग करके कार्यान्वित करना बहुत आसान है: Cardinal या यह कैटमुल-रोम स्पलीन जैसी उप-प्रकार है।

बेजियर पर कार्डिनल स्प्लिंस का लाभ वास्तव में नियंत्रण बिंदुओं को पार करने की तुलना में है, यानी पथ से एक बिंदु जोड़ना, स्थानांतरित करना या मिटाना अन्य बिंदुओं को प्रभावित नहीं करता है और वक्र अभी भी ठीक दिखता है। इसके अलावा, गणित बहुत आसान है (और गणना करने के लिए तेज़)।

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

+0

उत्कृष्ट सूचक। हालांकि, मैं इस तरह एक पॉलीलाइन खींचने की कोशिश करने के लिए थोड़ा परेशान होगा। मेरा अनुभव यह है कि बहुत बड़े CGPaths आकर्षित करने के लिए बेहद महंगा होते हैं। लेकिन कैटमुल-रोम को बेज़ीर में परिवर्तित करना संभव है: http://stackoverflow.com/questions/1030596/drawing-hermite-curves-in-opengl। यह एक उपयोगी उपकरण हो सकता है। अभी भी वक्र को विभाजित करने की जटिलता को छोड़ देता है और फिर इसे वापस घन में सरल बना देता है, लेकिन एक उत्कृष्ट प्रारंभिक बिंदु। –

+0

मैं प्रक्रिया को अनुकूलित करने के लिए कुछ खंडों में पथ विभाजित करूंगा (अपडेट, ड्राइंग), साथ ही एक चाल है: टी पैरामीटर चरण चर हो सकता है। हम वक्र सेगमेंट की लंबाई की जांच कर सकते हैं और टी को समायोजित कर सकते हैं, इसलिए करीबी बिंदुओं को कुछ "चिकनाई लाइनें" मिलेंगी जबकि दूरी बिंदुओं में अनुमानित लाइनों का दर्जन हो सकता है। – Gobra

+0

सच है। नीचे दिए गए मेरे लिंक किए गए कोड में "मुझे पथ के साथ दी गई दूरी के लिए 'टी' दें," ताकि आप सुनिश्चित कर सकें कि आप कभी भी छोटी छोटी रेखाएं खींचने की कोशिश नहीं करते हैं (निश्चित रूप से 1px से कम कभी नहीं, जो आसानी से हो सकता है यदि आप आगे बढ़ते हैं 't' रैखिक रूप से)। 4000-5000 लाइन सेगमेंट के पड़ोस में मेरी गंभीर प्रदर्शन समस्याएं हुईं, और यह तकनीक आपको इसके तहत अच्छी तरह से रख सकती है। –

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