2013-04-23 17 views
7

Biorąc pod uwagę dwa łożyska, jak znaleźć najmniejszy kąt między nimi?Znaleźć kąt między dwoma łożyskami

Na przykład, jeśli 1 nagłówek ma 340 stopni, a drugi ma 10 stopni, najmniejszy kąt będzie wynosił 30 stopni.

Dołączyłem obrazek, aby pokazać, co mam na myśli. Próbowałem odjąć jeden od drugiego, ale to nie zadziałało ze względu na efekt zawijania okręgu. Próbowałem również używać ujemnych stopni (180 - 359 to -180 do 0), ale to pomieszało się, gdy próbowałem obliczyć kąt między liczbą dodatnią i ujemną.

Jestem pewny, że musi istnieć łatwiejszy sposób, który ma wiele stwierdzeń if.

Dziękuję za pomoc. Adam

BTW. To jest pytanie nawigacyjne, więc promień koła jest nieznany.

Finding the angle between two headings

+0

Operator mod pomoże tutaj. Dużo. –

+0

ooops! naprawione! –

Odpowiedz

6
float getDifference(float a1, float a2) { 
    return Math.min((a1-a2)<0?a1-a2+360:a1-a2, (a2-a1)<0?a2-a1+360:a2-a1) 
} 
+0

Dzięki, że zadziałało. Próbowałem rozwiązać to przez 6 godzin! –

+1

równoważnie: 'Math.min ((a1 - a2 + 360)% 360, (a2 - a1 + 360)% 360)' (użyj 'fmod',' IEERemainder', itp., Dla innych języków, w których '%' doesn 't obsługuje wartości zmiennoprzecinkowe.) –

+0

Wspaniale, zrobiłeś mój dzień. – FerDensetsu

4

Co o:

angle = Math.abs(a1-a2); 
if (angle > 180) 
    angle = 360 - angle; 

Możesz wspomnieć kwestię dotyczącą liczb dodatnich i ujemnych, więc być może jest coś nie jestem rozważa tutaj ...

+0

Wierzę, że twoja odpowiedź jest odpowiednikiem mojej, choć może nieco łatwiejsza do zrozumienia. Inną opcją, która wygląda jak skrzyżowanie dwóch, które już mamy, jest 'Math.min (Math.abs (a1-a2), 360 - Math.abs (a1-a2));' –

+0

Są one równoważne w poczucie, że są one poprawne i prawidłowe. Moim zdaniem, twoja implementacja traktuje problem jako problem poprawności algorytmu OP, podczas gdy myślałem o nim jako o problemie formatowania już poprawnej wartości. Oba są uzasadnionymi sposobami spojrzenia na problem i sądzę, że istnieje wystarczająca różnica w podejściu, które są wartościowe. – femtoRgon

0

Musisz wziąć pod uwagę różnicę w obu kierunkach.

public static double bearingDiff(double a, double b) { 
    double maxBearing = Math.max(a, b); 
    double minBearing = Math.min(a, b); 
    double antiClockwiseDiff = maxBearing - minBearing; 
    double clockwiseDiff = minBearing + 360 - maxBearing; 
    return Math.min(antiClockwiseDiff, clockwiseDiff); 
} 
10

skończyło się przy użyciu następującego wzoru znaleźć na this message board ponieważ potrzebny wynik być podpisane zgodnie z kierunkiem ruchu wskazówek zegara (lub przeciwnie). Ma dobre wytłumaczenie, co dokładnie się dzieje.

((((bearing - heading) % 360) + 540) % 360) - 180 
0

Jeśli potrzebny kierunek kąt, to będzie działać:

int maxBearing = Math.max(bearing0, bearing1); 
    int minBearing = Math.min(bearing0, bearing1); 
    int firstDir = maxBearing - minBearing; 
    int secondDir = minBearing + 360 - maxBearing; 
    int diff = Math.min(firstDir, secondDir); 

    boolean anticlock_dir = false; 

    int anticlock = bearing1 + diff; 
    if (anticlock >= 360) 
     anticlock = anticlock - 360; 

    if (anticlock == bearing0) 
     anticlock_dir = true; 
Powiązane problemy