2009-05-08 18 views
18

में सभी बिंदु कैसे प्राप्त कर सकता हूं मैंने विधि CGPathAddQuadCurveToPoint विधि का उपयोग करके एक ट्रैक्टर वक्र पथ बनाया है। मुझे रास्ता पूरी तरह से मिला। लेकिन, मैं पथ में भाग लेने वाले सभी समन्वय बिंदुओं को जानना चाहता हूं।मैं CGPath वक्र या क्वाड वक्र

क्या पथ में सभी समन्वय बिंदु पुनर्प्राप्त करने का कोई तरीका है?

यदि आपके पास गणितीय रूप से वक्र में सभी बिंदुओं को पुनर्प्राप्त करने के लिए कोई अन्य समाधान नहीं है। एक वक्र -

अग्रिम धन्यवाद, वंशी

+0

यहां ... http://stackoverflow.com/questions/4854035/how-do-i-detect-a-touch-on-a-uibezierpath-and-move-a-ball-along-that/ 4855932 # 4855932 – Fattie

उत्तर

0

एक द्विघात वक्र सिर्फ इतना है कि है। की सभी की सूची प्राप्त करना असंभव है क्योंकि असीमित कई अंक हैं, और यह एक साधारण रेखा खंड नहीं है।

Getting Information about Quartz Paths देखें जो आप CGPath ऑब्जेक्ट से पूछने के लिए उपयोग कर सकते हैं। दुर्भाग्यवश, ऐसा लगता है कि आपको सबसे उपयोगी जानकारी मिल रही है, जो CGPathContainsPoint() के साथ है, जो केवल आपको बताती है कि पथ के क्षेत्र में कोई दिया गया बिंदु निहित है या नहीं। पथ के

+0

उत्तर के लिए धन्यवाद .. मैंने CGPathContainsPoint() का उपयोग किया है। इस विधि का उपयोग करने के लिए, हमें निश्चित रूप से बंद होने के हमारे रास्ते की आवश्यकता है। लेकिन, मेरे मामले में यदि मैं पथ बंद करता हूं तो मुझे अपेक्षित पथ नहीं मिलेगा। यदि हम दो बिंदुओं के बीच सभी बिंदुओं को ढूंढना चाहते हैं (यह एक सीधी रेखा बन जाती है) तो गणित समीकरणों का उपयोग करके समाधान होता है। क्या गणित समीकरणों या किसी भी एल्गोरिदम –

1

आप moveto, lineto पर काम करना चाहते हैं, और curveto तत्वों, CGPathApply का उपयोग करें। आप इसे अपने प्रोग्राम में किसी फ़ंक्शन पर एक पॉइंटर पास करते हैं, और यह पथ के प्रति तत्व एक बार कार्य करता है।

दुर्भाग्यवश, ऐपकिट के NSBezierPath के साथ बस प्रत्येक तत्व के लिए पूछने का कोई तरीका नहीं है। समारोह एकमात्र तरीका है।

आप पथ से परिच्छेदित हर पिक्सेल निर्धारित करने के लिए चाहते हैं, तो बहुत बुरा है कि व्यावहारिक नहीं है, और मैं यह भी कारण है कि आप उस जानकारी चाहते हैं के बारे में सोच नहीं कर सकते। कुछ संदर्भ, जैसे कि PDF contexts, पिक्सल भी नहीं है; उन मामलों में, पिक्सेल से जुड़े किसी भी प्रश्न एक अनुक्रमिक है।

0

यू गणितीय एक वक्र में सभी बिंदुओं को पुन: प्राप्त करने के लिए किसी अन्य समाधान है ऐसा नहीं है।

क्या आप उनके लिए क्या ज़रूरत है, यानि कि क्या समस्या को हल करने की कोशिश कर रहे हैं? यदि यह दो घटता को छेड़छाड़ करना है, तो आप इसे गणितीय रूप से कर सकते हैं। बस एक दूसरे के बराबर दो वक्र समीकरण सेट करें और अज्ञात के लिए हल करें।

+0

का उपयोग करने के लिए वक्र के लिए कोई समाधान है उत्तर के लिए धन्यवाद .. मुझे एक जांच है जहां मैं पथ पर एक वस्तु (उदाहरण के लिए व्यक्ति) को स्थानांतरित करना चाहता हूं। मैं अपनी समस्या को हल करने के लिए CAKeyFrameAnimation का उपयोग कर सकता हूं जहां उसे अवधि की आवश्यकता होती है। लेकिन, मेरे पास मेरे मामले में अवधि नहीं है। ऑब्जेक्ट चल रहा है, मुझे ऑब्जेक्ट पर कूदने या वापस जाने जैसी वस्तु पर कुछ अन्य ऑपरेशन करना है। इसलिए, यदि मैं पथ पर सभी बिंदुओं को घुमाता हूं तो मैं उसे उन बिंदुओं पर जाने के लिए तैयार कर सकता हूं जो मेरी आवश्यकता को पूरा करेंगे। –

+0

मैं पूरी तरह से समस्या को समझ नहीं पा रहा हूं, लेकिन शायद आपका पथ समय-आधारित बनाना आपको इसे हल करने में मदद करेगा। यही है, टी = 0 पर, पथ समीकरण वस्तु को (x0, y0) पर रखता है। टी = 1 पर, पथ वस्तु को (x1, y1) पर रखता है। इत्यादि। फिर, आपको सभी बिंदुओं को याद रखने की आवश्यकता नहीं है, लेकिन समय बिंदु टी = i के लिए बस (xi, yi) की गणना करें। –

