2016-04-28 14 views
3

私は速度を計算しており、うまくいきます。しかし、どのように私はスピード変数の平均値を見つけることができますか?速度値は1秒間に約1回変化します(GPS値が更新された場合)。私は、ユーザーの平均速度を表示する必要があり、彼(彼女)を押す「完了」ボタンここで任意のヘルプUnity3D - 毎秒変化するfloatの平均値を求める

ため

おかげで私のサンプルコードです:

void Update() 
{ 
    timer += Time.deltaTime; 

    if (lonA != Input.location.lastData.longitude || latA != Input.location.lastData.latitude) 
    { 
     CalculateDistances(lonA, latA, Input.location.lastData.longitude, Input.location.lastData.latitude); // last distance and overall distanceS    
     lonA = Input.location.lastData.longitude; 
     latA = Input.location.lastData.latitude; 

     lastTime = timer; 
     timer = 0; 

     speed0 = speed; 

     CalculateSpeed(); 
    } 
} 

public static float Radians(float x) 
{ 
    return x * Mathf.PI/180; 
} 

public void CalculateDistances(float firstLon, float firstLat, float secondLon, float secondLat) 
{ 
    float dlon = Radians(secondLon - firstLon); 
    float dlat = Radians(secondLat - firstLat); 

    float distance = Mathf.Pow(Mathf.Sin(dlat/2), 2) + Mathf.Cos(Radians(firstLat)) * Mathf.Cos(Radians(secondLat)) * Mathf.Pow(Mathf.Sin(dlon/2), 2); 

    float c = 2 * Mathf.Atan2(Mathf.Sqrt(distance), Mathf.Sqrt(1 - distance)); 

    lastDistance = 6371 * c * 1000; 
} 

void CalculateSpeed() 
{ 
    speed = lastDistance/lastTime * 3.6f; 

    speedText.text = Mathf.RoundToInt(speed).ToString(); 
} 
+1

実際の速度変数を使用する代わりに、それらの合計と移動距離を知ることができます。 –

+0

overallDistanceをoverallTimeで割りますか? –

+0

ビンゴ、距離/時間=旅行の平均速度 –

答えて

3

void CalculateSpeed() 
{ 
    speed = lastDistance/lastTime * 3.6f; 

    speedText.text = Mathf.RoundToInt(speed).ToString(); 

    averageSpeed = (averageSpeed + speed)/2 
} 

とユーザー押す「完了」をCyrillFindの答えは近いですが、あなたのアカウントに合計を取っている場合、誤った平均値を返します。データセット。ユーザーがゲームを3秒間だけ実行し、(10、20、30)mphの3つの値を記録するとしましょう。あなたが平均を計算し、それに「あなたが行ったように」加えると、これの平均は22.5となるでしょう。データのフルセットを考慮に入れた場合、平均は20になります。

これは、「平均値と次の値のみを考慮に入れるたびに、「実行中」」メソッドで発生します。したがって、あなたはその計算のために持っているデータの量だけで割ることができます(2)。これは、以前のすべてのデータを忘れてしまいます。

完全に正確な平均値を求める場合は、毎秒収集される速度値をList<>に保存してから、ユーザーが「Finished」を押してからこのlist<>を反復して最後の平均値を計算する必要があります。

これを行う方法の例:

List<float> speeds = new List<float>() 
void CalculateSpeed() 
{ 
    speed = lastDistance/lastTime * 3.6f; 

    speedText.text = Mathf.RoundToInt(speed).ToString(); 

    speeds.Add(speed); 
} 

void float returnAverage() //call when Finished 
{ 
    float averageTotal; 
    float finalTotal; 

    for(int i = 0; i < speeds.Count; i++) 
    { 
     averageTotal += speeds[i] 
    } 

    finalTotal = averageTotal/speeds.Count; 
    speeds.Clear() // so as the list is free for the next time 
    return finalTotal; 
} 

よりもさらに良いとシンプルな、あなたは距離、その後、ちょうど式speed = distance/timeを使用する実行中にユーザーが追跡している時間を知っていれば。

+0

はい。それを書くつもりだった。リストはこれを行う方法です。あなたがリストと戻り値をループする方法のコードブロックであなたの答えを更新すると良いでしょう。彼は初心者かもしれない。私は+1 – Programmer

+0

ありがとうgjttt1を与えるでしょう。プログラマーが言ったように、あなたは少しの例を与えることができますか? –

+0

は、行くことを与える、 –

1

私はよく理解していれば、あなただけのはず

:ユーザーが彼の旅行、のようなものを開始すると

private int averageSpeed = 0; 

:このような平均速度を保存します10

public void Begin() { 
    averageSpeed = 0; 
} 

あなたは、あなたの速度を計算する場合:

public void Finish() { 
    averageSpeedText.text = Mathf.RoundToInt(averageSpeed).ToString(); 
} 
+0

よろしくお願いします。ありがとう –

+1

あなたは歓迎ですが、gjttt1の答えはより良いです: – CyrilFind

関連する問題