为什么 CGPath 和 UIBezierPath 在 SpriteKit 中定义 "clockwise" 不同?

Why CGPath and UIBezierPath define "clockwise" differently in SpriteKit?

在 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 中相反的 "clockwise" 方向得到了解释 in this post,但为什么 CGPath 的行为不同? UIBezierPath 不就是 CGPath 的包装吗?

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

的 Mac 应用程序

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

原点在左上角,90º(π/2)在圆的最低点,因此画出顺时针方向UIBezierPath的圆弧,如下图所示。由于 SpriteKit 的原点位于左下角,因此当用于创建 SKShapeNode.

时,该圆弧出现翻转(垂直)

原点在左下角,90º在圆的顶部,画出顺时针CGPath的圆弧,如下图。由于SpriteKit的原点也是在左下角,形状节点圆弧出现的方向相同。