0

मुझे लगता है कि आप Java2D FlatteningPathIterator क्लास के बराबर कुछ के बाद हैं। उदाहरण के लिए Java2D का path.getPathIterator(null, 1.0) केवल 'लाइन टू' सेगमेंट का इटरेटर देता है, भले ही मूल पथ वक्र हो और क्वाड करने के लिए, डबल तर्क 'समतलता' को नियंत्रित करता है, जिससे आपको वक्र पर किसी भी बिंदु की गणना करने का एक आसान तरीका मिल जाता है। मैं कोको में एक ही चीज़ खोज रहा हूं, लेकिन कुछ भी नहीं मिला है। अगर आपको कोई समाधान मिल जाए तो कृपया मुझे बताएं। आसपास वक्र प्रत्यारोपण हैं (उदा। http://sourceforge.net/projects/curves/) जिन्हें पोर्ट किया जा सकता है, लेकिन हमेशा जोखिम होता है कि यदि आप कोको के समान एल्गोरिदम का उपयोग नहीं करते हैं तो आपके इंटरपोलेशन और स्ट्रोक एनएसबीज़ीयरपाथ/सीजीपाथ के बीच त्रुटियां हो सकती हैं।

14

आप क्यूबिक बेजियर वक्र के लिए विकोबी सी ++ लाइब्रेरी दिनचर्या का उपयोग करके ऐसा कर सकते हैं। विकोबी की लाइब्रेरी क्वाड्रैटिक बेजियर वक्र का भी समर्थन करती है।

बेशक

के रूप में किसी को बताया तो आप सभी बिंदुओं नहीं करना चाहते हैं (हालांकि असंभव नहीं है, यह सिर्फ अनंत समय लगेगा :)।विकोबी अंक की एक निश्चित संख्या प्राप्त करना आसान बनाता है - यदि आपकी शुरुआत, सी 1, सी 2, और अंत बिंदु (जहां सी 1, सी 2 नियंत्रण बिंदु हैं) तो CGContextAddCurveToPoint को दिए गए समान हैं, तो बिंदु पूरी तरह से झूठ बोलेंगे कोर ग्राफिक्स द्वारा खींची गई रेखा पर - ताकि आप पथ पर कई बिंदुओं पर पैटर्न खींचने जैसी चीजें कर सकें।

देखें: http://www.codeproject.com/Articles/22568/Computational-Geometry-C-and-Wykobi

इसके अलावा, के बाद मैं का उपयोग कर wykobi मैंने सुना है एक ऐसी ही, हो सकता है और भी बेहतर पुस्तकालय कि बूस्ट का एक हिस्सा है वहाँ है, लेकिन अभी तक इसे बाहर की जाँच नहीं की है शुरू कर दिया।

मैंने विकोबी पॉइंट्स और सीजीपॉइंट्स (सी ++ मज़े!) के बीच एक पुल के रूप में एक सी ++ क्लास WPoint बनाया है। यहाँ कुछ कोड (WPoint बिना बूस्ट ज्यामिति लाइब्रेरी का लिंक है, लेकिन आप कल्पना कर सकते हैं कि यह वास्तव में एक CGPoint रूप में एक ही लेआउट, इसलिए यदि आप सही डाली कर आप आसानी से परिवर्तित कर सकते हैं है

 NSMutableArray* result = [[NSMutableArray alloc] init]; 
     wykobi::cubic_bezier<CGFloat,2> bezier; 
     bezier[0] = (WPoint)p1; // start point, in CG we did a CGMoveToPoint 
     bezier[1] = (WPoint)b1i; // control 1 
     bezier[2] = (WPoint)b2i; // control 2 
     bezier[3] = (WPoint)p2; // end point 

     std::vector<WPoint> point_list; 
     int numPoints = p2.dist(p3) * pointDensity; 
     // *** here's the magic *** 
     wykobi::generate_bezier(bezier,std::back_inserter(point_list), numPoints); 

     for (int i=0; i<numPoints; i++) { 
      CGPoint p = (CGPoint)(point_list[i]); 
      [result addObject:[NSValue valueWithCGPoint:p]]; 
     } 

// result has your points! 

यहाँ:। http://www.boost.org/doc/libs/1_47_0/libs/geometry/doc/html/geometry/introduction.html

2

उपयोग CGContextSetLineDash

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

CGSize bbSize = CGPathGetBoundingBox(path).size; 
UIGraphicsBeginImageContext(bbSize); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(ctx, 1.0); 
CGContextAddPath(ctx, path); 
CGContextSetLineDash(ctx, phase, lengths, count); 
CGContextReplacePathWithStrokedPath(ctx); 
result = CGContextCopyPath(ctx); 
UIGraphicsEndImageContext(); 
+0

इससे मेरी मदद की। तत्वों से अंक प्राप्त करने के लिए मुझे CGApplyPath का उपयोग करने की भी आवश्यकता है ... मुझे अभी भी कुछ ट्यूनिंग करना है, लेकिन यह बहुत अच्छा काम करता है। ट्यूनिंग करके मेरा मतलब है 'लंबाई' पैरामीटर की विभिन्न सेटिंग्स को आजमाएं। – Jonny

+1

'CGPathCreateCopyByDashingPath' का उपयोग क्यों नहीं करें? – Ilya

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