我怎样才能从度数转换为弧度?
我试图将这个Obj-C
代码转换为Swift
代码,但我不知道这个代码的等价物应该是什么?
#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)
我Googlesearch,发现这一点
但我不明白如何在我的情况下在Swift中转换?
Xcode 9•Swift 4
extension BinaryInteger { var degreesToRadians: CGFloat { return CGFloat(Int(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
Apple提供了这些GLKit函数进行转换:
func GLKMathDegreesToRadians(_ degrees: Float) -> Float func GLKMathRadiansToDegrees(_ radians: Float) -> Float
这与您所要求的并不完全相同,但在Swift 3 / iOS 10中,您可以使用Measurementtypes并在不知道公式的情况下进行转换!
let result = Measurement(value: 45, unit: UnitAngle.degrees) .converted(to: .radians).value
此外,要转换弧度弧度(如果有人在谷歌上绊倒):
var degrees = radians * (180.0 / M_PI)
let angle = 45° // angle will be in radians, 45 is in degrees
在Swift下编译3 。 仍然保留所有的值,用CGFloats …做弧度的所有计算,但是用常数以度数来使代码更易读。 例如:90 °°符号会奇迹般地度量弧度转换。
如何设置:
定义和使用°符号的后缀运算符。 这个操作符将会转换度数到弧度。 这个例子适用于Ints,如果你有需要的话,也可以扩展这些。
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°)
警告!
这个转换太简单了(在一个已经以弧度为单位的值上),你会得到一个非常小的结果,看起来结果angular度总是为零…不要在相同的地方使用°值两次(不要转换两次)!!:
// 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
创buildvariables名称时不再限制为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
我会使用上面提到的相同的原则@ t1ser,但创build一个CGFloat
的扩展,使其更容易使用度的小数(例如,你可以有一个23.4度,例如):
extension CGFloat { func degrees() -> CGFloat { return self * .pi / 180 } init(degrees: CGFloat) { self = degrees.degrees() } }
使用它也相当容易(主要是因为我个人不知道如何input?),如果你没有,也option+shift+8
btw):
let degreesToConvert: CGFloat = 45.7 . . . let convertedDegrees = degreesToConvert.degrees()
或者使用初始化程序:
let convertedDegrees = CGFloat(degrees: 45.3)