使用 UIBezierPath 像所有 pixel(x,y) 一样获取每个 cgpoint(x,y) 坐标 [英] Get each and every cgpoint(x,y) coordinates using UIBezierPath like all pixel(x,y)

查看:36
本文介绍了使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