2016-04-23 2 views
1

В SpriteKit направление clockwise отменено для UIBezierPath, но не для CGPath. Например, если у меня естьПочему CGPath и UIBezierPath по-разному определяют «по часовой стрелке» в SpriteKit?

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 (поэтому не зависит от языка). Не пробовал Mac App с NSBezierPath.

ответ

6

CGPath и UIBezierPath использовать различные системы координат. Происхождение UIBezierPath находится в верхнем левом углу области чертежа и в начале CGPath. Следовательно, 90º является самой низкой точкой на круге для UIBezierPath и самой высокой точкой для CGPath. Поскольку 0º находится в одной и той же точке (самая правая точка) на круге для обоих путей, результирующие дуги по часовой стрелке от 0º до 90º рисуются по-разному.

С началом в левом верхнем углу 90º (π/2) находится в самой нижней точке на окружности, и поэтому по часовой стрелке дуга UIBezierPath рисуется, как показано на рисунке ниже. Так как начало SpriteKit находится в левом нижнем углу, эта дуга кажется перевернутой (по вертикали) при использовании для создания SKShapeNode.

enter image description here

С началом в нижнем левом углу, 90º находится в верхней части круга и по часовой стрелке CGPath дуга втягивается, как показано ниже. Поскольку происхождение SpriteKit также находится в левом нижнем углу, дуга узла формы появляется в той же ориентации.

enter image description here

+0

Thank you. Я просто нашел ссылку на это для ['UIBezierView'] (https://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/BezierPaths/BezierPaths.html#//apple_ref/doc/uid/ TP40010156-CH11-SW5) и ['CGPath'] (https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html#//apple_ref/doc/uid/TP30001066 -CH202-CJBBAEEC). –

 Смежные вопросы

  • Нет связанных вопросов^_^