如何将度数转换为弧度?

我试图转换这个 Obj-C代码到 Swift代码,但我不知道这个代码的等价物应该是什么?

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

我谷歌了一下,找到了 这个

但我不知道如何在斯威夫特的情况下转换?

76208 次浏览

Xcode 11• Swift 5.1或更高版本

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


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

游乐场

45.degreesToRadians         // 0.7853981633974483


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


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


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

如果你想让二进制整数返回一个浮点类型,而不是总是返回一个 CGFloat,你可以创建一个泛型方法,而不是一个计算属性:

extension BinaryInteger {
func degreesToRadians<F: FloatingPoint>() -> F {  F(self) * .pi / 180 }
}

let radiansDouble: Double = 45.degreesToRadians()   // 0.7853981633974483
let radiansCGFloat: CGFloat = 45.degreesToRadians() // 0.7853981633974483
let radiansFloat: Float = 45.degreesToRadians()     // 0.7853981
let radiansFloat80: Float80 = 45.degreesToRadians() // 0.78539816339744830963

苹果为转换提供了这些 GLKit 功能:

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

还有,把弧度转换成度数(如果有人在谷歌上偶然发现这个的话) :

var degrees = radians * (180.0 / M_PI)

在创建变量名时,您不再局限于 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

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

let result = Measurement(value: 45, unit: UnitAngle.degrees)
.converted(to: .radians).value
let angle = 45° // angle will be in radians, 45 is in degrees

Swift 3下编译。仍然保留所有的值,使用 CGFloats 以弧度进行所有的计算... ,但是使代码更容易阅读以度为单位的常量。< 强度 > 例如: 90 ° ° 符号会神奇地把度数转换成弧度。

如何设置:

Define and use a postfix operator for the ° sign. This operator will do the conversion from degrees to radians. 这个例子是针对 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

我会使用上面提到的同样的原则@t1ser,但是创建一个 CGFloat的扩展,以便更容易地使用小数来表示学位(例如,你可以使用23.4度) :

extension CGFloat {
func degrees() -> CGFloat {
return self * .pi / 180
}


init(degrees: CGFloat) {
self = degrees.degrees()
}
}

使用它也会非常容易(主要是因为我个人不知道如何输入 °-如果你也不知道的话,顺便说一下,它是 option+shift+8) :

let degreesToConvert: CGFloat = 45.7
.
.
.
let convertedDegrees = degreesToConvert.degrees()

Or to use the initialiser:

let convertedDegrees = CGFloat(degrees: 45.3)

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 { ... }

在度数和弧度之间转换 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 }
}

苹果公司的基金会团队很久以前就解决了这个问题,他们开发了一种超越其他所有解决方案的解决方案:

测量和单位 -WWDC 2016,第238节

如果导入 SwiftUI是可以的,或者如果你已经在使用它,你可以使用 Angle类型在角度单位之间进行转换,例如:

import SwiftUI


let radians = Angle(degrees: 45).radians

这将从 Double转换为 Double