2012-07-03 20 views
10

तो मैं किसी प्रकार की विधि के लिए चारों ओर देख रहा हूं ताकि मुझे एक घन बेजियर वक्र पर वाई-समन्वय मिल सके, जिस पर एक्स-समन्वय दिया गया हो।एक क्यूबिक बेजियर वक्र पर वाई दिया एक्स ढूँढना?

मैं कई जगहों पर आया हूं जो मुझे एक घन समारोह का इलाज करने के लिए कह रहे हैं, फिर जड़ों को खोजने का प्रयास करें, जो मैं समझता हूं कि घन बेझियर वक्र के लिए समीकरण (x-coords के लिए) है: एक्स (टी) = (1-टी)^3 * एक्स 0 + 3 * (1-टी)^2 * टी * एक्स 1 + 3 * (1-टी) * टी^2 * एक्स 2 + टी^3 * एक्स 3

क्या मुझे भ्रमित करता है कि (1-टी) मानों का जोड़ा है। उदाहरण के लिए, यदि मैं कुछ यादृच्छिक संख्याओं के साथ एक्स मानों को भरता हूं ...

400 = (1-टी)^3 * 100 + 3 * (1-टी)^2 * टी * 600 + 3 * (1-टी) * टी^2 * 800 + टी^3 * 800

तो घन समीकरण शैली के लिए पुन: व्यवस्थित:

800T^3 + 3 * (1-टी) 800T^2 + 3 (1-टी)^2 * 600t + (1-टी)^3 * 100 -400 = 0

मुझे अभी भी (1-टी) ब्लॉक की समस्या है। मैं काम नहीं कर सकता कि मुझे टी को हल करने के लिए कैसे माना जाता है जब (1-टी) पहली जगह अज्ञात है।

कोई विचार?

+1

अधिक गणित प्रश्न ... –

+1

बहुत अच्छा, मैं इसके बजाय गणित लोगों से पूछूंगा। मुझे लगता है कि कंप्यूटिंग में इस्तेमाल किया जा रहा है इसका मतलब यह होगा कि यहां लोगों को पता चल सकता है। धन्यवाद। –

उत्तर

2

मुझे लगता है कि यह एक उचित सीएस सवाल है, इसलिए मैं यह दिखाने का प्रयास करने जा रहा हूं कि मैंने इसे कैसे हल किया। ध्यान दें कि किसी दिए गए x में 1 से अधिक मान हो सकते हैं। जिस मामले में मुझे इसकी आवश्यकता थी, उस मामले की गारंटी नहीं थी, इसलिए आपको यह पता लगाना होगा कि आप कौन सा चाहते हैं।

मैंने टी और वाई मानों की एक सरणी उत्पन्न करने के लिए टी से पुनरावृत्त किया। मैंने इसे अपने उद्देश्यों के लिए काफी उच्च संकल्प पर किया। (मैं एक 8-बिट लुक-अप टेबल जेनरेट करना चाहता था, इसलिए मैंने ~ 1000 अंक का उपयोग किया।) मैंने अगले एक्स के लिए बेजियर समीकरण में टी को प्लग किया और अगले वाई निर्देशांक सरणी में स्टोर करने के लिए। एक बार जब मैंने पूरी चीज उत्पन्न की, तो मैंने 2 निकटतम एक्स मानों को खोजने के लिए सरणी के माध्यम से स्कैन किया। (या यदि कोई सटीक मैच था, तो इसका इस्तेमाल किया जाता था।) फिर मैंने वाई-वैल्यू की आवश्यकता के लिए उस छोटे से छोटे सेगमेंट पर एक रैखिक इंटरपोलेशन किया।

5

घन बेजियर वक्र व्यक्त करने के तीन सामान्य तरीके हैं।

एक्स

y(x) = sum(f_i(x) a_i) 
    = (1-x)^3 * y0 + 3*(1-x)^2 * x * y1 + 3*(1-x) * x^2 * y2 + x^3 * y3 

ये पहले दो के एक समारोह के रूप में टी

x(t) = sum(f_i(t) a_i) 
    = (1-t)^3 * x0 + 3*(1-t)^2 * t * x1 + 3*(1-t) * t^2 * x2 + t^3 * x3 

दूसरे y के एक समारोह के रूप प्रथम x गणितीय बस चर के लिए अलग-अलग नाम का उपयोग करते हुए एक ही कर रहे हैं।

