5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swift:CGPoint・CGSize用の演算子定義&Extension

Last updated at Posted at 2019-02-21

CGPoint編

CGPoint(NSPointでも可)の演算を円滑にするための便利な演算子と拡張の定義

//オリジナルの演算子ではないためinfix operatorはいらない

func + (left: CGPoint, right: CGPoint) -> CGPoint {
    return CGPoint(x: left.x + right.x, y: left.y + right.y)
}

func += (left: inout CGPoint, right: CGPoint) {
    left = left + right
}

func - (left: CGPoint, right: CGPoint) -> CGPoint {
    return CGPoint(x: left.x - right.x, y: left.y - right.y)
}

func -= (left: inout CGPoint, right: CGPoint) {
    left = left - right
}

func * (left: CGFloat, right: CGPoint) -> CGPoint {
    return CGPoint(x: left * right.x, y: left * right.y)
}

func * (left: CGPoint, right: CGFloat) -> CGPoint {
    return CGPoint(x: right * left.x, y: right * left.y)
}

func *= (left: inout CGPoint, right: CGFloat) {
    left = left * right
}

func / (left: CGPoint, right: CGFloat) -> CGPoint {
    assert(right != 0, "divide by zero")
    return CGPoint(x: left.x / right, y: left.y / right)
}

func /= (left: inout CGPoint, right: CGFloat) {
    assert(right != 0, "divide by zero")
    left = left / right
}

extension CGPoint {
    // xとyが同じ時の初期化
    init(_ scalar: CGFloat) {
        self.init(x: scalar, y: scalar)
    }
    // 二点間の距離を返す
    func length(from: CGPoint) -> CGFloat {
        return sqrt(pow(self.x - from.x, 2.0) + pow(self.y - from.y, 2.0))
    }
    // 二点を結んだ線分の角度(ラジアン)を返す
    func radian(from: CGPoint) -> CGFloat {
        return atan2(self.y - from.y, self.x - from.x)
    }
    // 二点を結んだ線分の角度(度)を返す    
    func degree(from: CGPoint) -> CGFloat {
        return atan2(self.y - from.y, self.x - from.x) * 180 / CGFloat.pi
    }
}

演算子の評価順序は基本的なものと変わらない.

取得できる角度はx軸を基準にした反時計回り(macOSの場合y軸が上向きなのでそれにあわせた)
degree.png

CGSize編

CGSize(NSSizeでも可)の演算を円滑にするための便利な演算子と拡張の定義

func + (left: CGSize, right: CGSize) -> CGSize {
    return CGSize(width: left.width + right.width, height: left.height + right.height)
}

func += (left: inout CGSize, right: CGSize) {
    left = left + right
}

func - (left: CGSize, right: CGSize) -> CGSize {
    return CGSize(width: left.width - right.width, height: left.height - right.height)
}

func -= (left: inout CGSize, right: CGSize) {
    left = left - right
}

func * (left: CGFloat, right: CGSize) -> CGSize {
    return CGSize(width: left * right.width, height: left * right.height)
}

func * (left: CGSize, right: CGFloat) -> CGSize {
    return CGSize(width: right * left.width, height: right * left.height)
}

func *= (left: inout CGSize, right: CGFloat) {
    left = left * right
}

func / (left: CGSize, right: CGFloat) -> CGSize {
    assert(right != 0, "divide by zero")
    return CGSize(width: left.width / right, height: left.height / right)
}

func /= (left: inout CGSize, right: CGFloat) {
    assert(right != 0, "divide by zero")
    left = left / right
}

extension CGSize {
    // widthとheightの大きさが同じ時の初期化
    init(_ side: CGFloat) {
        self.init(width: side, height: side)
    }
}

だいたいはCGPointと同じ

蛇足

NSPointNSSizeNSRectはそれぞれCGPointCGSizeCGRectのエイリアス.

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?