Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let cource = VehicleModel.getCource(oldLatitude: oldLat, oldLongitude: oldLon, newLatitude: newLat, newLongitude: newLon)
- extension VehicleModel {
- static func getCource(oldLatitude: Double, oldLongitude: Double, newLatitude: Double, newLongitude: Double) -> Double {
- let oldLat = self.wrap180(degrees: oldLatitude)
- let oldLon = self.wrap90(degrees: oldLongitude)
- let newLat = self.wrap180(degrees: newLatitude)
- let newLon = self.wrap180(degrees: newLongitude)
- let fi1 = oldLat.toRadian()
- let fi2 = newLat.toRadian()
- let deltaS = (newLon - oldLon).toRadian()
- let deltaX = cos(fi1) * sin(fi2) - sin(fi1) * cos(fi2) * cos(deltaS)
- let deltaY = sin(deltaS) * cos(fi2)
- let bearing = atan2(deltaY, deltaX)
- return bearing.toDegrise()
- }
- }
- // MARK: - Helpers
- extension VehicleModel {
- private static func wrap180(degrees: Double) -> Double {
- if -180 < degrees && degrees <= 180 {
- return degrees
- }
- return ((degrees+540).truncatingRemainder(dividingBy: 360)) - 180
- }
- private static func wrap90(degrees: Double) -> Double {
- if (-90 < degrees) && (degrees <= 90) {
- return degrees
- }
- let val = (degrees.truncatingRemainder(dividingBy: 360) + 270).truncatingRemainder(dividingBy: 360) - 180
- return Double(abs(val)) - 90
- }
- private static func wrap360(degrees: Double) -> Double {
- if (0 <= degrees) && (degrees < 360) {
- return degrees
- }
- return (degrees.truncatingRemainder(dividingBy: 360) + 360).truncatingRemainder(dividingBy: 360)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement