दिलचस्प पोस्ट
मैं जावा में कैसे लावा एम्बेड कर सकता हूँ? जावास्क्रिप्ट में valueOf () बनाम toString () सीएसएस में एक स्टार-पूर्ववर्ती संपत्ति का मतलब क्या है? पायथन में सिंगलटन बनाना ईएल प्रस्ताव / स्वतः पूर्ण / कोड एक्लिप्स के साथ फेसलेट्स में सहायता करते हैं खोल स्क्रिप्ट में जेएसएन डेटा पढ़ें ग्लासफ़िश व्यवस्थापक कंसोल JDBC पूल बनाते समय java.lang.IllegalStateException फेंकता है स्विफ्ट: संदर्भ से पास की सरणी? डेस्कटॉप और मोबाइल दृश्यों के लिए वस्तुओं को पुन: व्यवस्थित करने के लिए फ्लेक्स ऑर्डर की सुविधा का उपयोग करना इनपुट को डिफ़ॉल्ट मान कैसे सेट करें एक HTML विशेषता नाम में कौन-से पात्रों की अनुमति है? HTMLCollection तत्वों के लिए लूप के लिए मावेन को SSL त्रुटियों की उपेक्षा करने के लिए कैसे कहें (और सभी सीरेटों पर विश्वास कर रहे हैं)? संदर्भ: PHP के प्रिंट और इको की तुलना करें कौन सी cmd.exe आंतरिक कमांड सफलतापूर्वक 0 पर ERRORLEVEL को साफ़ करें?

सीजीपीएटी के सीजीपॉइंट (एस) को कैसे प्राप्त करें

दिए गए CGPath ( CGMutablePathRef ) में निहित सभी CGPoint (एस) के साथ मैं एक सरणी कैसे प्राप्त CGPath ?

वेब के समाधान से एकत्रित समाधान "सीजीपीएटी के सीजीपॉइंट (एस) को कैसे प्राप्त करें"

आप पथ में प्रत्येक सेगमेंट पर पुनरावृति करने के लिए CGPathApply () का उपयोग कर सकते हैं और उस सेगमेंट के साथ एक कस्टम फ़ंक्शन चला सकते हैं। यह आपको पथ की सभी जानकारी देगा।

हालांकि, अगर "सभी सीपी पॉइंट (ओं)" के द्वारा, आप प्रत्येक बिंदु का मतलब उस पिक्सेल को दिया गया है, जो कि एक असीम आकार के सेट है यद्यपि आप निश्चित रूप से प्रत्येक सेगमेंट प्राप्त करने के लिए फ़ंक्शन लागू कर सकते हैं, और फिर प्रत्येक गैर-चाल सेगमेंट के लिए, अपने स्वयं के गणित का सेगमेंट के नियंत्रण बिंदुओं के साथ मूल्यांकन करें ताकि आपको जो भी घनत्व मिलना चाहिए, उस पर अंक की सूची प्राप्त करें।

स्विफ्ट 2.x का इस्तेमाल करते हुए ( स्विफ्ट 3.x के लिए नीचे पढ़ें।), मैंने स्विफ्ट में सी कॉलबैक के बारे में यह शानदार लेख पाया है।

केविन बलार्ड द्वारा समझाए गए अनुसार, "सभी सीजीपोइंट (एससी)" प्राप्त करने की कोशिश करना, एक बुरा विचार हो सकता है जैसा उसने कहा था।

इसलिए, मुझे लगता है कि पथ तत्वों को प्राप्त करने का सबसे अच्छा तरीका है जो कि एक विशेष CGPath बनाने के लिए उपयोग किया जाता है:

 //MARK: - CGPath extensions extension CGPath { func forEach(@noescape body: @convention(block) (CGPathElement) -> Void) { typealias Body = @convention(block) (CGPathElement) -> Void func callback(info: UnsafeMutablePointer<Void>, element: UnsafePointer<CGPathElement>) { let body = unsafeBitCast(info, Body.self) body(element.memory) } print(sizeofValue(body)) let unsafeBody = unsafeBitCast(body, UnsafeMutablePointer<Void>.self) CGPathApply(self, unsafeBody, callback) } func getPathElementsPoints() -> [CGPoint] { var arrayPoints : [CGPoint]! = [CGPoint]() self.forEach { element in switch (element.type) { case CGPathElementType.MoveToPoint: arrayPoints.append(element.points[0]) case .AddLineToPoint: arrayPoints.append(element.points[0]) case .AddQuadCurveToPoint: arrayPoints.append(element.points[0]) arrayPoints.append(element.points[1]) case .AddCurveToPoint: arrayPoints.append(element.points[0]) arrayPoints.append(element.points[1]) arrayPoints.append(element.points[2]) default: break } } return arrayPoints } } 

