我只是使用UIBezierPath绘制路径,我想获取UIBezierPath下的每个CGPoint。我尝试以下代码
func forEach( body: @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使用上面的代码来获取点,但是它仅提供了该控制点。
有人建议我如何获得所有积分
谢谢
执行此操作的简单方法(视情况而定,可能不准确):
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
希望这会有所帮助。