2012-03-13 25 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; 
} 

El código anterior (tomado del proyecto ARkit de código abierto) calcula un ángulo desde un punto de interés hasta un punto de origen (la ubicación del usuario). Teniendo en cuenta el acimut (rúbrica) calculada en radianes, en la aplicación im edificio AR puedo detectar si un punto está dentro de la ventana de observación usando el siguiente código:Realidad Aumentada Teniendo/Encabezado/confusión Azimuth. (Código de iPhone ARKit)

- (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; 
} 

El problema es que no entiendo completamente cómo trabaja específicamente en la línea donde se verifica si una acimut de coordenadas (punto de interés) (rumbo) se encuentra en el rango del puerto de visualización entre los puntos de azimut izquierdo y derecho del rumbo de los orígenes.

Para dar un ejemplo de mis malentendidos, en grados, si la coordenada (punto de interés) calcula un rumbo al origen de 90 grados, y luego el puerto de vista de origen lo enfrenta en su propio rumbo de 270 grados a la coordenada, esto significaría que el usuario está mirando el punto, pero no entiendo por qué el código todavía funciona, ya que comprueba si el acimut coordenado de coordenadas está dentro de la ventana de orígenes que supongo que sería, por ejemplo 250 - (270) - 290 grados. Y, obviamente, las coordenadas de acimut que llevan al origen era 90, por lo que debería ser falso.

Cualquier ayuda comprensión de lo que realmente está sucediendo aquí es muy apreciada.

Respuesta

0

Creo que se puede utilizar una función como

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

para que esté más clara, de acuerdo a los grados y radianes. Espero que esto te ayude ..

Cuestiones relacionadas