2012-05-17 185 views
1

我正在構建應該向某個位置顯示箭頭的應用程序。例如,如果我在位置X並且目標設置爲位置Y,則應該顯示一個直接指向該位置的箭頭。計算職位的位置

尋尋覓覓,我發現有兩種計算這個的一些奇特的公式後,但我似乎搞錯了一遍又一遍。

這是我的問題。雖然它似乎找到正確的初始位置,只要我把我的設備的「箭頭」將在相反方向或什麼它應該。所以,如果我順時針旋轉設備,箭頭也會順時針旋轉......反之亦然。

這是我的一些代碼:

@implementation CompassViewController 

BOOL firstPositionFound = NO; 
float lastPosition = 0; 
float currentHeading = 0; 

[...] 

#pragma mark - 
#pragma mark Core Location Methods 

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading 
{ 
    if (newHeading.headingAccuracy > 0) { 
     CLLocationDirection theHeading = newHeading.magneticHeading; 

     currentHeading = theHeading; 

     [self fixPointer:theHeading]; 
    } 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 
    self.currentLocation = newLocation; 

    [self fixPointer:currentHeading]; 
} 

- (void)fixPointer:(float)heading 
{ 
    float degree = [self calculateDegree:self.currentLocation]; 

    degree = heading - degree; 

    NSLog(@"heading: %f, Degree: %f", heading, degree); 

    NSLog(@"Degree 2: %f", degree); 

    self.arrowView.transform = CGAffineTransformMakeRotation(degreesToRadians(degree)); 
} 

#pragma mark - 
#pragma mark Delegate methods 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

#pragma mark - 
#pragma mark Other methods 

- (float)calculateDegree:(CLLocation *)newLocation 
{ 
    CLLocationCoordinate2D from = newLocation.coordinate; 
    CLLocationCoordinate2D to; 
    to.latitude = APP_DESTINATION_LAT; 
    to.longitude = APP_DESTINATION_LON; 

    float res = atan2(sin((to.longitude*M_PI/180)-(from.longitude*M_PI/180))*cos(to.latitude*M_PI/180), 
         cos(from.latitude*M_PI/180)*sin(to.latitude*M_PI/180)-sin(from.latitude*M_PI/180)*cos(to.latitude*M_PI/180)*cos((to.longitude*M_PI/180)-(from.longitude*M_PI/180))); 

    res = res/M_PI*180; 

    if (res < 0) 
     res = 360.0f + res; 

    return res; 
} 

#pragma mark - 

我只是失去了,可能有人請指出我哪裏出了錯?我想它是一些簡單的事情,我目前是盲目看待的。

回答

2

在這個堆棧溢出問題,看看答案:

CLLocation Category for Calculating Bearing w/ Haversine function

具體而言,本部分:

如果您收到了消極的影響,加上2 * M_PI最終結果以radiansBearing(如果在轉換爲度數後執行,則爲360)。 ATAN2返回結果的範圍-M_PI到M_PI(-180〜180度),因此您可能需要將其轉換爲羅盤方位,使用類似下面的代碼

if(radiansBearing < 0.0) 
    radiansBearing += 2*M_PI;** 

另外,標題信息需要除非您始終將您的設備放在肖像中,否則請調整設備方向和角度。將設備慢慢轉到橫向模式,您將看到您的標題值改變了90°。

+0

謝謝!你的回答確實對我有幫助。我更新了我所提供的代碼,這種方式更好。不過,我還有一個問題,現在:它似乎爲我的經度/緯度向目的地正確度...但它預計手機有0標題(指向北方)。如果我計算從軸承中減去標題的半徑,它仍然不準確。有什麼建議嗎? –

+0

@珍妮-B你對我有什麼建議嗎? –

+1

@Paul Peelen沒有看到您的代碼,我不知道如何回答您,但是,簡單的答案是確保您使用正確的單位並調整設備方向。因此,請確保您正在從度數減去度數,而不是從弧度減去度數,並確保您已從磁力儀獲得的值已根據設備方向進行調整。 – Jenn

0

檢查了這一點 Wikipedia - On rotation matrix

從我從你的罪元素和給定(X,Y)的COS單元座標之間的夾角代碼理解。 [基本上由下式給出(TAN(X,0)/(0,y)的)]

讓調用這個角度theta。

你應該做的是採取這種協調和

CC wikipedia

乘以它讓我們稱之爲新座標(X 'Y')

x'

y'

希望這有助於。