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