harry lakins harry lakins - 3 months ago 23
iOS Question

How to draw a line based on giving bearing/heading value at current location in iOS/swift?

I have been doing a ton of research but found nothing. With MapKit, I have got a map that shows current location and elsewhere a function that calculates a heading/bearing value (not necessarily the actual heading). How can I draw a line on the map that will start at current location, and point in direction of the given heading ? (Does not matter how long the line is, as in it has no meaningful end point). I am not asking you to write the code for me but would appreciate some detailed direction. Hope this helps others too.

Cheers

Answer

Your coordinates are polar, which means you have a direction and a length. You just need to convert them to Cartesian, which gives you a horizontal offset and a vertical offset. You do that with a little trigonometry.

let origin = CGPoint(x: 10, y: 10)
let heading: CGFloat = CGFloat.pi
let length: CGFloat = 20

let endpoint = CGPoint(x: origin.x + cos(heading)*length,
                       y: origin.y + sin(heading)*length)

let path = UIBezierPath()
path.move(to: origin)
path.addLine(to: endpoint)

Note that trigonometric functions generally work in radians (2*PI = one revolution). Bearings are often in degrees (360 degrees = one revolution). Converting is straightforward, however:

func radians(forDegrees angle: CGFloat) -> CGFloat {
    return CGFloat.pi * angle / 180.0
}