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

Ios 像所有像素(x,y)一样使用UIBezierPath获取每个cgpoint(x,y)坐标,ios,uibezierpath,cashapelayer,Ios,Uibezierpath,Cashapelayer,我只是使用UIBezierPath绘制路径,我想得到UIBezierPath下的每个CG点。 我尝试使用以下代码 func forEach( body: [![enter image description here][1]][1]@escaping @convention(block) (CGPathElement) -> Void) { typealias Body = @convention(block) (CGPathElement) -> Void let

我只是使用UIBezierPath绘制路径,我想得到UIBezierPath下的每个CG点。 我尝试使用以下代码

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)
}
func-forEach(正文:[![在此处输入图像描述][1][1]@escaping@convention(block)(CGPathElement)->Void){
typealias Body=@约定(块)(CGPathElement)->Void
让回调:@convention(c)(UnsafeMutableRawPointer,UnsafePointer)->Void={(info,element)in
让body=unsafeBitCast(信息,收件人:body.self)
主体(element.pointee)
}
//打印(MemoryLayout.size(of值:正文))
让unsafeBody=unsafeBitCast(body,to:UnsafeMutableRawPointer.self)
apply(信息:unsafeBody,函数:unsafeBitCast(回调,到:cgpathappierfunction.self))
}
func getPathElementsPoints()->[CGPoint]{
变量数组点:[CGPoint]!=[CGPoint]()
中的self.forEach{element
开关(元件类型){
案例CGPathElementType.moveToPoint:
arrayPoints.append(元素点[0])
case.addLineToPoint:
arrayPoints.append(元素点[0])
case.addQuadCurveToPoint:
arrayPoints.append(元素点[0])
arrayPoints.append(element.points[1])
case.addCurveToPoint:
arrayPoints.append(元素点[0])
arrayPoints.append(element.points[1])
arrayPoints.append(element.points[2])
默认值:中断
}
}
返回数组点
}
func getPathElementsPointsAndTypes()->([CGPoint],[CGPathElementType]){
变量数组点:[CGPoint]!=[CGPoint]()
var arrayTypes:[CGPathElementType]!=[CGPathElementType]()
中的self.forEach{element
开关(元件类型){
案例CGPathElementType.moveToPoint:
arrayPoints.append(元素点[0])
arrayTypes.append(element.type)
case.addLineToPoint:
arrayPoints.append(元素点[0])
arrayTypes.append(element.type)
case.addQuadCurveToPoint:
arrayPoints.append(元素点[0])
arrayPoints.append(element.points[1])
arrayTypes.append(element.type)
arrayTypes.append(element.type)
case.addCurveToPoint:
arrayPoints.append(元素点[0])
arrayPoints.append(element.points[1])
arrayPoints.append(element.points[2])
arrayTypes.append(element.type)
arrayTypes.append(element.type)
arrayTypes.append(element.type)
默认值:中断
}
}
返回(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

希望这有帮助。

感谢识别(x,y)坐标,但这里我只得到一些点,比如我有一个速度曲线图,速度曲线图有一个原始路径曲线,所以路径曲线我想要(x,y)在UIBezierPath下的坐标你能让我知道路径坐标在曲线的UIBezierPath下吗,只需要曲线x,y坐标在这个例子中,我得到的值像x:0.0,y:183.0,再次是x:1.0,y:182.0,像这样,但我想要用浮点也像24.75,56.25等等。。。