2011-02-17 21 views
6

2 0-360 pusula başlığı arasındaki farkı bulmak için bu yönteme sahibim.İki başlık arasındaki farkı alma

Bu, kesinlikle (her zaman pozitif çıktıda olduğu gibi) ne kadar uzakta olduğumu anlamaya çalışsa da, çıktıya işareti tanıtmak için yapılması gerekenleri bulmakta zorlanıyorum.

İdeal olarak, eğer ilk başlığın son istikametinden en kısa mesafe saat yönünde ilerliyorsa, error'un pozisyonları arasındaki en kısa mesafe karşı saat yönünün tersine çevrilmesini gerektiriyorsa error'un negatif bir işareti olmasını istiyorum.

istenen girdi birkaç örnek/çıkış

initial-error

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

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

.................... 1 .......... 1

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

Kodu:

/// <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

1'den 360'a 1 veya -1? –

+0

Woop, -1 – chris12892

cevap

12

Düzenleme:: fark tam olarak 180 derece olduğunda için eklendi çek İşte benim klunky yoldur. daha önce bu, finalin daha büyük mü yoksa başlangıçtan küçük olmasına bağlı olarak 180 veya -180 döndü. Her iki durumda da pozitif 180 döndürecek şekilde değiştirdim. Ben doğru soruyu anlamak


İşte benim girişimi var ...

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 demek istedim, bu çok iyi çalışıyor! Çok teşekkürler! – chris12892

+0

Gerçekten yararlı: Bir süredir bununla uğraştım. – KAE

1

Ben istenen sonuçların tablo yanlış olduğunu düşünüyorum.

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

, ben aşağıdaki kod çalışması gerekir düşünüyorum:

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; 
} 

Temelde ben 360 derece tedavi ediyorum Tamam, inandığım 0 ile aynı. Bu kod, yukarıdaki tabloda listelenenlerle aynı sonuçları verecektir. Kod, sınırları kontrol etmiyor, 0 ile 360 ​​arasında bir değer bekliyor.

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

Yığın akışına hoş geldiniz! Mesaj doğruluğunu iyileştirmek için örnek bir kod için kısa bir açıklama sağlamak her zaman daha iyidir :) –

İlgili konular