Skip to content

Instantly share code, notes, and snippets.

@mbuchetics
Created November 26, 2018 09:25
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mbuchetics/e56a7ef7a2551af5089aa30ee246a976 to your computer and use it in GitHub Desktop.
Save mbuchetics/e56a7ef7a2551af5089aa30ee246a976 to your computer and use it in GitHub Desktop.
import Foundation
import CoreGraphics
import UIKit
extension UIBezierPath {
convenience init?(quadCurve points: [CGPoint]) {
guard points.count > 1 else { return nil }
self.init()
var p1 = points[0]
move(to: p1)
if points.count == 2 {
addLine(to: points[1])
}
for i in 0..<points.count {
let mid = midPoint(p1: p1, p2: points[i])
addQuadCurve(to: mid, controlPoint: controlPoint(p1: mid, p2: p1))
addQuadCurve(to: points[i], controlPoint: controlPoint(p1: mid, p2: points[i]))
p1 = points[i]
}
}
private func midPoint(p1: CGPoint, p2: CGPoint) -> CGPoint {
return CGPoint(x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2)
}
private func controlPoint(p1: CGPoint, p2: CGPoint) -> CGPoint {
var controlPoint = midPoint(p1: p1, p2: p2)
let diffY = abs(p2.y - controlPoint.y)
if p1.y < p2.y {
controlPoint.y += diffY
} else if p1.y > p2.y {
controlPoint.y -= diffY
}
return controlPoint
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment