2011-02-17 4 views
6

J'ai cette méthode pour déterminer la différence entre 2 0-360 caps. Bien que cela fonctionne pour déterminer à quel point absolument (comme, toujours sortie positive) je suis, j'ai du mal à comprendre ce qui doit être fait pour introduire le signe dans la sortie. Idéalement, si la distance la plus courte entre le cap initial et le cap final est en tournant dans le sens des aiguilles d'une montre, j'aimerais que le error ait un signe positif, si la distance la plus courte entre les rubriques implique une rotation dans le sens inverse des aiguilles d'une montre. Je voudrais que le error ait un signe négatif.Obtenir la différence entre deux rubriques

quelques exemples d'entrées souhaitées/sorties

initial - final-error

0 .................... 30. ......... 30

30 .................... 0 .......... -30

360 .................... 1 .......... 1

1 .......... . ......... 360 .......... -1

code:

/// <summary> 
    /// Calculate the error from a given initial heading to a final heading 
    /// </summary> 
    /// <param name="inital"></param> 
    /// <param name="final"></param> 
    /// <returns></returns> 
    private double GetHeadingError(double initial, double final) 
    { 
     double directionA = final - initial; 
     double directionB = 360 - (final + initial); 
     double error = 0; 

     if (Math.Abs(directionA) < Math.Abs(directionB)) 
     { 
      error = directionA; 
     } 
     else 
     { 
      error = directionB; 
     } 

     return error; 
    } 
+0

est de 1 à 360 1 ou -1? –

+0

Woop, je voulais dire -1 – chris12892

Répondre

12

Edit: ajout d'une vérification lorsque la différence est exactement 180 degrés. auparavant, il retournait 180 ou -180 selon que la valeur finale était supérieure ou inférieure à la valeur initiale. Je l'ai modifié de sorte qu'il renvoie 180 positif dans les deux cas.


Alors, voici ma tentative ...

private static double GetHeadingError(double initial, double final) 
     { 
      if (initial > 360 || initial < 0 || final > 360 || final < 0) 
      { 
       //throw some error 
      } 

      var diff = final - initial; 
      var absDiff = Math.Abs(diff); 

      if (absDiff <= 180) 
      { 
       //Edit 1:27pm 
       return absDiff == 180 ? absDiff : diff; 
      } 

      else if (final > initial) 
      { 
       return absDiff - 360; 
      } 

      else 
      { 
       return 360 - absDiff; 
      } 
     } 
+0

Hah, ça marche très bien! Merci beaucoup! – chris12892

+0

Vraiment utile: J'ai lutté avec cela pendant un moment. – KAE

1

Je pense que votre tableau des résultats souhaités est incorrect. Voici mon chemin klunky:

private double MyGetHeadingError(double initial, double final) 
{ 
    initial += 1000; 
    final += 1000; 

    bool flipped = false; 
    if (initial > final) 
    { 
     double temp; 
     temp = final; 
     final = initial; 
     initial = temp; 
     flipped = true; 
    } 
    double error; 
    if (final - initial > 180) 
     final = final - 360; 

    error = final - initial; 

    if (flipped == true) 
     error = -error; 
    return error; 
} 
1

Si je comprends bien la question, je pense que le code devrait fonctionner:

private double GetHeadingError(double initial, double final) 
{ 
      if(initial == 360) initial = 0; 
      if(final == 360) final = 0; 
      double clockWise = (final - initial); 
      double counterClockWise = (360 - final + initial); 
      return (Math.Abs(clockWise) <= Math.Abs(counterClockWise)) ? clockWise : -counterClockWise; 
} 

Fondamentalement, je suis le traitement de 360 ​​degrés le même que 0, ce que je crois est ok. Ce code produira les mêmes résultats que ceux indiqués dans le tableau ci-dessus. Le code ne vérifie pas les limites, il attend des valeurs comprises entre 0 et 360.

0
Degree_Diff = (MIN(ABS(ENDCOMPASS-STARTCOMPASS),ABS(360-ENDCOMPASS+STARTCOMPASS),ABS(360-STARTCOMPASS+ENDCOMPASS))) 
+0

Bienvenue sur stackoverflow! Il est toujours préférable de fournir une brève description d'un exemple de code pour améliorer la précision de la publication :) –

Questions connexes