usar una nivel esta donde como celular calibrar brujula app ios algorithm geolocation ios6 mapkit

ios - una - donde esta la brujula en iphone 6



Cálculo del título de la brújula a una coordenada específica en lugar de al norte (2)

No puedo entender bien este algoritmo. Estoy tratando de hacer una brújula que apunte a un lugar determinado en lugar de solo señalar, digamos, el norte. Algo está mal. He pasado mucho tiempo tratando de resolver esto, pero simplemente no puedo encontrarlo. ¿Algunas ideas?

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{ double distanceEast = (location.longitude > 0 && otherLocation.longitude < 0) ? 180 - location.longitude + otherLocation.longitude - -180: otherLocation.longitude - location.longitude; if (distanceEast < 0) { distanceEast += 360; } double distanceWest = (location.longitude < 0 && otherLocation.longitude > 0) ? -180 - location.longitude - 180 - otherLocation.longitude : location.longitude - otherLocation.longitude; if (distanceWest < 0) { distanceWest += 360; } float latitudinalDifference = (otherLocation.latitude - location.latitude); float longitudinalDifference = fmin(distanceEast,distanceWest); float arcTan = atan(longitudinalDifference / latitudinalDifference); float oldRadian = (-manager.heading.trueHeading *M_PI /180.0f)+arcTan+M_PI; float newRadian = (-newHeading.trueHeading *M_PI /180.0f)+arcTan+M_PI; CABasicAnimation *animation; animation=[CABasicAnimation animationWithKeyPath:@"transform.rotation"]; animation.fromValue = [NSNumber numberWithFloat:oldRadian]; animation.toValue = [NSNumber numberWithFloat:newRadian]; animation.duration = 0.5f; directionsArrow.layer.anchorPoint = CGPointMake(0.5, 0.5); [directionsArrow.layer addAnimation:animation forKey:@"rotationCompass"]; directionsArrow.transform = CGAffineTransformMakeRotation(newRadian); }


"Mapa de sistemas de coordenadas" en la Guía de programación de reconocimiento de ubicación dice "Específicamente, en una proyección cartográfica de Mercator, una línea recta trazada entre dos puntos en el mapa produce un rumbo de rumbo que se puede usar en la navegación real en la superficie de la Tierra. "Esto me hace pensar que debes convertir las coordenadas de tu mapa a los puntos del mapa ( MKMapPointForCoordinate ) y llamar a atan sobre la diferencia entre los puntos del mapa. (En realidad, probablemente deberías usar atan2 , no atan .) ¿Lo has intentado?


double lon = location.longitude - otherLocation.longitude; double y = sin(lon) * cos(otherLocation.latitude); double x = cos(location.latitude) * sin(otherLocation.latitude) - sin(location.latitude) * cos(otherLocation.latitude) * cos(lon); double angle = atan2(y, x);

angle es el rumbo entre las dos ubicaciones.