2010-10-30 12 views
15

कल्पना कीजिए कि आप एक पूरी तरह से सामान्य चार सूत्री बेज़ियर की अवस्था (दो अंक और दो नियंत्रण अंक) का उपयोग कर curveToPoint बनायाएक साधारण घन बेजियर वक्र के साथ एक बिंदु, एक दी गई दूरी खोजें। controlPoint1: controlPoint2: (! एक iPhone पर)

simple cubic bezier curve example
कैसे कार्य करें: अपने कोको आवेदन में आप वक्र के साथ अंक (और टैंगेंट) पाते हैं? कुछ https://stackoverflow.com/a/31317254/294884

उत्तर

28

नहीं है:


बाद में:
Find the tangent of a point on a cubic bezier curve (on an iPhone)

से और बस कॉपी और पेस्ट कोड: के लिए एक पूरा, सरल, समाधान नीचे मीकल के जवाब पर आधारित है, के लिए क्लिक करें पदों की गणना के पीछे सरल गणित, आप विकिपीडिया पर भी बेज़ीर घटता पर चर्चा करने वाले प्रत्येक पेपर में इसके बारे में पढ़ सकते हैं। वैसे भी, मैं उन सभी से संबंधित हो सकता हूं जो वास्तव में कोड में इसे लागू करने में परेशानी में हैं, इसलिए मैंने इस नमूना को UIView लिखा क्योंकि यह संभवतः आपको प्रारंभ करने का सबसे आसान तरीका है।

#import "MBBezierView.h" 

CGFloat bezierInterpolation(CGFloat t, CGFloat a, CGFloat b, CGFloat c, CGFloat d) { 
    CGFloat t2 = t * t; 
    CGFloat t3 = t2 * t; 
    return a + (-a * 3 + t * (3 * a - a * t)) * t 
    + (3 * b + t * (-6 * b + b * 3 * t)) * t 
    + (c * 3 - c * 3 * t) * t2 
    + d * t3; 
} 

@implementation MBBezierView 

- (void)drawRect:(CGRect)rect { 
    CGPoint p1, p2, p3, p4; 
    p1 = CGPointMake(30, rect.size.height * 0.33); 
    p2 = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); 
    p3 = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); 
    p4 = CGPointMake(-30 + CGRectGetMaxX(rect), rect.size.height * 0.66); 

    [[UIColor blackColor] set]; 
    [[UIBezierPath bezierPathWithRect:rect] fill]; 

    [[UIColor redColor] setStroke]; 

    UIBezierPath *bezierPath = [[[UIBezierPath alloc] init] autorelease]; 
    [bezierPath moveToPoint:p1]; 
    [bezierPath addCurveToPoint:p4 controlPoint1:p2 controlPoint2:p3]; 
    [bezierPath stroke]; 

    [[UIColor brownColor] setStroke]; 
    for (CGFloat t = 0.0; t <= 1.00001; t += 0.05) { 
     CGPoint point = CGPointMake(bezierInterpolation(t, p1.x, p2.x, p3.x, p4.x), bezierInterpolation(t, p1.y, p2.y, p3.y, p4.y)); 
     UIBezierPath *pointPath = [UIBezierPath bezierPathWithArcCenter:point radius:5 startAngle:0 endAngle:2*M_PI clockwise:YES]; 
     [pointPath stroke]; 
    } 
} 

@end 

यह मैं क्या मिलता है:

alt text

+1

गणित मजेदार है! +1! – slf

+3

@ जो ब्लो: क्या यह वास्तव में आप चाहते थे? आपने कहा था कि आप एक बिंदु चाहते थे जो वक्र के साथ दूरी डी है। Michal, अगर मैं गलत हूँ, तो मुझे सही करें, लेकिन आपका कोड सिर्फ विभिन्न पैरामीटर मानों पर वक्र का मूल्यांकन करता है, जो लंबाई के समान नहीं है। जैसा कि आप देख सकते हैं, अंक चोटी में एक साथ और वक्र के बीच में अलग हैं। – CromTheDestroyer

