web-dev-qa-db-ja.com

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

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

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

グーグルで見つけた this

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

97
Dharmesh

Xcode 10•Swift 4.2以降

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

プレイグラウンド

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
236
Leo Dabus

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

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

Appleはこれらの GLKit関数 を変換用に提供しています:

func GLKMathDegreesToRadians(_ degrees: Float) -> Float
func GLKMathRadiansToDegrees(_ radians: Float) -> Float
42
Crashalot
let angle = 45° // angle will be in radians, 45 is in degrees

Swiftの下でコンパイルします。すべての値を保持し、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
16
t1ser

また、ラジアンから度に変換するには(グーグルで誰かがつまずいた場合):

var degrees = radians * (180.0 / M_PI)
11
nikans

変数名を作成するときに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
Ashley Mills

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

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

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

それを使用するのも同様に非常に簡単です(主に私は個人的に°を入力する方法を知らなかったので????-あなたがどちらもしなかった場合、それはoption+shift+8 btwです):

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

または、初期化子を使用するには:

let convertedDegrees = CGFloat(degrees: 45.3)
1
Septronic

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 { ... }
1