도에서 라디안으로 어떻게 변환 할 수 있습니까?


107

Obj-C코드를 Swift코드 로 변환하려고하는데이 코드에 해당하는 것이 무엇인지 모르겠습니다.

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

나는 봤는데 이것을 발견 했다.

하지만 내 경우에는 Swift에서 변환하는 방법을 이해하지 못합니까?


일부 코드가 누락 된 것 같습니다. 모든 관련 코드를 추가 할 수 있습니까? 학위와 같은 다른 정의가 있습니까?
BlackHatSamurai

이건 내 빠른 코드 : pastebin.com/bZ4a7EVN
다르 메쉬 Kheni

.h 파일을 보여줄 수 있습니까?
BlackHatSamurai

매크로입니다. 당신은 기능을 원합니다.
gnasher729

답변:


266

Xcode 11 • Swift 5.1 이상

extension BinaryInteger {
    var degreesToRadians: CGFloat { CGFloat(self) * .pi / 180 }
}

extension FloatingPoint {
    var degreesToRadians: Self { self * .pi / 180 }
    var radiansToDegrees: Self { self * 180 / .pi }
}

운동장

45.degreesToRadians         // 0.7853981633974483

Int(45).degreesToRadians    // 0.7853981633974483
Int8(45).degreesToRadians   // 0.7853981633974483
Int16(45).degreesToRadians  // 0.7853981633974483
Int32(45).degreesToRadians  // 0.7853981633974483
Int64(45).degreesToRadians  // 0.7853981633974483

UInt(45).degreesToRadians   // 0.7853981633974483
UInt8(45).degreesToRadians  // 0.7853981633974483
UInt16(45).degreesToRadians // 0.7853981633974483
UInt32(45).degreesToRadians // 0.7853981633974483
UInt64(45).degreesToRadians // 0.7853981633974483

Double(45).degreesToRadians    // 0.7853981633974483
CGFloat(45).degreesToRadians   // 0.7853981633974483
Float(45).degreesToRadians     // 0.7853981
Float80(45).degreesToRadians   // 0.78539816339744830963

이진 정수가 항상 CGFloat를 반환하는 대신 부동 소수점 유형을 반환하도록하려면 계산 된 속성 대신 일반 메서드를 만들 수 있습니다.

extension BinaryInteger {
    func degreesToRadians<F: FloatingPoint>() -> F {  F(self) * .pi / 180 }
}

let radiansDouble: Double = 45.degreesToRadians()   // 0.7853981633974483
let radiansCGFloat: CGFloat = 45.degreesToRadians() // 0.7853981633974483
let radiansFloat: Float = 45.degreesToRadians()     // 0.7853981
let radiansFloat80: Float80 = 45.degreesToRadians() // 0.78539816339744830963

4
연장해야하지 CGFloat않습니까?
Zorayr

1
스위프트 3 업데이트 및 부동 소수점을 확장하는 것은 지금 모든 확장 @Zorayr
레오 버스들이시길

3
실제로 Swift 3에서는 측정 유형을 사용할 수 있으며 변환 공식을 전혀 알 필요가 없습니다!
matt

3
참고 그러나이
슈퍼 프로

1
이유없이 투표하는 것은 의미가 없습니다. 코멘트를 게시
레오 버스들이시길

63

이것은 당신이 요청한 것과 동일하지는 않지만 Swift 3 / iOS 10에서는 공식을 몰라도 측정 유형을 사용하고 변환을 수행 할 수 있습니다!

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

4
다시 직장에서 놀라운 @matt, 감사합니다! 불행히도 iOS 10 만 있습니다.
의미 - 중요한

라디안 = CGFloat (30.3 * .pi / 180.0) let radians2 = Measurement (value : 30.3, unit : UnitAngle.degrees) .converted (to : .radians) .value는 다를 것입니다 : 0.5288347633542818 및 0.5288345742619878
Zaporozhchenko Oleksandr

" '측정'은 iOS 10.0 이상에서만 사용할 수 있습니다."
Zaporozhchenko Oleksandr

42

Apple은 변환을 위해 다음 GLKit 함수 를 제공합니다 .

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

