2013-03-24 11 views
12

मैंने वर्गबद्ध और घन बेजियर घटता को लागू करने में कामयाब रहे हैं। वे एक सूत्र हैं क्योंकि वे बहुत सरल हैं।एन-वें ऑर्डर बेजियर वक्र?

enter image description here

कहाँ

enter image description here

और

enter image description here

मैं एक का उपयोग कर रहा: अब मैं सामान्यीकरण का उपयोग कर एक n वें क्रम बेज़ियर वक्र का प्रतिनिधित्व करना चाहते हैं आउटपुट प्रस्तुत करने के लिए बिटमैप लाइब्रेरी, तो मेरा कोड यहां है:

// binomialCoef(n, k) = (factorial(n)/(factorial(k) * factorial(n- k))) 
unsigned int binomialCoef(unsigned int n, const unsigned int k) 
{ 
    unsigned int r = 1; 

    if(k > n) 
     return 0; 

    for(unsigned int d = 1; d <= k; d++) 
    { 
     r *= n--; 
     r /= d; 
    } 

    return r; 
} 

void nBezierCurve(Bitmap* obj, const Point* p, const unsigned int nbPoint, float steps, const unsigned char red, const unsigned char green, const unsigned char blue) 
{ 
    int bx1 = p[0].x; 
    int by1 = p[0].y; 
    int bx2; 
    int by2; 

    steps = 1/steps; 

    for(float i = 0; i < 1; i += steps) 
    { 
     bx2 = by2 = 0; 
     for(int j = 0; (unsigned int)j < nbPoint; j++) 
     { 
      bx2 += (int)(binomialCoef(nbPoint, j) * pow(1 - i, (float)nbPoint - j) * pow(i, j) * p[j].x); 
      by2 += (int)(binomialCoef(nbPoint, j) * pow(1 - i, (float)nbPoint - j) * pow(i, j) * p[j].y); 
     } 

     bresenhamLine(obj, bx1, by1, bx2, by2, red, green, blue); 

     bx1 = bx2; 
     by1 = by2; 
    } 

    // curve must end on the last anchor point 
    bresenhamLine(obj, bx1, by1, p[nbPoint - 1].x, p[nbPoint - 1].y, red, green, blue); 
} 

यहाँ प्रस्तुत करने के लिए अंक के सेट है:

Point ncurv[] = { 
        20, 200, 
        70, 300, 
        200, 400, 
        250, 200 
       }; 

और यहां उत्पादन है:

enter image description here

लाल वक्र एक घन बेज़ियर है। नीला एक चौथा आदेश बेजियर माना जाता है, जो क्यूबिक बेजियर जैसा ही है, लेकिन इस मामले में, वे समान नहीं हैं?

संपादित करें: मैं ध्यान दें कि नीचे बाएँ बिंदु है (0, 0)

+1

ऐसा लगता है कि क्योंकि छोटे फ्लोटिंग बिंदु मूल्यों की सटीकता खो रहे हैं। –

उत्तर

4

अपने सूत्र में योग ...

enter image description here

..., यानी एक n वें क्रम के लिए बेज़ियर आप n + 1 अंक की जरूरत है एन 0 से चलाता है।

आपके पास 4 अंक हैं, इसलिए आप एक तृतीय-ऑर्डर बेजियर ड्राइंग कर रहे हैं।

अपने कोड में त्रुटि यहाँ है:

for(int j = 0; (unsigned int)j < nbPoint; j++) 

यह होना चाहिए:

for(int j = 0; (unsigned int)j <= nbPoint; j++) 

अन्यथा आप केवल 0 n-1 से पुनरावृत्ति कर रहे हैं।

3rd-order bezier

संपादित करें:

ब्याज से बाहर, आकार आप मिल रहे थे, उसी के रूप में अगर लापता (5 वीं) बिंदु (0,0) में किया गया है के बाद से है कि केवल बात यह है कि होता है अपने योग के लिए कुछ भी योगदान ...

4th-order bezier with 5th point at origin

+0

लेकिन जब 'j' 'nbPoint' तक पहुंचता है,' p [j]' प्वाइंट सरणी की सीमाओं से अधिक है? – Jonas

+0

हां - आपको 4 वें ऑर्डर बेजियर बनाने के लिए 5 वां बिंदु जोड़ना होगा। तो पी आकार nbPoint + 1 होना चाहिए। –

+0

हां मैं अब समझता हूं। धन्यवाद। – Jonas

2

आप केवल चार अंक पर एक 4-आदेश बेज़ियर वक्र का निर्माण करने की कोशिश कर रहे हैं भूल गया। कोई आश्चर्य नहीं कि यह काम नहीं कर रहा है।

+3

यह एक उत्तर कैसे है? –

+1

यह प्रश्न का उत्तर नहीं प्रदान करता है।लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। - [समीक्षा से] (https://stackoverflow.com/review/low-quality-posts/16357822) –

+0

@ डोनाल्ड डक: यह प्रश्न संक्षेप में और सही तरीके से उत्तर देता है। रिचर्ड इंग्लिस का जवाब बेहतर है, उन सभी अच्छी तस्वीरों और सबकुछ के साथ, लेकिन यदि आप उस उत्तर की पहली वाक्य पढ़ते हैं तो आप देखेंगे कि यह अनिवार्य रूप से मेरे जैसा ही है। – TonyK

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