为什么 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 应用程序
CGPath
和UIBezierPath
使用不同的坐标系。 UIBezierPath
的原点在绘图区的左上角,CGPath
的原点在左下角。因此,90º 是 UIBezierPath
圆上的最低点和 CGPath
上的最高点。由于 0º 位于圆上两条路径的同一点(最右边的点),因此从 0º 到 90º 的顺时针圆弧的绘制方式不同。
原点在左上角,90º(π/2)在圆的最低点,因此画出顺时针方向UIBezierPath
的圆弧,如下图所示。由于 SpriteKit 的原点位于左下角,因此当用于创建 SKShapeNode
.
时,该圆弧出现翻转(垂直)
原点在左下角,90º在圆的顶部,画出顺时针CGPath
的圆弧,如下图。由于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
.
CGPath
和UIBezierPath
使用不同的坐标系。 UIBezierPath
的原点在绘图区的左上角,CGPath
的原点在左下角。因此,90º 是 UIBezierPath
圆上的最低点和 CGPath
上的最高点。由于 0º 位于圆上两条路径的同一点(最右边的点),因此从 0º 到 90º 的顺时针圆弧的绘制方式不同。
原点在左上角,90º(π/2)在圆的最低点,因此画出顺时针方向UIBezierPath
的圆弧,如下图所示。由于 SpriteKit 的原点位于左下角,因此当用于创建 SKShapeNode
.
原点在左下角,90º在圆的顶部,画出顺时针CGPath
的圆弧,如下图。由于SpriteKit的原点也是在左下角,形状节点圆弧出现的方向相同。