- (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, поэтому они должны быть ложными.
Мы очень ценим любую помощь в понимании того, что здесь происходит на самом деле.