CGPathIntersection
CGPathIntersection is a library for iOS, macOS, and tvOS that identifies points where two CGPath
s 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.
Installation
Swift Package Manager
Add the following dependency to your package definition:
.package(
name: "CGPathIntersection",
url: "https://github.com/calda/CGPathIntersection.git",
from: "4.0")
Carthage
Add github "calda/CGPathIntersection"
to your Cartfile
CocoaPods
Add pod 'CGPathIntersection'
to your Podfile
Usage
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) }
Example
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: