Как я могу конвертировать из градусов в радианы?


Я пытаюсь преобразовать этот Obj-C код Swift код, но я не знаю, что эквивалент этот код должен быть ?

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

я погуглил и нашел этот

но я не понимаю, как конвертировать это в Swift в моем случае?

8 83

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
}