आपके विवरण के आधार पर "एक घन बेजियर वक्र पर वाई-समन्वय ढूंढें, जिस पर एक्स-समन्वय दिया गया है।" मैं अनुमान लगा रहा हूं कि आपके पास दूसरे समीकरण का उपयोग करने वाला प्रश्न है, इसे हल करने में आपकी सहायता के लिए पहले समीकरण को पुन: व्यवस्थित करने का प्रयास कर रहे हैं, जहां आपको दूसरे समीकरण का उपयोग करना चाहिए। यदि ऐसा है, तो कोई पुनर्व्यवस्थित या हल करने की आवश्यकता नहीं है - बस अपने एक्स मान को प्लग करें और आपके पास समाधान है।

यह संभव है कि आपके पास तीसरे प्रकार के मामले का समीकरण हो, जो बदसूरत और कठिन मामला है। यह दोनों एक्स और वाई पैरामीटर एक तीसरे परिवर्तनीय टी के क्यूबिक बेजियर हैं।

x(t) = sum(f_i(t) x_i) 
y(t) = sum(f_i(t) y_i) 

यदि यह आपका मामला है।मुझे बताएं और मैं विस्तार से बता सकता हूं कि इसे हल करने के लिए आपको क्या करना है।

+0

क्या आप parametrized संस्करण को हल करने में मेरी मदद कर सकते हैं? मेरे पास parametrized 'x' और' y' है। मुझे 'y' दिया' x' चाहिए। इसलिए मुझे नहीं पता लेकिन 'x' पता है। – activatedgeek

+1

@activatedGeek - आप अपने मामले को _solve_ जरूरी नहीं कर सकते हैं। कोई समाधान, एक समाधान, कई समाधान या यहां तक ​​कि असीमित कई समाधान (उदास) हो सकते हैं। आपकी सबसे अच्छी शर्त यह ध्यान रखना है कि बेजियर वक्र को इसके नियंत्रण बिंदुओं के उत्तल ढक्कन के अंदर गिरने की गारंटी है। फिर विचार करें कि प्रत्येक सेगमेंट सीवीएच आपके एक्स वैल्यू को पार कर सकता है, अगर यह इसे सूची में रखता है, अगर यह नहीं करता है - इसे भूल जाओ। अब प्रत्येक खंड पर बेजियर सेगमेंट की एक नई सूची प्राप्त करने के लिए एक बेजियर मिड-पॉइंट स्प्लिट लागू करें। सभी खंडों को "छोटा" पर्याप्त होने तक छोड़ने और विभाजित करने दोहराएं। वे आपके समाधान हैं। –

+0

ठीक है, मैं सीधे स्रोत पर जाऊंगा। क्या आप मुझे बता सकते हैं कि [यह] (http://cubic-bezier.com/#.17,.67,.83,.67) काम करता है? मैं समझता हूं कि बाईं ओर वक्र कैसे खींचा जा रहा है। जो मुझे समझ में नहीं आता है वह यह है कि किसी 'एनीमेशन के समय को' बीज़ियर वक्र 'के 't' पैरामीटर को मैप करने के लिए एनीमेशन के समय को कैसे परिवर्तित किया जाएगा ताकि कुछ' टी सेकेंड 'में एनीमेशन को कवर किया जा सके। – activatedgeek

1

अभिव्यक्ति आप चलाते हैं आगे हो आप (1 - t) कारकों

से छुटकारा चाहिए का विकास:

expand(800*t^3 + 3*(1-t)*800*t^2 + 3*(1-t)^2*600*t + (1-t)^3*100 -400 = 0); 

या तो wxMaxima या Maple (आप हालांकि यह एक में पैरामीटर t जोड़ने के लिए) में, आपको मिलेगा:

100*t^3 - 900*t^2 + 1500*t - 300 = 0 

के लिए नए घन समीकरण का समाधान 10 (आपको लगता है कि के लिए the cubic equation formula उपयोग कर सकते हैं), के बाद आप t मिला है, आप x कर पा सकते हैं:

x = (x4 - x0) * t  (asuming x4 > x0) 
0

तो मैं विधि के कुछ प्रकार के लिए चारों ओर देख रहा है मुझे Y- को खोजने के लिए अनुमति देने के लिए एक घन बेजियर वक्र पर समन्वय, जिस पर एक एक्स-समन्वय दिया गया है।

अंक (0, 0) और (0, 100) के बीच एक घन बेजियर वक्र पर विचार करें, (0, 33) और (0, 66) पर नियंत्रण बिंदुओं के साथ। किसी दिए गए एक्स के लिए वाई की अनंत संख्या है। इसलिए कोई समीकरण नहीं है जो वाई को दिए गए एक्स को मनमाने ढंग से क्यूबिक बेजियर के लिए हल करने जा रहा है।

एक मजबूत समाधान के लिए, आप की संभावना के साथ De Casteljau's algorithm

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

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