I’ve been working a lot with CALayers
over the past few days, specifically layers with circular shapes, and so these two little extensions have been really useful.
extension CGFloat { func degreesToRads() -> CGFloat { let rads = self * CGFloat(M_PI / 180 ) return rads } func positionOnCircleInRect(rect : CGRect) -> CGPoint { let rads = self.degreesToRads() - CGFloat( M_PI / 2) // Assume square let x = rect.size.width / 2 * CGFloat(cos(rads)) let y = rect.size.height / 2 * CGFloat(sin(rads)) return CGPointMake(x + (rect.size.height / 2) + rect.origin.x, y + (rect.size.height / 2) + rect.origin.x) } }
The first is your standard degrees to radians conversion function that every programmer that’s worked with UI has probably written at some point.
The second is a bit more interesting, though, as it finds a point on a circle within a frame of a given size (it also assumes that 0 is the top of the circle, not the right edge as in Core Animation):
let rectForCircle = CGRect(x: 0, y: 0, width: 50, height: 50 ) let point = CGFloat(90).positionOnCircleInRect(rectForCircle) // Returns x 50, y 25—or the point at 90º on a circle