度からラジアンに変換するにはどうすればよいですか?


107

このObj-CコードをSwiftコードに変換しようとしていますが、このコードに相当するものを知りませんか?

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

私はググってこれを見つけ

しかし、私の場合、それをSwiftで変換する方法がわかりませんか?


コードが不足していると思います。関連するすべてのコードをすべて追加できますか?学位のような他の定義はありますか?
BlackHatSamurai 2015年

これは私のSWIFTコードです:pastebin.com/bZ4a7EVN
Dharmesh Kheni

.hファイルを見せていただけますか?
BlackHatSamurai 2015年

マクロです。機能が欲しい。
gnasher729 2016

回答:


265

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を返すのではなく、2進整数が浮動小数点型を返すようにしたい場合は、計算されたプロパティの代わりにジェネリックメソッドを作成できます。

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、2015

1
@ZorayrがSwift 3に更新され、FloatingPointを拡張すると、すべてが拡張されます
Leo Dabus

3
実際、Swift 3ではMeasurementタイプを使用でき、変換式をまったく知る必要はありません。
マット

3
ただし、このスーパープロのヒント... stackoverflow.com/a/28600210/294884
Fattie

1
理由のない投票は意味がありません。コメントを投稿する
レオダバス

63

これはあなたが尋ねたものと同じではありませんが、Swift 3 / iOS 10では、Measurementタイプを使用して、式を知らなくても変換を実行できます!

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

4
素晴らしい@mattが再び働きました、ありがとう!残念ながらiOS 10のみです。
意味の問題

radians = 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

そして、「 'Measurement'はiOS 10.0以降でのみ利用可能」
Zaporozhchenko Oleksandr '12

42

Appleは、変換用に次のGLKit関数を提供しています。

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

GLKitはまもなくステージから外れます。今はメタルの世界、さようならGLです。iPadアプリをMacに移植するため、GLKitはサポートされなくなりました。
ジュガン

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

Swift 3でコンパイルします。それでもすべての値を保持し、すべての計算をCGFloatsでラジアンで行いますが、定数を度数で読みやすくします。例:90 °°記号は、魔法のように度をラジアンに変換します。

これを設定する方法:

°記号に後置演算子を定義して使用します。この演算子は度からラジアンへの変換を行います。この例はInt用です。必要に応じて、これらを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°)

警告!

この変換を2回使用するのは簡単すぎます(既に誤ってラジアンの値になっている場合)。結果として非常に小さい数値が得られ、結果として得られる角度は常にゼロになるようです。同じ上では°を使用しないでください値を2回(2回変換しないでください)!!:

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

ところで、この演算子をジェネリックにして、任意の整数をサポートし、浮動小数点を返すこともできます。public extension FixedWidthInteger { postfix static func °<T: FloatingPoint>(lhs: Self) -> T { T(lhs) * .pi / 180 } }
レオダバス

ジェネリックメソッドを作成するときにコメントする前に、コンパイラが結果の型を推測できない場合は、結果の型を明示的に設定する必要がありますlet angle: CGFloat = 45°。しかし、それがa CGFloatまたはいずれかのFloatingPointタイプを期待する場所では必要ありませんCGAffineTransform(rotationAngle: 45°)
レオダバス

11

また、フロンラジアンを度数に変換するには(グーグルでこれに遭遇した場合):

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

Swift 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タイプです。Swiftでは、異なるタイプの計算はできません。
Tikhonov Alexander

あなたは間違っている。Swiftはタイプを推測できます。FloatingPointタイプを拡張する場合とまったく同じように動作します。180は何でもかまいません。必ずしもIntではありません
Leo Dabus

1
FloatingPointはExpressibleByIntegerLiteralに準拠しているため、そこで180を書き込むことができます
Leo Dabus

1
Tは必ずしもDoubleではないため、180.0にはTが必要です。任意の浮動小数点型にすることができます。ダブル180.0から新しいものを初期化します
レオダバス

1

上記と同じ原則@ t1serを使用しますが、次数の拡張を作成CGFloatして、次数にも小数を使用しやすくします(たとえば、23.4度にすることができます)。

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

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

それを使用することも非常に簡単です(主に私が個人的に°typeを入力する方法を知らなかったため-どちらかを知らなかった場合、それは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 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.