Как создать точки по заданному смещению на окружности, используя SpriteKit? - PullRequest
0 голосов
/ 09 июля 2019

Я хочу создать X количество точек на 30 градусов на окружности. Примерно так:

enter image description here

Код, который я сейчас имею, выглядит так:

func pointsOnCircle(num: Int, radius:Float, center:CGPoint) {

        let _by = 360/num
        for i in stride(from: 0, to: 360, by: _by) {

            print("Stride: \(i)")

            let x = radius * cos(Float(i))
            let y = radius * sin(Float(i))
            let pos = CGPoint(x: CGFloat(x)+center.x, y: CGFloat(y)+center.y)

            var node: SKSpriteNode!
            if(i == 0){
                node = SKSpriteNode(color: SKColor.blue, size: CGSize(width: 10, height: 10))
            } else if (i == 90){
                 node = SKSpriteNode(color: SKColor.orange, size: CGSize(width: 10, height: 10))
            } else if (i == 180){
                node = SKSpriteNode(color: SKColor.purple, size: CGSize(width: 10, height: 10))
            } else {
                 node = SKSpriteNode(color: SKColor.red, size: CGSize(width: 10, height: 10))
            }
            node.alpha = 0.5
            node.position = pos
            node.zPosition = 20
            self.addChild(node)

        }

}

Поскольку 360, деленное на 12 - это 30 .. Я вызываю функцию следующим образом:

pointsOnCircle(num: 12, radius: 100, center: CGPoint(x: frame.midX, y: frame.midY))

Я не получаю ожидаемого результата, как вы можете видеть на изображении ниже:

enter image description here

синий прямоугольник равен 0 градусам, что правильно

Фиолетовый прямоугольник - 180 градусов, что неверно

Оранжевый прямоугольник равен 90 градусам, что также неверно.

1 Ответ

0 голосов
/ 09 июля 2019

Вспомогательные функции для преобразования градусов в радианы

EDIT от Knight0fDragon - источник: Как преобразовать градусы в радианы? Спасибо @LeoDabus за прекрасное расширение.

extension BinaryInteger {
    var degreesToRadians: CGFloat { return CGFloat(self) * .pi / 180 }
}

extension FloatingPoint {
    var degreesToRadians: Self { return self * .pi / 180 }
    var radiansToDegrees: Self { return self * 180 / .pi }
}

Результаты

45.degreesToRadians         // 0.785398163397448

Int(45).degreesToRadians    // 0.785398163397448
Int8(45).degreesToRadians   // 0.785398163397448
Int16(45).degreesToRadians  // 0.785398163397448
Int32(45).degreesToRadians  // 0.785398163397448
Int64(45).degreesToRadians  // 0.785398163397448

UInt(45).degreesToRadians   // 0.785398163397448
UInt8(45).degreesToRadians  // 0.785398163397448
UInt16(45).degreesToRadians // 0.785398163397448
UInt32(45).degreesToRadians // 0.785398163397448
UInt64(45).degreesToRadians // 0.785398163397448

Double(45).degreesToRadians    // 0.7853981633974483
CGFloat(45).degreesToRadians   // 0.785398163397448
Float(45).degreesToRadians     // 0.7853981
Float80(45).degreesToRadians   // 0.785398163397448278999
...