core-graphics - 在 CGPath 上获取随机 CGPoint

标签 core-graphics cgpoint cgpath

我有一个代表椭圆的 CGPath。我想在该路径上的随机点放置一个 Sprite 节点。我怎样才能在该 CGPath 上获得随机 CGPoint?

最佳答案

谈到封闭的 CGPath 并思考一种快速方法来获取 CGPath 内无限点之间的随机点,首先我已经翻译成 快速这个:

extension CGPath {
    func forEach(@noescape body: @convention(block) (CGPathElement) -> Void) {
        typealias Body = @convention(block) (CGPathElement) -> Void
        func callback(info: UnsafeMutablePointer<Void>, element: UnsafePointer<CGPathElement>) {
            let body = unsafeBitCast(info, Body.self)
            body(element.memory)
        }
        //print(sizeofValue(body))
        let unsafeBody = unsafeBitCast(body, UnsafeMutablePointer<Void>.self)
        CGPathApply(self, unsafeBody, callback)
    }

    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 spriteKitCenter() ->CGPoint {
        let shape = SKShapeNode(path: self)
        return CGPointMake(CGRectGetMidX(shape.frame),CGRectGetMidY(shape.frame))
    }

    func uiKitCenter() ->CGPoint {
        let layer = CAShapeLayer()
        layer.path = self
        return CGPointMake(CGRectGetMidX(layer.frame),CGRectGetMidY(layer.frame))
    }
}

我对我的不规则多边形使用了 follow 方法,它基于三角形,所以如果你使用圆弧,一些曲线部分将会丢失(如果你有任何建议,请评论它,我将不胜感激):

  • 获取所有 CGPath 边界点(组成我的路径的元素)
  • 获取我的CGPath的中心
  • 获取我的点和中心之间的三角形列表
  • 从三角形列表中随机选择一个三角形
  • 在三角形内随机选择一个点

这是三角法:

func getRandomPointInTriangle (aPoint:CGPoint,bPoint:CGPoint,cPoint:CGPoint)->CGPoint {

    var randomA = CGFloat(Float(arc4random()) / Float(UINT32_MAX))
    var randomB = CGFloat(Float(arc4random()) / Float(UINT32_MAX))

    if (randomA + randomB > 1) {
        randomA = 1-randomA
        randomB = 1-randomB
    }

    let randomC = 1-randomA-randomB

    let rndX = (randomA*aPoint.x)+(randomB*bPoint.x)+(randomC*cPoint.x)
    let rndY = (randomA*aPoint.y)+(randomB*bPoint.y)+(randomC*cPoint.y)

    return CGPointMake(rndX,rndY)
}

这是主要方法:

func getRandomPoint()->CGPoint {
        let points = self.path!.getPathElementsPoints()
        let center = self.path!.spriteKitCenter()
        // divide the cgpath in triangles
        var triangles = Array<Array<CGPoint>>()
        for i in 0..<points.count-1 {
            let triangle = [center,points[i],points[i+1]]
            triangles.append(triangle)
        }
        let chooseTriangleNum = Int(arc4random()) % triangles.count
        let chooseTriangle = triangles[chooseTriangleNum]
        return getRandomPointInTriangle(chooseTriangle[0],bPoint: chooseTriangle[1],cPoint: chooseTriangle[2])
}

关于core-graphics - 在 CGPath 上获取随机 CGPoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24225943/

相关文章:

iPhone - 使用自定义颜色的 CGDrawArc 上的 setStroke 不起作用

iphone - 当图像放大太大时,UIPinchGestureRecognizer 表现得很有趣

ios - Core Graphics - 如何在不画线的情况下绘制阴影?

iphone - 如何使用 Quartz 在现有图像之上绘制来创建新图像?

ios - 获取 tableviewCell 在 tableview 的 superview 坐标系内的中心

iphone - 来自字符串的 CGPathRef

iphone - ios 点与像素

ios - setContentOffset 中的 CGPoint 值

iphone - CGMutablePathRef 中的巨大内存泄漏

ios - 扩展 UIView 而不调整大小或重绘