gpt4 book ai didi

iphone - 使用指南针指向位置

转载 作者:行者123 更新时间:2023-12-03 18:54:41 25 4
gpt4 key购买 nike

我正在尝试为应用程序开发一个指南针,该应用程序在 map 上有一组注释。我希望能够选择注释,然后让指南针将用户指向所选位置。

我已经计算了从用户位置到注释位置的度数,并且我有磁航向和 iPhone 的真实航向。我也知道如何旋转图像。但我不知道下一步是什么。

用户位置和注释位置之间的度数计算如下:

    // get user location
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
[locationManager startUpdatingLocation];
[locationManager startUpdatingHeading];
CLLocation *location = [locationManager location];
CLLocationCoordinate2D coordinate = [location coordinate];

float x1 = coordinate.latitude;
float y1 = coordinate.longitude;
float x2 = [annLatitude floatValue];
float y2 = [annLongitude floatValue];

float dx = (x2 - x1);
float dy = (y2 - y1);

if (dx == 0) {
if (dy > 0) {
result = 90;
}
else {
result = 270;
}
}
else {
result = (atan(dy/dx)) * 180 / M_PI;
}

if (dx < 0) {
result = result + 180;
}

if (result < 0) {
result = result + 360;
}

真实航向和磁航向的检索如下:

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
arrow.transform = CGAffineTransformMakeRotation(newHeading.magneticHeading);

// NSLog(@"magnetic heading: %f", newHeading.magneticHeading);
// NSLog(@"true heading: %f", newHeading.trueHeading);
}

谁能告诉我现在应该做什么才能使箭头指向该位置 - 即使 iPhone 旋转?

最佳答案

我有时间再玩这个。

这样就可以了:

- (void)viewDidLoad {
[super viewDidLoad];

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
[locationManager startUpdatingLocation];
[locationManager startUpdatingHeading];

CLLocation *location = [locationManager location];
CLLocationCoordinate2D user = [location coordinate];

[self calculateUserAngle:user];
}

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
CLLocationCoordinate2D here = newLocation.coordinate;

[self calculateUserAngle:here];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
compass.transform = CGAffineTransformMakeRotation(newHeading.magneticHeading * M_PI / 180);
needle.transform = CGAffineTransformMakeRotation((degrees - newHeading.magneticHeading) * M_PI / 180);
}

-(void) calculateUserAngle:(CLLocationCoordinate2D)user {
locLat = [[targetLocationDictionary objectForKey:@"latitude"] floatValue];
locLon = [[targetLocationDictionary objectForKey:@"longitude"] floatValue];

NSLog(@"%f ; %f", locLat, locLon);

float pLat;
float pLon;

if(locLat > user.latitude && locLon > user.longitude) {
// north east

pLat = user.latitude;
pLon = locLon;

degrees = 0;
}
else if(locLat > user.latitude && locLon < user.longitude) {
// south east

pLat = locLat;
pLon = user.longitude;

degrees = 45;
}
else if(locLat < user.latitude && locLon < user.longitude) {
// south west

pLat = locLat;
pLon = user.latitude;

degrees = 180;
}
else if(locLat < user.latitude && locLon > user.longitude) {
// north west

pLat = locLat;
pLon = user.longitude;

degrees = 225;
}

// Vector QP (from user to point)
float vQPlat = pLat - user.latitude;
float vQPlon = pLon - user.longitude;

// Vector QL (from user to location)
float vQLlat = locLat - user.latitude;
float vQLlon = locLon - user.longitude;

// degrees between QP and QL
float cosDegrees = (vQPlat * vQLlat + vQPlon * vQLlon) / sqrt((vQPlat*vQPlat + vQPlon*vQPlon) * (vQLlat*vQLlat + vQLlon*vQLlon));
degrees = degrees + acos(cosDegrees);
}

关于iphone - 使用指南针指向位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5092845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com