Swift version: 5.6

Finding where two lines cross can be done by calculating their cross product. The code below returns an optional tuple containing the X and Y intersection points, or nil if they don’t cross at all.

**Note:** Core Graphics doesn’t give us a `CGLine`

type, so you’ll need pass this four points: where the first line starts and ends, and where the second line starts and ends.

```
func linesCross(start1: CGPoint, end1: CGPoint, start2: CGPoint, end2: CGPoint) -> (x: CGFloat, y: CGFloat)? {
// calculate the differences between the start and end X/Y positions for each of our points
let delta1x = end1.x - start1.x
let delta1y = end1.y - start1.y
let delta2x = end2.x - start2.x
let delta2y = end2.y - start2.y
// create a 2D matrix from our vectors and calculate the determinant
let determinant = delta1x * delta2y - delta2x * delta1y
if abs(determinant) < 0.0001 {
// if the determinant is effectively zero then the lines are parallel/colinear
return nil
}
// if the coefficients both lie between 0 and 1 then we have an intersection
let ab = ((start1.y - start2.y) * delta2x - (start1.x - start2.x) * delta2y) / determinant
if ab > 0 && ab < 1 {
let cd = ((start1.y - start2.y) * delta1x - (start1.x - start2.x) * delta1y) / determinant
if cd > 0 && cd < 1 {
// lines cross – figure out exactly where and return it
let intersectX = start1.x + ab * delta1x
let intersectY = start1.y + ab * delta1y
return (intersectX, intersectY)
}
}
// lines don't cross
return nil
}
```

Note: this code is adapted from “Intersection of Two Lines in Three-Space”, which is a one-page chapter by Ronald Goodman in the book Graphics Gems. For more on how cross products work, I can highly recomend the book “Essential Mathematics for Games and Interactive Applications” by James M. Van Verth and Lars M. Bishop.

**SPONSORED** AppSweep by Guardsquare helps developers automate the mobile app security testing process with fast, free scans. By using AppSweep’s actionable recommendations, developers can improve the security posture of their apps in accordance with security standards like OWASP.

Sponsor Hacking with Swift and reach the world's largest Swift community!

Available from iOS 8.0

- How to calculate the distance between two CGPoints
- How to calculate the Manhattan distance between two CGPoints
- How to get the lines in a string as an array
- How to draw lines in Core Graphics: move(to:) and addLine(to:)
- How to specify floating-point precision in a string

This is part of the Swift Knowledge Base, a free, searchable collection of solutions for common iOS questions.

Link copied to your pasteboard.