Смешение дополненной реальности / Заголовок / Азимут. (код iphone ARKit) - PullRequest
8 голосов
/ 13 марта 2012
- (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, поэтому они должны быть ложными.

1 Ответ

0 голосов
/ 11 июля 2012

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

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

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

...