2010-02-23 18 views
6

यदि आप ग्राफ़ या फ़ोटोशॉप जैसे ग्राफ़िक संपादन प्रोग्राम का उपयोग करते हैं तो आप समझेंगे कि मेरा क्या मतलब है। उन कार्यक्रमों पर एक वक्र संपादित करने के लिए (जो शायद बेजियर वक्र है), हम वक्र पर क्लिक कर सकते हैं, माउस खींचें और वक्र के अनुसार वक्र बदल दिया गया है। मुझे संदेह है कि इस तंत्र के पीछे की सभी चीजें वैक्टर से चिंतित हैं, लेकिन मुझे यह दस्तावेज नहीं मिला कि यह कैसे करना है। क्या कोई मुझे बता सकता है कि मैं यह कैसे कर सकता हूं? आपका बहुत बहुत धन्यवाद।इसे संपादित करने के लिए एक बेजियर वक्र खींचें

[संपादित करें] मेरा मतलब था कि चयन करने के लिए वक्र को स्वयं (संपादित करें) (वक्र पर क्लिक करें, और इसे संपादित करने के लिए वक्र खींचें)। सामान्य तरीके से, हम वक्र को बदलने के लिए नियंत्रण बिंदुओं का चयन करते हैं। मुझे वक्र बदलने के बारे में पता है, मुझे नियंत्रण बिंदुओं को संपादित करने की आवश्यकता है, लेकिन मैं बिंदुओं को नियंत्रित करने में बदलाव में परिवर्तन में वक्र पर परिवर्तन की व्याख्या कैसे करूं?

उत्तर

0

ड्रैगिंग बस बेजियर वक्र के नियंत्रण बिंदुओं को बदलता है, और वक्र को तदनुसार फिर से गणना की जाती है। वे कैसे काम करते हैं इस बारे में अच्छी व्याख्या के लिए Wikipedia देखें।

0

कृपया स्पष्ट करें कि आप क्या करना चाहते हैं? क्या आप एक आवेदन में बेजियर वक्र संपादित करना चाहते हैं? क्या आप इसके पीछे सामान्य गणित में रूचि रखते हैं?

आम तौर पर आप बेजियर वक्र उत्पन्न करने के लिए उपयोग किए जाने वाले नियंत्रण बिंदुओं में हेरफेर करते हैं।

1

संपादित करें - अपने प्रश्न संपादित के जवाब में

आदेश में नियंत्रण बिंदुओं स्थानांतरित करने के लिए, मेरा सुझाव है कि बेज़ियर घटता निश्चित रूप से आगे का रास्ता नहीं हैं वक्र ही चयन करने के लिए सक्षम होने के लिए - आप के लिए होता है सही नियंत्रण बिंदु स्थानों को खोजने के लिए रिवर्स में समीकरण को हल करने के लिए। आप यह भी पाएंगे कि कुछ मामलों में वक्र को जहां आप चाहते हैं वहां जाने के लिए नियंत्रण बिंदुओं को स्थानांतरित करना संभव नहीं है।

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

मूल पाठ

मान लिया जाये कि आप पहले से ही एक बेज़ियर वक्र के एक कार्यान्वयन है, जो नियंत्रण बिंदुओं (आमतौर पर बेज़ियर के लिए तीन लेकिन आप चाहते हैं के रूप में कई हो सकते हैं) का एक सेट दिया अंक का एक सेट का उत्पादन कर सकते है डिस्प्ले डिवाइस पर लाइनों के साथ जुड़ने के लिए (आमतौर पर आप 0 >= u <= 1 पैरामीट्रिक समीकरण का उपयोग करते हैं), तो यह आसान है।

आपके नियंत्रण बिंदु निर्धारित करते हैं कि वक्र कहां जाता है, इसलिए आपको केवल उन प्रतिक्रिया बिंदुओं पर चयन प्रतिक्रिया लागू करने और खींचने की आवश्यकता होती है।

यदि आप सटीक बिंदु मिलान की तलाश में हैं, हालांकि, बेजियर वक्र आदर्श नहीं हैं क्योंकि वे केवल पहले और अंतिम नियंत्रण बिंदुओं से गुजरते हैं। और वक्र में जो अधिक अंक जोड़ते हैं, वे कम सटीक बन जाते हैं।

बी-स्प्लिंस बेहतर होगा, और इनमें से भिन्नताएं आप वास्तव में फ़ोटोशॉप एट अल में देखते हैं।

+0

मुझे यह उल्लेख करना चाहिए कि बेजियर के साथ निकटतम नियंत्रण बिंदुओं को प्राप्त करने के लिए आप निकटतम 3-बिंदु घटता की स्ट्रिंग बनाना चाहते हैं। प्रत्येक वक्र का अंत बिंदु अगले वक्र के प्रारंभ बिंदु के बराबर सेट होता है। फिर, दो मिडपॉइंट्स दोनों तरफ के जुड़ने वाले बिंदुओं के दोनों तरफ जुड़ने के बिंदु के चारों ओर दर्पण के लिए सेट किया जाना चाहिए, जिससे उनके बीच एक चिकनी जुड़ाव हो सके। हालांकि, वक्र अभी भी मध्यबिंदुओं से गुजरेंगे। –

