2013-04-23 9 views
7

Dato due cuscinetti, come trovo l'angolo più piccolo tra loro?Trova l'angolo tra due cuscinetti

Quindi, ad esempio se 1 direzione è 340 gradi e la seconda è 10 gradi, l'angolo più piccolo sarà 30 gradi.

Ho allegato un'immagine per mostrare cosa intendo. Ho provato a sottrarre l'uno dall'altro, ma ciò non ha funzionato a causa dell'effetto avvolgente di un cerchio. Ho anche provato ad usare i gradi negativi (180 - 359 da -180 a 0), ma questo è stato incasinato quando ho provato a calcolare l'angolo tra il numero positivo e quello negativo.

Sono sicuro che ci deve essere un modo più semplice che avere un sacco di dichiarazioni if.

Grazie per il vostro aiuto. Adam

BTW. Questa è una domanda di navigazione, quindi il raggio del cerchio è sconosciuto.

Finding the angle between two headings

+0

L'operatore mod vi aiuterà qui. Un sacco. –

+0

ooops! aggiustato! –

risposta

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

Grazie che ha funzionato a meraviglia. Ho cercato di risolvere questo per 6 ore! –

+1

in modo equivalente: 'Math.min ((a1 - a2 + 360)% 360, (a2 - a1 + 360)% 360)' (usa 'fmod',' IEERemainder', ecc., Per le altre lingue dove '%' non fa Supporta i valori in virgola mobile.) –

+0

Impressionante, hai reso la mia giornata. – FerDensetsu

4

Che dire:

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

Lei parla di un problema per quanto riguarda i numeri positivi e negativi, quindi forse c'è qualcosa che non sto considerando qui ...

+0

Credo che la tua risposta sia equivalente alla mia, anche se forse è un po 'più facile da capire. Un'altra opzione che sembra un incrocio tra i due che abbiamo già ottenuto è 'Math.min (Math.abs (a1-a2), 360 - Math.abs (a1-a2));' –

+0

Sono equivalenti in la sensazione che siano entrambi corretti e validi. A mio parere, la tua implementazione considera il problema come un problema di correttezza dell'algoritmo dell'OP, mentre lo pensavo come un problema di formattazione di un valore già corretto. Entrambi sono modi validi per esaminare il problema, e penso che ci sia abbastanza differenza nell'approccio che entrambi hanno un valore. – femtoRgon

0

È necessario considerare la differenza in entrambe le direzioni.

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

ho finito per usare la formula seguente trovato su this message board perché avevo bisogno il risultato da firmare in base alla direzione (in senso orario o antiorario). Ha una buona spiegazione di esattamente cosa sta succedendo.

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

Se è necessaria direzione dell'angolo, allora questo lavoro:

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;