【iOS】SwiftでCGAffineTransformから角度・ラジアン・度数・スケールを計算する方法


メモ

Swift 4 でtransformから角度、ラジアン、ディグリー、スケールを求める 忘れがちなので・・・。


let transform = view.transform
let radians = atan2(transform.b, transform.a)
let degrees = radians * 180 / .pi
let scale = sqrt(abs(transform.a * transform.d - transform.b * transform.c))

import CoreGraphics

extension CGAffineTransform {
    var angle: CGFloat {
        return atan2(b, a)
    }
    
    var radians: CGFloat {
        return angle
    }
    
    var degrees: CGFloat {
        return angle * 180.0 / CGFloat.pi
    }
    
    var scale: CGPoint {
        return CGPoint(x: sqrt(a * a + c * c), y: sqrt(b * b + d * d))
    }
}

// 例として、適当な CGAffineTransform を作成
let transform = CGAffineTransform(rotationAngle: CGFloat.pi/4).scaledBy(x: 2.0, y: 1.5)

let angleInRadians = transform.radians
let angleInDegrees = transform.degrees
let scale = transform.scale

print("Angle in radians: \(angleInRadians)")
print("Angle in degrees: \(angleInDegrees)")
print("Scale: \(scale)")

2024/06/14 、コメント多めに書き直してみた。

import CoreGraphics

// CGAffineTransformの拡張機能を定義
extension CGAffineTransform {
    
    // 現在の変換の回転角度をラジアン単位で取得
    var angle: CGFloat {
        return atan2(b, a)
    }
    
    // 回転角度をラジアンで取得('angle'プロパティのエイリアス)
    var radians: CGFloat {
        return angle
    }
    
    // 回転角度を度数法で取得
    var degrees: CGFloat {
        return angle * 180.0 / CGFloat.pi
    }
    
    // 現在の変換のスケールをCGPointとして取得
    var scale: CGPoint {
        return CGPoint(x: sqrt(a * a + c * c), y: sqrt(b * b + d * d))
    }
}

// 例として、回転とスケールを含むCGAffineTransformを作成
let transform = CGAffineTransform(rotationAngle: CGFloat.pi / 4).scaledBy(x: 2.0, y: 1.5)

// 回転角度をラジアンで取得
let angleInRadians = transform.radians

// 回転角度を度数法で取得
let angleInDegrees = transform.degrees

// スケールを取得
let scale = transform.scale

// 結果を出力
print("Angle in radians: \(angleInRadians)") // 出力: 回転角度(ラジアン)
print("Angle in degrees: \(angleInDegrees)") // 出力: 回転角度(度数法)
print("Scale: \(scale)") // 出力: スケール

2025/03/21 、AIに添削してもらった


import CoreGraphics

// CGAffineTransformの拡張機能を定義
extension CGAffineTransform {
    // 現在の変換の回転角度をラジアン単位で取得
    var angle: CGFloat {
        // atan2(b, a)は、aが0の場合に問題が発生する可能性があるため、特別な処理を行う
        let angle = atan2(b, a)
        return angle
    }

    // 回転角度をラジアンで取得('angle'プロパティのエイリアス)
    var radians: CGFloat {
        return angle
    }

    // 回転角度を度数法で取得
    var degrees: CGFloat {
        return angle * 180.0 / CGFloat.pi
    }

    // 現在の変換のスケールをCGPointとして取得
    var scale: CGPoint {
        // より正確なスケールを求めるために、aとdの平均の平方根を使用する
        let scaleX = sqrt(a * a + c * c)
        let scaleY = sqrt(b * b + d * d)
        return CGPoint(x: scaleX, y: scaleY)
    }
}

// 例として、回転とスケールを含むCGAffineTransformを作成
let transform = CGAffineTransform(rotationAngle: CGFloat.pi / 4).scaledBy(x: 2.0, y: 1.5)

// 回転角度をラジアンで取得
let angleInRadians = transform.radians

// 回転角度を度数法で取得
let angleInDegrees = transform.degrees

// スケールを取得
let scale = transform.scale

// 結果を出力
print("Angle in radians: \(angleInRadians)") // 出力: 回転角度(ラジアン)
print("Angle in degrees: \(angleInDegrees)") // 出力: 回転角度(度数法)
print("Scale: \(scale)") // 出力: スケール

コメント

このブログの人気の投稿

【Android】WebViewのズームボタン(ピンチイン・ピンチアウト)を非表示にする方法

【iOS】UILabelでヒラギノフォントの上下が切れる問題と対処法