和所有像素(x,y)一样,使用UIBezierPath获取每个cgpoint(x,y)坐标

问题描述 投票:0回答:1

我只是使用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使用上面的代码来获取点,但是它仅提供了该控制点。

有人建议我如何获得所有积分

谢谢

ios uibezierpath cashapelayer
1个回答
0
投票

执行此操作的简单方法(视情况而定,可能不准确):

    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

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.