इस एक्सटेंशन के साथ आप उदाहरण के लिए कर सकते हैं:

 var bezier = UIBezierPath(ovalInRect: CGRectMake(0, 0, 400, 300)) let myOval = bezier.CGPath let junctionPoints = myOval.getPathElementsPoints() print("junction points are: \(junctionPoints)") 

स्विफ्ट 3.x के लिए अपडेट

( @convention(c) पुन: परिचय की वजह से कुछ सुधार हैं:

 extension CGPath { func forEach( body: @convention(block) (CGPathElement) -> Void) { typealias Body = @convention(block) (CGPathElement) -> Void let callback: @convention(c) (UnsafeMutableRawPointer, UnsafePointer<CGPathElement>) -> Void = { (info, element) in let body = unsafeBitCast(info, to: Body.self) body(element.pointee) } print(MemoryLayout.size(ofValue: body)) let unsafeBody = unsafeBitCast(body, to: UnsafeMutableRawPointer.self) self.apply(info: unsafeBody, function: unsafeBitCast(callback, to: CGPathApplierFunction.self)) } func getPathElementsPoints() -> [CGPoint] { var arrayPoints : [CGPoint]! = [CGPoint]() self.forEach { element in switch (element.type) { case CGPathElementType.moveToPoint: arrayPoints.append(element.points[0]) case .addLineToPoint: arrayPoints.append(element.points[0]) case .addQuadCurveToPoint: arrayPoints.append(element.points[0]) arrayPoints.append(element.points[1]) case .addCurveToPoint: arrayPoints.append(element.points[0]) arrayPoints.append(element.points[1]) arrayPoints.append(element.points[2]) default: break } } return arrayPoints } func getPathElementsPointsAndTypes() -> ([CGPoint],[CGPathElementType]) { var arrayPoints : [CGPoint]! = [CGPoint]() var arrayTypes : [CGPathElementType]! = [CGPathElementType]() self.forEach { element in switch (element.type) { case CGPathElementType.moveToPoint: arrayPoints.append(element.points[0]) arrayTypes.append(element.type) case .addLineToPoint: arrayPoints.append(element.points[0]) arrayTypes.append(element.type) case .addQuadCurveToPoint: arrayPoints.append(element.points[0]) arrayPoints.append(element.points[1]) arrayTypes.append(element.type) arrayTypes.append(element.type) case .addCurveToPoint: arrayPoints.append(element.points[0]) arrayPoints.append(element.points[1]) arrayPoints.append(element.points[2]) arrayTypes.append(element.type) arrayTypes.append(element.type) arrayTypes.append(element.type) default: break } } return (arrayPoints,arrayTypes) } } 

एक CGPath एक अपारदर्शी डेटा प्रकार है और जरूरी इस्तेमाल सभी बिंदुओं को संग्रहीत नहीं करता है। इसके अतिरिक्त, एक पथ वास्तव में इनपुट के रूप में उपयोग किए गए सभी बिंदुओं को आकर्षित नहीं कर सकता (उदाहरण के लिए, बेज़ियर नियंत्रण बिंदुओं पर विचार करें)

किसी पथ से जानकारी प्राप्त करने के लिए केवल दो दस्तावेज तरीके से बाध्यकारी बॉक्स प्राप्त करने के लिए CGPathGetBoundingBox का उपयोग CGPathGetBoundingBox है, या CGPathApply का उपयोग करने के लिए एक जटिल तरीका है जो कॉलबैक फ़ंक्शन को कॉल करने के लिए है, जो आपको CGPathElement प्रकारों को अनुक्रम CGPathElement