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

Il codice sopra riportato (tratto dal progetto ARkit open source) calcola un angolo da un punto di interesse a un punto di origine (la posizione dell'utente). Data l'azimut (intestazione) calcolato in radianti, nel AR app im edificio posso rilevare se un punto è all'interno del suo porto vista utilizzando il seguente codice:Confusione di realtà aumentata/direzione/confusione azimutale. (codice ARKit per iPhone)

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

Il problema è io non comprendere appieno come funziona specificamente alla linea in cui controlla se un azimut (intestazione) di coordinate (punto di interesse) si trova nell'intervallo della porta di visualizzazione tra i punti di azimut sinistro e destro dell'intestazione delle origini.

Quindi, per dare un esempio del mio fraintendimento - in gradi, se la coordinata (punto di interesse) calcola un rilevamento all'origine di 90 gradi, e quindi la porta vista origine è rivolta verso il suo stesso rilevamento di 270 gradi per la coordinata, questo significherebbe che l'utente sta guardando il punto, ma non capisco perché il codice funzioni ancora mentre controlla se l'azimut della coordinata si trova all'interno della vista delle origini che presumo sarebbe ad esempio 250 - (270) - 290 gradi. E ovviamente le coordinate azimut che portano all'origine erano 90 quindi dovrebbe essere falso.

Qualsiasi aiuto per capire cosa sta realmente accadendo qui è molto apprezzato.

risposta

0

Penso che si possa utilizzare una funzione come

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

in modo che siano più chiaro in base ai gradi e radianti. Spero che questo ti possa aiutare ..

Problemi correlati