我是Objective-c的新手,所以如果我的问题太垃圾,我想道歉。
我正在编程指南针,但它正在工作(感谢教程)。 给出实际位置(经度和纬度)。 罗盘内的箭头是否可以显示指向特定位置(经度2和纬度2)的方向? 我已经读过,我必须考虑iPhone的磁性和真实标题。
答案 0 :(得分:3)
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
double heading = newHeading.trueHeading; //in degree relative to true north
double bearing = ... //get current bearing in degree relative to true north
//with the JS library mentioned below it would be something like
//bearing = userLoc.bearingTo(destionation);
//just two lines, the the sake of the example
double rotationInDegree = (bearing - heading); //the important line
rotationInDegree = fmod((rotationInDegree + 360), 360); //just to be on the safe side :-)
compassViewPerhapsAsImage.transform=CGAffineTransformMakeRotation(DegreesToRadians(rotationInDegree));
}
计算轴承的良好链接:
答案 1 :(得分:1)
如果你不需要它太准确,那么它相当容易。您需要做的就是计算2个点之间的角度,并在指南针上显示角度。 (由于你还没有发布代码,我不确定你是否有类似setAngleForCompass
的方法,但你应该这样做!)试试这个:
float dx = Longitude2 - Longitude1;
float dy = Latitude2 - Latitude1;
float angle = atan2(dy, dx);
// Set the angle of the compass here.
或者,您可以使用CMMotionManager访问陀螺仪,这也将指向正确的方向。 (双关语!)希望有帮助!
答案 2 :(得分:0)
我还需要计算前往某个位置的航向。我发现的最好方法是使用余弦球面定律。我创建了C函数来实现它,它们可用Here on github。听起来你需要headingInDegrees函数。这将给你一个真正的标题。
答案 3 :(得分:0)
来自tadeldv的CLLocation-Bearing项目: https://github.com/tadelv/CLLocation-Bearing
CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;}
CGFloat RadiansToDegrees(CGFloat radians) {return radians * 180 / M_PI;}
- (void)calculating bearing {
float lat1 = DegreesToRadians(YOURCURRENTPOSITION.coordinate.latitude);
float lng1 = DegreesToRadians(YOURCURRENTPOSITION.coordinate.longitude);
float lat2 = DegreesToRadians(YOURTARGETPOSITION.coordinate.latitude);
float lng2 = DegreesToRadians(YOURTARGETPOSITION.coordinate.longitude);
float deltalng = lng2 - lng1;
double y = sin(deltalng) * cos(lat2);
double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(deltalng);
double bearing = atan2(y, x) + 2 * M_PI;
float bearingDegrees = RadiansToDegrees(bearing);
bearingDegrees = (int)bearingDegrees % 360;
NSLog(@"%d", (int)bearingDegrees);
}
这会给你北极和目标之间的天使。那么你必须加/减你当前航向的角度。
答案 4 :(得分:-1)
到目前为止我的代码:
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{double heading = newHeading.trueHeading;
[self rotateCompass:heading];
}
- (void) rotateCompass: (double) degrees{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:2];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView commitAnimations];
compassRose.transform = CGAffineTransformMakeRotation(degrees);
}
我有其他例程来获取纬度,经度和标签显示标题并且它有效。 我的箭无缘无故疯狂地旋转。 我希望箭头指向与trueHeading相同的方向。 这意味着iPhone的方式