ios - segundos - convertir grados a radianes
¿Cómo puedo convertir de grados a radianes? (9)
Además, para convertir fron radianes a grados (si alguien se topa con esto en google):
var degrees = radians * (180.0 / M_PI)
Estoy tratando de convertir este código
Obj-C
código
Swift
pero no sé cuál debería ser el equivalente de este código.
#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)
Busqué en Google y encontré this
¿Pero no entiendo cómo convertir eso en Swift en mi caso?
Apple proporciona estas funciones GLKit para la conversión:
func GLKMathDegreesToRadians(_ degrees: Float) -> Float
func GLKMathRadiansToDegrees(_ radians: Float) -> Float
Esto no es idéntico a lo que pediste, pero en Swift 3 / iOS 10, puedes usar el tipo de medición y hacer la conversión sin conocer la fórmula.
let result = Measurement(value: 45, unit: UnitAngle.degrees)
.converted(to: .radians).value
Usaría el mismo principio @ t1ser mencionado anteriormente, pero creo una extensión de
CGFloat
para que también sea más fácil usar decimales para el grado (para que pueda tener 23.4 grados, por ejemplo):
extension CGFloat {
func degrees() -> CGFloat {
return self * .pi / 180
}
init(degrees: CGFloat) {
self = degrees.degrees()
}
}
Usarlo también sería bastante fácil (principalmente porque personalmente no sabía cómo escribir ° 😜; en caso de que tampoco lo hicieras, es
option+shift+8
cierto):
let degreesToConvert: CGFloat = 45.7
.
.
.
let convertedDegrees = degreesToConvert.degrees()
O para usar el inicializador:
let convertedDegrees = CGFloat(degrees: 45.3)
Ya no estás limitado a los caracteres ASCII cuando creas nombres de variables, entonces, ¿qué tal esto usando π (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
}
}
Ejemplo de uso:
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
rápido 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
}
Swift 4.2
Puede escribir funciones genéricas globales:
public func radians<T: FloatingPoint>(degrees: T) -> T {
return .pi * degrees / 180
}
public func degrees<T: FloatingPoint>(radians: T) -> T {
return radians * 180 / .pi
}
Ejemplo:
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
En caso de que no desee ampliar todos sus tipos flotantes como este
extension FloatingPoint { ... }
Xcode 10 • Swift 4.2 o posterior
extension BinaryInteger {
var degreesToRadians: CGFloat { return CGFloat(self) * .pi / 180 }
}
extension FloatingPoint {
var degreesToRadians: Self { return self * .pi / 180 }
var radiansToDegrees: Self { return self * 180 / .pi }
}
Patio de recreo
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
let angle = 45° // angle will be in radians, 45 is in degrees
Compila bajo Swift 3 . Todavía mantenga todos los valores, haga todos los cálculos en radianes con CGFloats ..., pero haga que el código sea más legible con las constantes en grados. Por ejemplo: 90 ° El signo ° hará mágicamente la conversión de grados a radianes.
Cómo configurar esto:
Defina y use un operador postfix para el signo ° . Este operador realizará la conversión de grados a radianes. Este ejemplo es para Ints, extiéndelos también para los tipos Float si es necesario.
postfix operator °
protocol IntegerInitializable: ExpressibleByIntegerLiteral {
init (_: Int)
}
extension Int: IntegerInitializable {
postfix public static func °(lhs: Int) -> CGFloat {
return CGFloat(lhs) * .pi / 180
}
}
Algunos ejemplos de uso:
let angle = 45°
contentView.transform = CGAffineTransform(rotationAngle: 45°)
let angle = 45
contentView.transform = CGAffineTransform(rotationAngle: angle°)
¡Advertencia!
Es muy fácil usar esta conversión dos veces (en un valor que ya está en radianes por error), obtendrá un número muy pequeño como resultado, y aparentemente el ángulo resultante siempre será cero ... NO use ° en el mismo valor dos veces (no convertir dos veces) !!:
// 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