Как я могу конвертировать из градусов в радианы?
Я пытаюсь преобразовать этот код Obj-C
в код Swift
, но я не знаю, какой должен быть эквивалент этого кода?
#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)
Я googled и нашел this
Но я не понимаю, как преобразовать это в Swift в моем случае?
Ответы
Ответ 1
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
Ответ 2
Apple предоставляет эти функции GLKit для преобразования:
func GLKMathDegreesToRadians(_ degrees: Float) -> Float
func GLKMathRadiansToDegrees(_ radians: Float) -> Float
Ответ 3
Это не то же самое, что вы просили, но в Swift 3/iOS 10 вы можете использовать тип измерения и выполнять преобразование, не зная формулы!
let result = Measurement(value: 45, unit: UnitAngle.degrees)
.converted(to: .radians).value
Ответ 4
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
Ответ 5
Кроме того, чтобы преобразовать fron radians в градусы (если кто-то наткнется на это в google):
var degrees = radians * (180.0 / M_PI)
Ответ 6
Вы больше не ограничены символами 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
Ответ 7
Я бы использовал один и тот же принцип @t1ser, упомянутый выше, но создаю расширение CGFloat
, чтобы упростить использование десятичных знаков для степени (например, вы могли бы иметь 23,4 градуса):
extension CGFloat {
func degrees() -> CGFloat {
return self * .pi / 180
}
init(degrees: CGFloat) {
self = degrees.degrees()
}
}
Использование этого было бы довольно легко (в основном потому, что я лично не знал, как набирать ° 😜 - в случае, если вы этого не сделали, это option+shift+8
btw):
let degreesToConvert: CGFloat = 45.7
.
.
.
let convertedDegrees = degreesToConvert.degrees()
Или использовать инициализатор:
let convertedDegrees = CGFloat(degrees: 45.3)