GLKit은 이제 Metal의 세계인 bye GL이기 때문에 곧 무대에서 나옵니다. iPad 앱을 Mac으로 이식함에 따라 GLKit은 더 이상 지원되지 않습니다!.
Juguang

17
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°)

경고!

이 변환을 두 번 사용하는 것은 너무 쉽습니다 (실수로 이미 라디안으로 표시된 값에서) 결과로 매우 작은 숫자를 얻게되고 결과 각도는 항상 0이됩니다. 동일한 값에 °를 사용하지 마십시오. 값을 두 번 (두 번 변환하지 마십시오) !! :

// 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

IntegerInitializable프로토콜은 무의미합니다. Int는 이미 준수ExpressibleByIntegerLiteral
Leo Dabus

Btw이 연산자를 일반화하여 모든 정수를 지원하고 부동 소수점도 반환 할 수 있습니다. public extension FixedWidthInteger { postfix static func °<T: FloatingPoint>(lhs: Self) -> T { T(lhs) * .pi / 180 } }
Leo Dabus

제네릭 메서드를 생성 할 때 이에 대해 주석을 달기 전에 컴파일러가 결과 유형을 추론 할 수없는 경우 결과 유형을 명시 적으로 설정해야합니다 let angle: CGFloat = 45°. 그러나 그것이 기대 어디에 필요하지 않습니다 CGFloat또는 FloatingPoint유형CGAffineTransform(rotationAngle: 45°)
레오 버스들이시길

11

또한 fron 라디안을 각도로 변환하려면 (누군가가 Google에서 이것을 우연히 발견하는 경우) :

var degrees = radians * (180.0 / M_PI)

3

변수 이름을 만들 때 더 이상 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

2

스위프트 4.2

전역 일반 함수를 작성할 수 있습니다.

public func radians<T: FloatingPoint>(degrees: T) -> T {
    return .pi * degrees / 180
}

public func degrees<T: FloatingPoint>(radians: T) -> T {
    return radians * 180 / .pi
}

예:

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

이와 같이 모든 플로팅 유형을 확장하고 싶지 않은 경우

extension FloatingPoint { ... }

왜 간단하지 return .pi * degrees / 180않습니까?
Leo Dabus

@LeoDabus TFloatingPoint유형이고 180은 Int유형 이기 때문 입니다 . 신속하게 다른 유형에 대한 계산을 수행 할 수 없습니다.
Tikhonov Alexander

당신은 잘못. Swift는 유형을 추론 할 수 있습니다. FloatingPoint 유형을 확장하는 것과 동일하게 작동합니다. 180은 무엇이든 될 수 있습니다. 반드시 int로
레오 버스들이시길

1
ExpressibleByIntegerLiteral에 부동 소수점을 따르는 지 당신이 거기에 180을 쓸 수있는 이유의
레오 버스들이시길

1
180.0은 T가 반드시 Double이 아니기 때문에 T가 필요합니다. 임의의 부동 소수점 유형이 될 수 있습니다. 당신은 당신의 이중 180.0에서 새를 초기화
레오 버스들이시길

1

위에서 언급 한 동일한 원칙 @ t1ser를 사용하지만 CGFloat, 정도에 대해 소수를 더 쉽게 사용할 수 있도록 확장을 만듭니다 (예를 들어 23.4도를 가질 수 있음).

extension CGFloat {
    func degrees() -> CGFloat {
        return self * .pi / 180
    }

    init(degrees: CGFloat) {
        self = degrees.degrees()
    }
}

그것을 사용하는 것도 꽤 쉬울 것입니다 (주로 나는 개인적으로 ° 😜을 입력하는 방법을 몰랐기 때문에-당신도 그렇지 않은 경우 option+shift+8btw입니다) :

let degreesToConvert: CGFloat = 45.7
.
.
.
let convertedDegrees = degreesToConvert.degrees()

또는 이니셜 라이저를 사용하려면 :

let convertedDegrees = CGFloat(degrees: 45.3)

-5

신속한 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
} 

1
이 코드가 질문에 답할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
Nic3500
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.