为什么CGPath和UIBezierPath在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) ,第一个节点绘制一个右上angular缺失的3/4弧,而第二个节点绘制右上angular的四分之一弧。 在UIBezierPath反向的“顺时针”方向在UIBezierPath中解释,但是为什么CGPath行为不一样呢? 不是UIBezierPath只是UIBezierPath的包装?

注意:Objective-C和Swift都会发生这种情况(所以不是特定于语言的)。 没有尝试在Mac App与NSBezierPath

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

原点位于左上方,90º(π/ 2)位于圆的最低点,因此,如下图所示,绘制了顺时针的UIBezierPath弧。 由于SpriteKit的原点位于左下方,所以在用于创buildSKShapeNode时,会出现这个圆弧(垂直)。

在这里输入图像说明

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

在这里输入图像说明