2015-03-21 2 views
71

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

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

Я гугле и нашел this

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

+0

Я думаю, что вам не хватает какой-то код. Можете ли вы добавить все соответствующие коды? Любой другой определяет, например, градусы? – BlackHatSamurai

+0

это мой быстрый код: http: //pastebin.com/bZ4a7EVN –

+0

Можете ли вы показать мне файл .h? – BlackHatSamurai

ответ

184

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

Разве вы не расширяете 'CGFloat'? – Zorayr

+1

@ Zorayr обновлен до Swift 3 и расширяет FloatingPoint теперь расширяет их все –

+2

На самом деле, в Swift 3 вы можете использовать типы измерений, и вам не нужно знать формулу преобразования вообще! – matt

35

компании Apple предоставляет эти GLKit functions для преобразования:

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

Кроме того, для преобразования FRON радианы в градусы (если кто-то натыкается на это на Google):

var degrees = radians * (180.0/M_PI) 
3

Вы больше не ограничены ASCII символов при создании имен переменных, так как об этом с помощью п (альт -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 
29

Это не тождественно, что вы просили, но в Swift 3/IOS 10, вы можете использовать измерение тип и сделать преобразование, не зная формулы!

let result = Measurement(value: 45, unit: UnitAngle.degrees) 
    .converted(to: .radians).value 
+2

Удивительный @matt на работе снова, спасибо! К сожалению, только iOS 10. –

12
let angle = 45° // angle will be in radians, 45 is in degrees 

компилирует под Свифта 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 
0

Я хотел бы использовать тот же принцип @ упомянутый выше 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) 
0

быстрое 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 
} 
Смежные вопросы