为什么CGPath和UIBezierPath在SpriteKit中以不同方式定义“顺时针”?

时间:2016-04-23 05:54:59

标签: ios sprite-kit uibezierpath cgpath

在SpriteKit中,clockwise方向与UIBezierPath相反,但CGPath方向则不同。例如,如果我有

do {
    let path = CGPathCreateMutable()
    CGPathAddArc(path, nil, 0, 0, 10, 0, CGFloat(M_PI_2), true)
    let node = SKShapeNode(path: path)
    node.position = CGPoint(x: self.size.width/2, y: self.size.height/2)
    self.addChild(node)
}
do {
    let path = UIBezierPath()
    path.addArcWithCenter(CGPoint(x: 0, y: 0), radius: 10, startAngle: 0, endAngle: CGFloat(M_PI_2), clockwise: true)
    let node = SKShapeNode(path: path.CGPath)
    node.position = CGPoint(x: self.size.width/2, y: self.size.height/2 - 100)
    self.addChild(node)
}

GameScene.didMoveToView(view: SKView)中,第一个节点绘制一个3/4弧线,右上角缺失,但第二个节点在右上角绘制四分之一弧。 UIBezierPath中反向的“顺时针”方向被解释in this post,但为什么CGPath的行为不同? UIBezierPath只是CGPath的包装器吗?

注意:Objective-C和Swift都会发生这种情况(因此不是语言特定的)。没有使用NSBezierPath尝试使用Mac App。

1 个答案:

答案 0 :(得分:10)

CGPathUIBezierPath使用不同的坐标系。 UIBezierPath的原点位于绘图区域的左上角,CGPath的原点位于左下角。因此,90º是UIBezierPath的圆圈中的最低点和CGPath的最高点。由于两个路径的0°位于圆的同一点(最右边的点),因此从0º到90º的顺时针弧形绘制方式不同。

原点位于左上角,90º(π/ 2)位于圆的最低点,因此绘制了顺时针UIBezierPath弧,如下图所示。由于SpriteKit的原点位于左下角,因此当用于创建SKShapeNode时,此弧会出现翻转(垂直)。

enter image description here

原点位于左下角,90°位于圆的顶部,并绘制顺时针CGPath弧,如下所示。由于SpriteKit的原点也位于左下角,因此形状节点弧以相同的方向显示。

enter image description here