0

ठीक है, तो आइए मान लें कि आपको बेजियर वक्र का उपयोग करना है क्योंकि आप एक प्रतिपादन लाइब्रेरी का उपयोग कर रहे हैं जो उन्हें एक आदिम के रूप में उपयोग कर रहा है।यदि आप वक्र पर नियंत्रण बिंदुओं का उपयोग करने के विचार से बिल्कुल विवाहित हैं, तो आप यहां उल्लिखित विधि का उपयोग कर नियंत्रण बिंदुओं को विभाजित कर सकते हैं: How to find control points for a BezierSegment given Start, End, and 2 Intersection Pts in C# - AKA Cubic Bezier 4-point Interpolation

दूसरे शब्दों में, वक्र पर 4 अंकों के प्रत्येक सेट के लिए, आप उपरोक्त एल्गोरिदम चलाएगा और क्यूबिक बेजियर को आकर्षित करने के लिए आवश्यक 4 नियंत्रण बिंदु प्राप्त करेंगे।

3

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

ऐसा करने वाली पहली बात पैरामीटर मान (टी) को समझती है जहां उपयोगकर्ता वक्र पर क्लिक करता है। यह आम तौर पर एक अनुमान होने जा रहा है। यदि आप बेजियर के पिक्सेल या सब-पिक्सेल प्रतिपादन कर रहे हैं, तो बस प्रत्येक पिक्सेल के लिए रिकॉर्ड करें कि टी मान क्या था और इसका उपयोग करें। यदि आप लाइन सेगमेंट में टेसेलेट कर रहे हैं, तो देखें कि कौन सा लाइन सेगमेंट निकटतम है, दो अंत बिंदुओं के टी मानों को ढूंढें, और लाइन के साथ दूरी के अनुसार टी मान को कम करें।

एक बार आपके पास टी मान होने के बाद, आप इसे बेज़ीयर वक्र समीकरण में प्लग कर सकते हैं। आपको फ़ॉर्म की कुछ के साथ खत्म हो जाएगा:

P = k0*P0 + k1*P1 + k2*P2 + k3*P3 

जहां पी वक्र, P0, P1, P2 पर बिंदु है, और पी 3 इनपुट नियंत्रण अंक हैं, और K0, k1, k2, और K3 दिए गए टी के लिए स्थिरांक हैं। मैं के मूल्यों 'योगदान', या अधिक विशेष रूप से नियंत्रण बिंदुओं के योगदान वक्र पी (टी) पर बिंदु पर कॉल करेंगे। याद रखने के लिए एक अच्छी संपत्ति यह है कि k0 + k1 + k2 + k3 = 1.

तो मान लें कि आपके पास वेक्टर वी = पी '- पी है, जहां पी' नई स्थिति है और पी मूल स्थिति है। हमें पी को पाने के लिए कुछ नियंत्रण बिंदुओं को स्थानांतरित करने की आवश्यकता है, जहां इसे जाना है, लेकिन हमारे पास कुछ नियंत्रण बिंदु हैं जिनके बारे में हम स्थानांतरित करना चाहते हैं। गैर-शून्य योगदान वाले किसी भी बिंदु का उपयोग किया जा सकता है, या कुछ संयोजन।

मान लें कि उपयोगकर्ता टी = 0 पर वक्र पर क्लिक करता है। इस मामले में, केवल k0 गैर-शून्य है, इसलिए

P0 := P0 + V 

सही परिणाम देगा। यह भी रूप में

P0 := P0 + k0 * V 

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

एक और विकल्प केवल संपूर्ण बिंदु के अधिकतम योगदान के साथ नियंत्रण बिंदु को स्थानांतरित करना है। मुझे लगता है कि समीकरण का उपयोग करने की तरह

Pmax := Pmax + 1/kmax * V 

कुछ होगा, लेकिन किसी भी तरह से यह किसी दिए गए टी मूल्य पर योगदान को देखते हुए, और नियंत्रण बिंदुओं को ले ताकि नए बिंदु इच्छित स्थान में निहित करने के लिए निर्भर करता है।

यह दृष्टिकोण काफी सामान्य है, और NURBS और अधिकांश अन्य splines, यहां तक ​​कि सतहों के लिए भी काम करता है। एक और तरीका है जो काफी आम है जो Greville Abscissae का उपयोग करता है, जो जितना संभव हो उतना अंक पिन करता है, लेकिन मेरे अनुभव में यह उत्तेजना प्राप्त करना बहुत आसान है।

0

ऑब्जेक्ट मॉडल के लिए github.com/bootchk/freehandTool देखें

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

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