Как я могу конвертировать из градусов в радианы?
Я пытаюсь преобразовать этот Obj-C
код Swift
код, но я не знаю, что эквивалент этот код должен быть ?
#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)
я погуглил и нашел этот
но я не понимаю, как конвертировать это в Swift в моем случае?
8 ответов:
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
Это не то же самое, что вы спросили, но в Swift 3 / iOS 10 вы можете использовать тип измерения и выполнять преобразование, не зная формулы!
let result = Measurement(value: 45, unit: UnitAngle.degrees) .converted(to: .radians).value
Apple предоставляет эти функции GLKit для преобразования:
func GLKMathDegreesToRadians(_ degrees: Float) -> Float func GLKMathRadiansToDegrees(_ radians: Float) -> Float
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°)
предупреждение!
это слишком легко использовать это преобразование дважды (на значение уже в радианах по ошибке), вы получите очень небольшое число в результате, и, казалось бы, результирующий угол всегда будет равен нулю... Не используйте ° на одном и том же значении дважды (не конвертируйте дважды)!!:
// 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
кроме того, чтобы конвертировать fron radians в градусы (если кто-то наткнется на это в google):
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
Я бы использовал тот же принцип @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()
или использовать инициализатор:
let convertedDegrees = CGFloat(degrees: 45.3)
swift 2.3
func kilometersBetween(Place1:CLLocationCoordinate2D , Place2:CLLocationCoordinate2D) -> Double{ var start = MKMapPointForCoordinate(Place1) var finish = MKMapPointForCoordinate(Place2) print(MKMetersBetweenMapPoints(start, finish) / 1000) return MKMetersBetweenMapPoints(start, finish) / 1000 }