:curly_loop: A library that identifies points where two CGPaths intersect
https://github.com/calda/CGPathIntersection.git
CGPathIntersection is a library for iOS, macOS, and tvOS that identifies points where two CGPaths intersect.
Surprisingly, this is not provided out-of-the-box by CoreGraphics. Intersections can be calculated analytically for simple geometric shapes (especially straight lines), but that method becomes rather challenging when considering a CGPath can be arbitrarily complex. CGPathIntersection solves this problem by rendering each path into an image and then finding the exact pixels where they intersect.
.package(
name: "CGPathIntersection",
url: "https://github.com/calda/CGPathIntersection.git",
from: "4.0.0")
github "calda/CGPathIntersection" to your Cartfile
pod 'CGPathIntersection' to your Podfile
import CGPathIntersection
let path1 = CGPath(...)
let path2 = CGPath(...)
path1.intersects(path2) // returns a boolean
path1.intersectionPoints(with: path2) // returns an array of points
If performing many calculations, you can increase performance by creating a CGPathImage. Any calculations performed on a pre-existing CGPathImage will run faster than the same calculation performed on a raw CGPath.
import CGPathIntersection
let pathImage = CGPathImage(from: CGPath(...))
let otherPathImages: [CGPathImage] = [...]
let intersectingPaths = otherPathImages.filter { pathImage.intersects($0) }
CGPathIntersection was created as a component of Streets, a prototype SpriteKit game that simulates managing a network of streets. Streets uses CGPathIntersection to connect individual roads together with physical intersections. When a car reaches an intersection, it makes a random turn onto one of the other connected roads.
Streets also has some support for more complex paths, like roundabouts: