2012-03-13 2 views
7
- (float)angleFromCoordinate:(CLLocationCoordinate2D)first toCoordinate:(CLLocationCoordinate2D)second { 

//first is origin 

//second is point 

float longitudinalDifference = second.longitude - first.longitude; 
float latitudinalDifference = second.latitude - first.latitude; 
float possibleAzimuth = (M_PI * .5f) - atan(latitudinalDifference/longitudinalDifference); 

if (longitudinalDifference > 0) 
{ 
    return possibleAzimuth; 
} 
else if (longitudinalDifference < 0) 
{ 
    return possibleAzimuth + M_PI; 
} 
else if (latitudinalDifference < 0) 
{ 
     return M_PI; 
    } 

    return 0.0f; 
} 

Код выше (взятый из проекта ARKit с открытым исходным кодом) вычисляет угол от точки интереса до точки начала (местоположения пользователя). Учитывая азимут (заголовок), вычисленный в радианах, в AR приложение им здания можно обнаружить, является ли точка в пределах его просмотра порта, используя следующий код:Увеличенная реальность Подшипник/Заголовок/Азимут путаницы. (iphone ARKit code)

- (BOOL)viewportContainsCoordinate:(ARCoordinate *)coordinate { 

double centerAzimuth = self.centerCoordinate.azimuth; 
double leftAzimuth = centerAzimuth - VIEWPORT_WIDTH_RADIANS/2.0; 

if (leftAzimuth < 0.0) { 
    leftAzimuth = 2 * M_PI + leftAzimuth; 
} 

double rightAzimuth = centerAzimuth + VIEWPORT_WIDTH_RADIANS/2.0; 

if (rightAzimuth > 2 * M_PI) { 
    rightAzimuth = rightAzimuth - 2 * M_PI; 
} 

BOOL result = (coordinate.azimuth > leftAzimuth && coordinate.azimuth < rightAzimuth); //THIS LINE 

if(leftAzimuth > rightAzimuth) { 
    result = (coordinate.azimuth < rightAzimuth || coordinate.azimuth > leftAzimuth); 
} 

double centerInclination = self.centerCoordinate.inclination; 
double bottomInclination = centerInclination - VIEWPORT_HEIGHT_RADIANS/2.0; 
double topInclination = centerInclination + VIEWPORT_HEIGHT_RADIANS/2.0; 

//check the height. 
result = result && (coordinate.inclination > bottomInclination && coordinate.inclination < topInclination); 

//NSLog(@"coordinate: %@ result: %@", coordinate, [email protected]"YES":@"NO"); 

return result; 
} 

Проблема в том, что я не понимаю полностью, как это работает специально на линии, где он проверяет, находится ли азимут (заголовок) координаты (точки интереса) в диапазоне портов просмотра между левой и правой азимутальными точками заголовка источника.

Таким образом, чтобы привести пример моего недоразумения - в градусах, если координата (точка интереса) вычисляет подшипник к началу 90 градусов, а затем порт представления происхождения обращен к нему под собственным углом 270 градусов к координате это означало бы, что пользователь смотрит на точку, но я не понимаю, почему код все еще работает, поскольку он проверяет, находится ли координатный азимут в пределах окна просмотра истоков, который я предполагаю, будет, например, 250 - (270) - 290 градусов. И, очевидно, азимут координат, несущий начало координат, составлял 90, поэтому он должен быть ложным.

Любая помощь в понимании того, что действительно происходит здесь, очень ценится.

ответ

0

я думаю, вы можете использовать функцию как

#define degreesToRadians(x) (M_PI * x/180.0) 

так, что вы более ясно, в соответствии с градусами и радианах. Надеюсь, это вам поможет ..

 Смежные вопросы

  • Нет связанных вопросов^_^