+0

हाय क्रॉम - आप काफी सही हैं, वे केवल वक्र के साथ समान रूप से दूरी पर हैं।स्पष्ट रूप से सटीक spacings प्राप्त करने के लिए गणितीय रूप से कोई आसान तरीका नहीं है। यह सामान्य अनुमान गेम इंजन और इसी तरह के लिए ठीक काम करता है। यह भी देखें 4089443. – Fattie

0

किसी भी Bézier वक्र बस वेक्टर या जटिल गुणांक के साथ एक बहुपद समारोह के रूप में देखा जा सकता है। आपके स्क्रीनशॉट में एक क्यूबिक बेज़ीर वक्र, फिर ऑर्डर 3 के बहुपद कार्य द्वारा उत्पन्न किया जाएगा, और वक्र पर प्रत्येक बिंदु वक्र बहुपद के परिणाम बी (टी) का वर्णन करता है, जो किसी विशेष इनपुट मान के लिए मूल्यांकन किया जाता है टी। यदि मुझे गलत नहीं लगता है, तो एक बार जब आप वक्र बनाने के लिए उपयोग किए जाने वाले बहुपद को जानते हैं, तो आप बस बी (टी) = ए + बी के लिए हल कर सकते हैं, जहां ए + बी उस जटिल विमान पर बिंदु का वर्णन करता है जिसे आप चाहते हैं टी के लिए मूल्य खोजें। इस तरह बहुपदों में जड़ों को ढूंढना एक अच्छी तरह से समझी गई समस्या है, और ऑर्डर 2 या उससे कम के वक्र के लिए बीजगणितीय रूप से हल किया जा सकता है, और उच्च डिग्री के बहुपदों के लिए अग्रेषित न्यूटन जैसे कुछ तरीकों का उपयोग किया जा सकता है। यदि आप जनरेटिंग बहुपद को जानते हैं, तो निश्चित रूप से डेरिवेटिव को ढूंढना बहुत आसान होना चाहिए। बेज़ीर आमतौर पर "टेम्पलेट बहुपद" से खींचे जाते हैं जहां एक अलग वक्र खींचा जाने पर केवल गुणांक बदल जाते हैं, इसलिए आप शायद इसे दस्तावेज़ में कहीं भी देख सकते हैं।

3

अनुमान है कि टी माइकल प्रस्तावित वक्र के साथ दूरी है जो कुछ घटता और कुछ उद्देश्यों के साथ परेशानी हो सकती है। अफसोस की बात है कि मैंने सही समाधान के ओब्जे-सी कार्यान्वयन के लिए थोड़ी देर के लिए भाग्य के बिना खोज की है।

हालांकि, समाधान को अपने अद्भुत Primer on Bezier Curves में माइक "पोमैक्स" कामर्मन द्वारा शानदार तरीके से वर्णित किया गया है। इसमें प्रसंस्करण और सार्वजनिक डोमेन में लिखे गए सभी कोड भी हैं। मुझे आश्चर्य है कि किसी ने इसे अभी तक ओब्जे-सी में परिवर्तित नहीं किया है। बहुत मोहक, मैं हूं।

+0

पर अपने प्रश्न पर एक नज़र डाल सकते हैं आश्चर्यजनक रूप से उपयोगी लिंक @ Daniel - धन्यवाद। शानदार। यह उन पृष्ठों में से एक है ... http://pomax.github.io/bezierinfo ... वह "बहुत उपयोगी है!" हे। दोबारा धन्यवाद लिंक बहुत उपयोगी है मैं आपको उधार दे रहा हूँ! बहुत बढ़िया। – Fattie

+1

हाहाहा, प्राइमर के उपयोग को लेकर खुशी हुई। अगर आपको कुछ याद आ रही है या अस्पष्ट = पी मिलती है तो मुझे बताएं –

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