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軸が上向きなのでそれにあわせた)
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
と同じ
蛇足
NSPoint
,NSSize
,NSRect
はそれぞれCGPoint
,CGSize
,CGRect
のエイリアス.