Swift/Footprint/Utilities.swift
/*  | 
Copyright (C) 2016 Apple Inc. All Rights Reserved.  | 
See LICENSE.txt for this sample’s licensing information  | 
Abstract:  | 
This contains several utility methods and extensions  | 
*/  | 
import Foundation  | 
import MapKit  | 
/**  | 
- parameter a:  | 
- parameter b:  | 
- note: If numbers are the same, always chooses first  | 
- returns: the SMALLER of the two numbers (not the minimum) e.g.  | 
smallest(-5.0, 0.01) returns 0.01.  | 
*/  | 
func smallest(_ a: Double, b: Double) -> Double { | 
return (fabs(a) <= fabs(b)) ? a: b  | 
}  | 
/**  | 
- parameter val: value to clamp.  | 
- parameter min: least possible value.  | 
- parameter max: greatest possible value.  | 
- returns: clamped version of val such that it falls between min and max.  | 
*/  | 
func clamp(_ val: Double, min: Double, max: Double) -> Double { | 
return (val < min) ? min : ((val > max) ? max : val)  | 
}  | 
extension MKMapPoint { | 
/**  | 
- parameter a: Point A.  | 
- parameter b: Point B.  | 
- returns: An MKMapPoint object representing the midpoints of a and b.  | 
*/  | 
    static func midpoint(_ a: MKMapPoint, b: MKMapPoint) -> MKMapPoint { | 
return MKMapPoint(x: (a.x + b.x) * 0.5, y: (a.y + b.y) * 0.5)  | 
}  | 
/**  | 
- parameter other: ending point.  | 
- returns: The MKMapPointDisplacement between two MKMapPoint objects.  | 
*/  | 
    func displacementToPoint(_ other: MKMapPoint) -> MKMapPointDisplacement { | 
let dx = (other.x - x)  | 
let dy = (other.y - y)  | 
let distance = hypot(dx, dy)  | 
return MKMapPointDisplacement(direction: MKMapDirection(eX: dx/distance, eY: dy/distance), distance: distance)  | 
}  | 
}  | 
extension CLLocationDistance { | 
/**  | 
- parameter a: coordinate A.  | 
- parameter b: coordinate B.  | 
- returns: The distance between the two coordinates.  | 
*/  | 
    static func distanceBetweenLocationCoordinates2D(_ a: CLLocationCoordinate2D, b: CLLocationCoordinate2D) -> CLLocationDistance { | 
let locA: CLLocation = CLLocation(latitude: a.latitude, longitude: a.longitude)  | 
let locB: CLLocation = CLLocation(latitude: b.latitude, longitude: b.longitude)  | 
return locA.distance(from: locB)  | 
}  | 
}  | 
extension CGPoint { | 
/**  | 
- parameter a: point A.  | 
- parameter b: point B.  | 
- returns: the mean point of the two CGPoint objects.  | 
*/  | 
    static func pointAverage(_ a: CGPoint, b: CGPoint) -> CGPoint { | 
return CGPoint(x:(a.x + b.x) * 0.5, y:(a.y + b.y) * 0.5)  | 
}  | 
}  | 
extension CGVector { | 
/**  | 
- parameter other: a vector.  | 
- returns: the dot product of the other vector with this vector.  | 
*/  | 
    func dotProductWithVector(_ other: CGVector) -> CGFloat { | 
return dx * other.dx + dy * other.dy  | 
}  | 
/**  | 
- parameter scale: how much to scale (e.g. 1.0, 1.5, 0.2, etc).  | 
- returns: a copy of this vector, rescaled by the amount given.  | 
*/  | 
    func scaledByFloat(_ scale: CGFloat) -> CGVector { | 
return CGVector(dx: dx * scale, dy: dy * scale)  | 
}  | 
/**  | 
- parameter radians: how many radians you want to rotate by.  | 
- returns: a copy of this vector, after being rotated in the  | 
"positive radians" direction by the amount given.  | 
- note: If your coordinate frame is right-handed, positive radians  | 
is counter-clockwise.  | 
*/  | 
    func rotatedByRadians(_ radians: CGFloat) -> CGVector { | 
let cosRadians = cos(radians)  | 
let sinRadians = sin(radians)  | 
return CGVector(dx: cosRadians * dx - sinRadians * dy, dy: sinRadians * dx + cosRadians * dy)  | 
}  | 
}  | 
extension CGPoint { | 
/**  | 
- parameter a: point A.  | 
- parameter b: point B.  | 
- returns: The hypotenuse defined by the two.  | 
*/  | 
    static func hypotenuse(_ a: CGPoint, b: CGPoint) -> Double { | 
return Double(hypot(b.x - a.x, b.y - a.y))  | 
}  | 
}  | 
extension MKMapRect { | 
/**  | 
- returns: The point at the center of the rectangle.  | 
- parameter rect: A rectangle.  | 
*/  | 
    func getCenter() -> MKMapPoint { | 
return MKMapPointMake(MKMapRectGetMidX(self), MKMapRectGetMidY(self))  | 
}  | 
/**  | 
- parameter rect: a rectangle.  | 
- returns: an MKMapRect converted to an MKPolygon.  | 
*/  | 
    func polygonFromMapRect() -> MKPolygon { | 
var corners = [MKMapPointMake(MKMapRectGetMaxX(self), MKMapRectGetMaxY(self)),  | 
MKMapPointMake(MKMapRectGetMinX(self), MKMapRectGetMaxY(self)),  | 
MKMapPointMake(MKMapRectGetMinX(self), MKMapRectGetMinY(self)),  | 
MKMapPointMake(MKMapRectGetMaxX(self), MKMapRectGetMinY(self))]  | 
return MKPolygon(points: &corners, count: corners.count)  | 
}  | 
}  | 
extension MKMapSize { | 
/// - returns: The area of this MKMapSize object  | 
    func area() -> Double { | 
return height * width  | 
}  | 
}  | 
Copyright © 2016 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2016-09-28