2011-09-27 23 views
16

Làm cách nào tôi có thể tính toán sự khác biệt của hai biện pháp góc (được đưa ra bằng độ) trong Java để kết quả nằm trong khoảng [0 °, 180 °]?Làm cách nào để tính toán sự khác biệt của hai biện pháp góc?

Ví dụ:

350° to 15° = 25° 
250° to 190° = 60° 
+1

Nếu bạn đang tính toán khoảng cách, tại sao kết quả theo độ? –

+0

Bạn có thể làm rõ - bạn đang tìm kiếm thứ gì đó được xây dựng hoặc bạn chỉ yêu cầu một phương pháp? cũng nên đưa nó vào tài khoản? Ví dụ đầu tiên của bạn là 25 độ theo chiều kim đồng hồ và thứ hai của bạn là 60 độ ngược chiều kim đồng hồ. Nếu bạn chỉ muốn khoảng cách ngắn nhất thì kết quả của bạn phải là 0 đến 180 (hoặc -180 đến 180 nếu bạn muốn hiển thị hướng). – Chris

+0

Btw bạn không nên cho phép 360 vì 360 = 0. Miền của đối số mục nhập phải là [0, 360). – m0skit0

Trả lời

34
/** 
    * Length (angular) of a shortest way between two angles. 
    * It will be in range [0, 180]. 
    */ 
    private int distance(int alpha, int beta) { 
     int phi = Math.abs(beta - alpha) % 360;  // This is either the distance or 360 - distance 
     int distance = phi > 180 ? 360 - phi : phi; 
     return distance; 
    } 
+3

và cho "Sự khác biệt đã ký", thêm mã sau đây ... int dấu = (a - b> = 0 && a - b <= 180) || (a - b <= -180 && a- b> = -360)? 1: -1; r * = ký; – usman

+0

Điều này thực sự đã giúp tôi, cảm ơn bạn. – super

4

Chỉ cần làm

(15 - 350) % 360 

Nếu hướng không quan trọng (bạn muốn một trong đó mang lại giá trị nhỏ nhất), sau đó thực hiện phép trừ ngược (mod 360) và tính giá trị nhỏ nhất của hai (ví dụ: với Math.min).

+0

bạn có thể giải thích thêm một chút không? tôi không hiểu bạn "sau đó làm phép trừ ngược (mod 360) và tính toán giá trị nhỏ nhất." – NullPointerException

+0

@Và tôi cũng muốn thực hiện (350 - 15)% 360. – Artefacto

+0

phút ((ab)% 360, (ba)% 360) @ AndroidUser99 – squid

3

Làm thế nào về những điều sau đây:

dist = (a - b + 360) % 360; 
if (dist > 180) dist = 360 - dist; 
6

Chỉ cần lấy giá trị tuyệt đối của sự khác biệt của họ, sau đó, nếu lớn hơn 180, trừ đi 360 ° và lấy giá trị tuyệt đối của kết quả.

0

diff = MAX (angle1, angle2) - MIN (angle1, angle2);
nếu (diff> 180) diff = 360 - diff; "Sự khác biệt Signed"

10

Ngoài Nickes câu trả lời, nếu u muốn

int d = Math.abs(a - b) % 360; 
int r = d > 180 ? 360 - d : d; 

//calculate sign 
int sign = (a - b >= 0 && a - b <= 180) || (a - b <=-180 && a- b>= -360) ? 1 : -1; 
r *= sign; 

EDITED:

đâu 'a' và 'b' là hai góc để tìm sự khác biệt của.

'd' là sự khác biệt. 'r' là kết quả/sự khác biệt cuối cùng.

+1

'd' và' r' thể hiện trong bối cảnh này là gì? Sự khác biệt và xoay vòng? –

+1

Tôi giả sử 'a' và' b' đại diện cho 'targetAngle' và' currentAngle' tương ứng. –

+0

@StevenVascellaro yes đúng là – usman

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