首页 > 解决方案 > 如何使用 SpriteKit 在圆上通过给定偏移创建点?

问题描述

我想在一个圆上创建 X 个 30 度的点。像这样的东西:

在此处输入图像描述

我现在的代码如下所示:

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))

我没有得到我期望的结果,如下图所示:

在此处输入图像描述

蓝色矩形是 0 度,这是正确的

紫色矩形是 180 度,这是不正确的

橙色矩形是 90 度,这也是不正确的。

标签: sprite-kittrigonometry

解决方案


将度数转换为弧度的辅助函数

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

推荐阅读