If it consists of a series of line segments, you can adapt Martin R's response to the UIBezierPath intersection to not only detect intersections, but also determine where the intersections
func intersectionBetweenSegments(p0: CGPoint, _ p1: CGPoint, _ p2: CGPoint, _ p3: CGPoint) -> CGPoint? { var denominator = (p3.y - p2.y) * (p1.x - p0.x) - (p3.x - p2.x) * (p1.y - p0.y) var ua = (p3.x - p2.x) * (p0.y - p2.y) - (p3.y - p2.y) * (p0.x - p2.x) var ub = (p1.x - p0.x) * (p0.y - p2.y) - (p1.y - p0.y) * (p0.x - p2.x) if (denominator < 0) { ua = -ua; ub = -ub; denominator = -denominator } if ua >= 0.0 && ua <= denominator && ub >= 0.0 && ub <= denominator && denominator != 0 { return CGPoint(x: p0.x + ua / denominator * (p1.x - p0.x), y: p0.y + ua / denominator * (p1.y - p0.y)) } return nil }
Thus, if you have an array of CGPoint
values and you want to identify all the intersections, you can do something like:
let n = points!.count - 1 for i in 1 ..< n { for j in 0 ..< i-1 { if let intersection = intersectionBetweenSegments(points![i], points![i+1], points![j], points![j+1]) {
For example, you can add a point to the screen where the segments intersect:

If, however, your curve consists of cubic Bezier curves, this is more complicated. However, you can consider Checking if two Bézier Bézier curves intersect .
source share