/* Copyright (C) 2016 Apple Inc. All Rights Reserved. See LICENSE.txt for this sample’s licensing information Abstract: Convenience math operators */ import QuartzCore func clip(_ x0: T, _ x1: T, _ v: T) -> T { return max(x0, min(x1, v)) } func lerp(_ v0: T, _ v1: T, _ t: T) -> T { return v0 + (v1 - v0) * t } func -(lhs: CGPoint, rhs: CGPoint) -> CGVector { return CGVector(dx: lhs.x - rhs.x, dy: lhs.y - rhs.y) } func -(lhs: CGPoint, rhs: CGVector) -> CGPoint { return CGPoint(x: lhs.x - rhs.dx, y: lhs.y - rhs.dy) } func -(lhs: CGVector, rhs: CGVector) -> CGVector { return CGVector(dx: lhs.dx - rhs.dx, dy: lhs.dy - rhs.dy) } func +(lhs: CGPoint, rhs: CGPoint) -> CGVector { return CGVector(dx: lhs.x + rhs.x, dy: lhs.y + rhs.y) } func +(lhs: CGPoint, rhs: CGVector) -> CGPoint { return CGPoint(x: lhs.x + rhs.dx, y: lhs.y + rhs.dy) } func +(lhs: CGVector, rhs: CGVector) -> CGVector { return CGVector(dx: lhs.dx + rhs.dx, dy: lhs.dy + rhs.dy) } func *(left: CGVector, right:CGFloat) -> CGVector { return CGVector(dx: left.dx * right, dy: left.dy * right) } extension CGPoint { var vector: CGVector { return CGVector(dx: x, dy: y) } } extension CGVector { var magnitude: CGFloat { return sqrt(dx*dx + dy*dy) } var point: CGPoint { return CGPoint(x: dx, y: dy) } func apply(transform t: CGAffineTransform) -> CGVector { return point.applying(t).vector } }