Swift 如何告诉用户准确的度数朝向北方或东方?

Swift 如何告诉用户准确的度数朝向北方或东方?,swift,navigation,maps,Swift,Navigation,Maps,我正在创建一个导航应用程序。我想知道我现在的航向和,比如说,东方之间有多少度。我这样做的方式是,我用角度0减去真正的航向,如果是北面,90度,如果是东面,以此类推。当差值达到i:ClosedRange=0…20时,我猜航向是朝向预期的方向,在本例中,是东方 我想知道这是否是一种完美的方法。我仍然不知道是否应该使用轴承 //calculate the difference between two angles ( current heading and east angle, 90 degre

我正在创建一个导航应用程序。我想知道我现在的航向和,比如说,东方之间有多少度。我这样做的方式是,我用角度0减去真正的航向,如果是北面,90度,如果是东面,以此类推。当差值达到i:ClosedRange=0…20时,我猜航向是朝向预期的方向,在本例中,是东方

我想知道这是否是一种完美的方法。我仍然不知道是否应该使用轴承

  //calculate the difference between two angles ( current heading and east angle, 90 degrees)

    func cal(firstAngle: Double) -> Double {
        var diff = heading - 90
        if diff < -360 {
            diff += 360
        } else if diff > 360 {
            diff -= 360
        }
        return diff
    }

这应该适合你的需要。代码中的注释:

func cal(heading: Double, desired: Double) -> Double {
    // compute adjustment
    var angle = desired - heading

    // put angle into -360 ... 360 range
    angle = angle.truncatingRemainder(dividingBy: 360)

    // put angle into -180 ... 180 range
    if angle < -180 {
        angle += 360
    } else if angle > 180 {
        angle -= 360
    }

    return angle
}

// some example calls
cal(heading: 90, desired: 180)  // 90
cal(heading: 180, desired: 90)  // -90
cal(heading: 350, desired: 90)  // 100
cal(heading: 30, desired: 270)  // -120 

let within20degrees: ClosedRange<Double> = -20...20

let adjust = cal(heading: 105, desired: 90)
if within20degrees ~= adjust {
    print("heading in the right direction")
}

谢谢,先生!!这就是我一直在努力的方向。
  func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
        var heading = newHeading.trueHeading }
func cal(heading: Double, desired: Double) -> Double {
    // compute adjustment
    var angle = desired - heading

    // put angle into -360 ... 360 range
    angle = angle.truncatingRemainder(dividingBy: 360)

    // put angle into -180 ... 180 range
    if angle < -180 {
        angle += 360
    } else if angle > 180 {
        angle -= 360
    }

    return angle
}

// some example calls
cal(heading: 90, desired: 180)  // 90
cal(heading: 180, desired: 90)  // -90
cal(heading: 350, desired: 90)  // 100
cal(heading: 30, desired: 270)  // -120 

let within20degrees: ClosedRange<Double> = -20...20

let adjust = cal(heading: 105, desired: 90)
if within20degrees ~= adjust {
    print("heading in the right direction")
}
heading in the right direction