2009-07-18 16 views
14

नीचे एक घन प्रक्षेप समारोह है:घन/वक्र चिकना अंतर्वेशन

public float Smooth(float start, float end, float amount) 
{ 
    // Clamp to 0-1; 
    amount = (amount > 1f) ? 1f : amount; 
    amount = (amount < 0f) ? 0f : amount; 

    // Cubicly adjust the amount value. 
    amount = (amount * amount) * (3f - (2f * amount)); 

    return (start + ((end - start) * amount)); 
} 

इस समारोह cubically 0.0f के बीच की राशि दी गई आरंभ और अंत मूल्य के बीच अंतर्वेशन जाएगा - 1.0f। आप इस वक्र प्लॉट करने के लिए थे, तो आप इस तरह कुछ को रखना होगा:

समय सीमा समाप्त Imageshack चित्र निकाल दिया गया

घन समारोह यहां है:

amount = (amount * amount) * (3f - (2f * amount)); 

मैं कैसे करूँ इसमें दो उत्पादन टैंगेंट का उत्पादन करने के लिए इसे समायोजित करें?

इस तरह घटता उत्पादन करने के लिए: (करने के लिए घन शुरू: (रैखिक घन समाप्त करने के लिए शुरू करते हैं)

समय सीमा समाप्त Imageshack छवि

हटाया एक समारोह

के रूप में और एक अन्य के रूप में इस तरह रैखिक अंत)

कालबाह्य छवियां छवि हटा दी गई

किसी को भी कोई विचार है? अग्रिम में धन्यवाद।

+2

इस प्रश्न को बंद करने के लिए वोट दिया गया क्योंकि यह छवियों पर निर्भर करता है कि प्रश्न/समस्या क्या है, एक डी उन छवियों को स्पष्ट रूप से लंबे समय तक चला गया है।सवाल यह है कि इस प्रकार (मेरी राय में) का कोई मूल्य नहीं है, न ही इसका जवाब है, क्योंकि कोई भी नहीं जानता कि उन उत्तरों का क्या जवाब है। –

उत्तर

12

क्या आप चाहते हैं एक Cubic Hermite Spline:

alt text

जहां p0 प्रारंभ बिंदु है, p1 अंत बिंदु, एम 0 है प्रारंभ टेंगेंट है, और एम 1 अंत टेंगेंट

+1

नीचे पोस्ट किए गए घन हर्मीट स्पलाइन का उपयोग करें रॉबर्ट, इसे सुंदर दिखने के लिए धन्यवाद :) –

+1

हां। ऐसा करने का यह तरीका है। एक टुकड़े की क्यूबिक हर्मेट इंटरपोलेंट की अच्छी संपत्ति है कि इसे ब्रेक पॉइंट्स में निरंतर और अलग-अलग दोनों होने का आश्वासन दिया जाता है, क्योंकि अंतराल के प्रत्येक छोर पर मूल्य और पहला व्युत्पन्न होता है। यह, आईएमएचओ, एक टुकड़े की क्यूबिक बनाने के लिए एक बहुत ही सुंदर तरीका है। –

3

आप दो इंटरपोलेशन कार्यों के बीच एक रैखिक इंटरपोलेशन और घन इंटरपोलेशन और इंटरपोलेट कर सकते हैं।

यानी।

cubic(t) = cubic interpolation 
linear(t) = linear interpolation 
cubic_to_linear(t) = linear(t)*t + cubic(t)*(1-t) 
linear_to_cubic(t) = cubic(t)*t + linear(t)*(1-t) 

जहां टी 0 से लेकर ... 1

+0

मैं देखता हूं कि मैं आपका समाधान काम कर सकता हूं या नहीं। हालांकि, आदर्श रूप में मैं विधि में क्यूबिक फ़ंक्शन को समायोजित करना चाहता हूं: राशि = (राशि * राशि) * (3 एफ - (2 एफ * राशि)); मुझे लगता है कि यह काफी आसानी से किया जा सकता है, मुझे यकीन नहीं है कि कैसे। – Rob

+1

यदि आप टेंगेंट चाहते हैं, तो –

0

अच्छा, यह एक आसान तरीका होगा:

-Expand your function by 2 x and y 
-Move 1 to the left and 1 down 
Example: f(x) = -2x³+3x² 
g(x) = 2 * [-2((x-1)/2)³+3((x-1)/2)²] - 1 

या प्रोग्राम के रूप में (घनीय समायोजन):

double amountsub1div2 = (amount + 1)/2; 
amount = -4 * amountsub1div2 * amountsub1div2 * amountsub1div2 + 6 * amountsub1div2 * amountsub1div2 - 1; 

एक दूसरे के लिए, बस बाहर छोड़ "गतिमान":

g(x) = 2 * [-2(x/2)³+3(x/2)²] 

या प्रोग्राम के रूप में (घनीय समायोजन):

double amountdiv2 = amount/2; 
amount = -4 * amountdiv2 * amountdiv2 * amountdiv2 + 6 * amountdiv2 * amountdiv2; 
संबंधित मुद्दे