使用 UIBezierPath 像所有 pixel(x,y) 一样获取每个 cgpoint(x,y) 坐标 [英] Get each and every cgpoint(x,y) coordinates using UIBezierPath like all pixel(x,y)
本文介绍了使用 UIBezierPath 像所有 pixel(x,y) 一样获取每个 cgpoint(x,y) 坐标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我只是使用 UIBezierPath 绘制路径,我想获取 UIBezierPath 下的每个 CGPoint.我尝试使用以下代码
I just draw path using UIBezierPath and i would like to get each and every CGPoint that come under UIBezierPath. I try with following code
func forEach( body: [![enter image description here][1]][1]@escaping @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)
}
我可以使用带有 CGPoint 的上述代码获得积分,但它仅给出该控制点.
I am able to get points using this above code with CGPoint, but it's give only that control point.
有人建议我如何获得所有积分
Any one suggest for me how can i get all points
谢谢
推荐答案
一个简单的(根据用例可能不准确)的方法是:
A simple (maybe inaccurate depending on the use case) way to do this would be:
let rect = CGRect(x: 0, y: 0, width: 100, height: 100)
let bezierPath = UIBezierPath(ovalIn: rect.insetBy(dx: 10, dy: 10))
let pathBounds = bezierPath.bounds
let minX = Int(pathBounds.minX)
let maxX = Int(pathBounds.maxX)
let minY = Int(pathBounds.minY)
let maxY = Int(pathBounds.maxY)
var allPoints: [CGPoint] = []
var pathPoints: [CGPoint] = []
for x in minX...maxX {
for y in minY...maxY {
let point = CGPoint(x: CGFloat(x), y: CGFloat(y))
allPoints.append(point)
if bezierPath.contains(point) {
pathPoints.append(point)
}
}
}
print("All Points: \(allPoints.count)")
print("Path Points: \(pathPoints.count)")
对我来说这是打印
All Points: 6561
Path Points: 5025
希望对您有所帮助.
这篇关于使用 UIBezierPath 像所有 pixel(x,y) 一样获取每个 cgpoint(x,y) 坐标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文