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

Đoạn mã trên (được lấy từ dự án ARkit nguồn mở) tính toán góc từ điểm quan tâm đến điểm xuất phát (vị trí của người dùng). Căn cứ vào phương vị (tiêu đề) tính bằng radian, trong AR xây dựng ứng dụng im tôi có thể phát hiện xem một điểm nằm trong cổng xem nó bằng cách sử dụng đoạn mã sau:Thực tế Augmented Bearing/Heading/Azimuth nhầm lẫn. (mã Android 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; 
} 

Vấn đề là tôi không hoàn toàn hiểu được cách thức hoạt động đặc biệt tại dòng mà nó kiểm tra xem góc phương vị tọa độ (điểm quan tâm) (tiêu đề) có nằm trong phạm vi cổng nhìn giữa điểm phương vị trái và phải của đầu nguồn gốc hay không. Vì vậy, để đưa ra một ví dụ về sự hiểu lầm của tôi - theo độ, nếu tọa độ (điểm quan tâm) tính toán một ổ đỡ đến nguồn gốc 90 độ, và sau đó cổng xem gốc sẽ đối diện với nó ở mức 270 độ của nó với tọa độ, điều này có nghĩa là người dùng đang xem xét vấn đề, nhưng tôi không hiểu tại sao mã vẫn hoạt động vì nó kiểm tra xem góc phương vị tọa độ có nằm trong khung nhìn nguồn gốc mà tôi cho là ví dụ hay không 250 - (270) - 290 độ. Và rõ ràng là tọa độ góc phương vị mang đến nguồn gốc là 90 nên nó sai.

Bất kỳ trợ giúp nào hiểu được những gì thực sự xảy ra ở đây đều được đánh giá cao.

Trả lời

0

tôi nghĩ rằng bạn có thể sử dụng một chức năng như

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

để bạn có thể rõ ràng hơn theo mức độ và radian. Hy vọng điều này sẽ giúp bạn ..