Дополненная реальность: путаница пеленга/курса/азимута. (iphone ARKit code)

- (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 я могу определить, находится ли точка в пределах своего окна просмотра, используя следующий код:

- (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, result?@"YES":@"NO");

return result;
}

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

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

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

8
задан mike 13 March 2012 в 08:51
поделиться