2010-02-09 28 views
10

Thậm chí là không chính xác? Tôi đã nói lại toàn bộ điều đó với độ chính xác tùy ý của Apfloat và nó không tạo ra sự khác biệt nào mà tôi nên biết bắt đầu với !!Tại sao tính toán vòng bi này lại không chính xác?

public static double bearing(LatLng latLng1, LatLng latLng2) { 
double deltaLong = toRadians(latLng2.longitude - latLng1.longitude); 

double lat1 = toRadians(latLng1.latitude); 
double lat2 = toRadians(latLng2.latitude); 

double y = sin(deltaLong) * cos(lat2); 
double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(deltaLong); 
double result = toDegrees(atan2(y, x)); 
return (result + 360.0) % 360.0; 
} 

@Test 
public void testBearing() { 

    LatLng first = new LatLng(36.0, 174.0); 
    LatLng second = new LatLng(36.0, 175.0); 
    assertEquals(270.0, LatLng.bearing(second, first), 0.005); 
    assertEquals(90.0, LatLng.bearing(first, second), 0.005); 
} 

Khẳng định đầu tiên trong các thử nghiệm cho điều này:

java.lang.AssertionError: expected:<270.0> but was:<270.29389750911355>

0,29 dường như là một cách khá xa vời? Đây có phải là công thức tôi đã chọn để triển khai không?

+0

Bạn có đang sử dụng bộ ba chính xác tùy ý không? –

+0

bạn có thể thêm vàoRoman và toDegrees không? – Ron

+0

Sử dụng chức năng trig java.lang.Math và nhập java.lang.Math.toDegrees tĩnh; nhập java.lang.Math.toRadian tĩnh; – Greg

Trả lời

16

Nếu bạn đã thực hiện những gì bạn đã làm và thực hiện nó một cách chính xác bạn đã tìm ra vòng bi A từ B dọc theo tuyến đường ngắn nhất từ ​​A đến B, trên bề mặt Trái đất hình cầu (ish) vòng cung của vòng tròn lớn giữa A và B, KHÔNG phải cung tròn của đường vĩ độ giữa A và B.

Chức năng trắc địa của Mathematic cung cấp cho các vòng bi, cho vị trí thử nghiệm của bạn, như 89.7061270.294.

Vì vậy, có vẻ như (a) tính toán của bạn là chính xác nhưng (b) kỹ năng điều hướng của bạn cần đánh bóng.

+0

Khá đúng. Thay đổi các thông số thử nghiệm thành vĩ độ 0.0 độ và kiểm tra vượt qua. –

+0

Bạn nói đúng (b) hãy để tôi đưa ra một ví dụ để củng cố sự hiểu biết của tôi. Nếu tôi muốn đi bộ từ Paris (48, -2) đến Munich (48, -11), tôi sẽ không đi bộ về phía đông nhưng với sức chứa 86.652 độ. Điều này có ý nghĩa hơn nếu bạn nghĩ về việc đi bộ từ đâu đó đến vùng đất xanh, bạn sẽ không đi theo một đường song song với một đường vĩ độ (là các đường vĩ tuyến song song?). – Greg

+2

Vâng, bạn sẽ bắt đầu đi bộ dọc theo vòng bi đó (quên đường, và chướng ngại vật) nhưng sau đó bạn sẽ phải liên tục điều chỉnh vòng bi khi bạn đi; các tuyến đường vòng tròn lớn không (thường) theo một đường mang liên tục (hoặc loxodrome). Nhưng mọi thứ đang bắt đầu trở nên phức tạp, phá vỡ Bowditch. –

1

java.lang.AssertionError: expected:<270.0> but was:<270.29389750911355>

Lỗi tuyệt đối 0,29 này đại diện cho lỗi tương đối 0,1%. Làm thế nào là "một chặng đường dài tắt"?

Nổi sẽ cung cấp 7 chữ số có nghĩa; đôi là tốt cho 16. Có thể là các chức năng trig hoặc độ để radian chuyển đổi.

Công thức có vẻ đúng, nếu cần this source.

Nếu tôi cắm giá trị bắt đầu và giá trị cuối cùng của bạn vào trang đó, kết quả mà chúng báo cáo là 089 ° 42′22 ″. Nếu tôi trừ kết quả của bạn khỏi 360 và chuyển đổi thành độ, phút và giây thì kết quả của bạn giống với kết quả của chúng. Hoặc là cả hai đều đúng hoặc cả hai đều sai.

+2

Nếu điều này là do lỗi số, đó là một chặng đường dài tắt để tính toán đơn giản như vậy. –

1

Bạn có chắc chắn điều này là do sự cố về số không? Tôi phải thừa nhận, rằng tôi không chính xác biết những gì bạn đang cố gắng để tính toán, nhưng khi bạn đối phó với các góc trên một hình cầu, độ lệch nhỏ từ những gì bạn mong đợi trong hình học euclidian.

+2

Và đôi khi cũng có độ lệch lớn. –

Các vấn đề liên quan