Swift version: 5.0

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.

**HACKING WITH SWIFT LIVE** This July is a new two-day event where you'll be inspired by great speakers on day one then learn all the amazing new features from WWDC on day two – click here for more information and tickets.

Available from iOS 8.0

Did this solution work for you? Please pass it on!

**Other people are reading…**

- How to compare two CGRects with equalTo()
- How to find the translation from a CGAffineTransform
- How to find the rotation from a CGAffineTransform
- How to draw lines in Core Graphics: move(to:) and addLine(to:)
- How to find the scale from a CGAffineTransform

**About the Swift Knowledge Base**

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