如何将度数转换为弧度?

时间:2015-03-21 05:46:39

标签: ios objective-c macos swift macros

我正在尝试将此Obj-C代码转换为Swift代码,但我不知道该代码的等效内容应该是什么?

#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)

我用Google搜索并找到this

但在我的情况下,我不明白如何在Swift中转换它?

10 个答案:

答案 0 :(得分:234)

Xcode 10•Swift 4.2或更高版本

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

答案 1 :(得分:50)

这与您的要求不同,但在Swift 3 / iOS 10中,您可以使用Measurement类型并在不知道公式的情况下进行转换!

let result = Measurement(value: 45, unit: UnitAngle.degrees)
    .converted(to: .radians).value

答案 2 :(得分:41)

Apple为转换提供了这些GLKit functions

func GLKMathDegreesToRadians(_ degrees: Float) -> Float
func GLKMathRadiansToDegrees(_ radians: Float) -> Float

答案 3 :(得分:16)

let angle = 45° // angle will be in radians, 45 is in degrees

Swift 3 下编译。仍保留所有值,使用CGFloats以弧度进行所有计算...,但使用常量度数使代码更具可读性。 例如:90° °符号会神奇地将度数转换为弧度转换。

如何设置:

°符号定义并使用后缀运算符。此运算符将执行从度到弧度的转换。 这个例子适用于Ints,如果你有需要,也可以为Float类型扩展它们。

postfix operator °

protocol IntegerInitializable: ExpressibleByIntegerLiteral {
  init (_: Int)
}

extension Int: IntegerInitializable {
  postfix public static func °(lhs: Int) -> CGFloat {
    return CGFloat(lhs) * .pi / 180
  }
}

一些使用示例:

let angle = 45°

contentView.transform = CGAffineTransform(rotationAngle: 45°)

let angle = 45
contentView.transform = CGAffineTransform(rotationAngle: angle°)

警告!

使用此转换太容易两次(错误地在弧度值上),结果会得到一个非常小的数字,看起来结果角度总是为零......不要使用°两次相同的值(不要转换两次)!!:

// OBVIOUSLY WRONG!
let angle = 45°° // ° used twice here

// WRONG! BUT EASY TO MISS
let angle = 45° // ° used here
contentView.transform = CGAffineTransform(rotationAngle: angle°) // ° also used here

答案 4 :(得分:11)

此外,将fron弧度转换为度数(如果有人在谷歌上发现这一点):

var degrees = radians * (180.0 / M_PI)

答案 5 :(得分:2)

创建变量名时不再局限于ASCII字符,那么使用π(alt-p)如何:

typealias RadianAngle = CGFloat

let π = RadianAngle(M_PI)
let π_x_2 = RadianAngle(M_PI * 2)
let π_2 = RadianAngle(M_PI_2)
let π_4 = RadianAngle(M_PI_4)

extension RadianAngle {
    var degrees: CGFloat {
        return self * 180 / π
    }
    init(degrees: Int) {
        self = CGFloat(degrees) * π / 180
    }
}

使用示例:

let quarterCircle = RadianAngle(degrees: 90)
print("quarter circle = \(quarterCircle) radians")
// quarter circle = 1.5707963267949 radians

let halfCircle = π
print("half circle = \(halfCircle.degrees) degrees")
// half circle = 180.0 degrees

答案 6 :(得分:1)

我使用与上面提到的相同的原则@ t1ser,但创建extension CGFloat { func degrees() -> CGFloat { return self * .pi / 180 } init(degrees: CGFloat) { self = degrees.degrees() } } 的扩展名,以便更容易使用小数位数(例如,你可以有23.4度):

option+shift+8

使用它也很容易(主要是因为我个人不知道如何键入° - 如果你没有,也就是let degreesToConvert: CGFloat = 45.7 . . . let convertedDegrees = degreesToConvert.degrees() btw):

let convertedDegrees = CGFloat(degrees: 45.3)

或者使用初始化程序:

meal_period

答案 7 :(得分:1)

Swift 4.2

您可以编写全局通用函数:

public func radians<T: FloatingPoint>(degrees: T) -> T {
    return .pi * degrees / 180
}

public func degrees<T: FloatingPoint>(radians: T) -> T {
    return radians * 180 / .pi
}

示例:

let cgFloat: CGFloat = 23.0
let double: Double = 23.0
let float: Float = 23.0
let int: Int = 23

let cgf = radians(degrees: cgFloat) // 0.4014 CGFloat
let d = radians(degrees: double)    // 0.4014 Double
let f = radians(degrees: float)     // 0.4014 Float
let i = radians(degrees: int)       // compile error

如果您不想扩展所有这样的浮动类型

extension FloatingPoint { ... }

答案 8 :(得分:0)

在度数和弧度之间转换 Double 的最有效和最准确的方法:

import Foundation

extension Double {
    var radians: Double { return Measurement(value: self, unit: UnitAngle.degrees).converted(to: UnitAngle.radians).value }
    var degrees: Double { return Measurement(value: self, unit: UnitAngle.radians).converted(to: UnitAngle.degrees).value }
}

Apple 的 Foundation 团队很久以前就通过开发超越所有其他解决方案的解决方案解决了这个问题:

Measurements and Units - WWDC 2016, Session 238

答案 9 :(得分:-3)

swift 2.3

trainDataVecs