Unity3D - 查找每秒更改的浮点数的平均值

时间:2016-04-28 12:28:52

标签: c# average

我正在计算速度,它运行正常。但我如何才能找到速度变量的平均值?速度值大约每秒变化一次(当GPS值更新时)。当他(她)按下“完成”按钮时,我需要显示用户的平均速度

感谢您的帮助

以下是我的示例代码:

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

2 个答案:

答案 0 :(得分:3)

CyrillFind的答案很接近,但如果考虑到总数据集,则会返回不正确的平均值。让我们说一下用户只运行游戏3秒并记录三个值(10,20,30)英里每小时。如果你计算平均值并加上它,那么就像你去的那样"然后平均值将为22.5。如果考虑了整套数据,那么它将平均为20.

这种情况发生在"当你去的时候"方法,因为每次你只考虑最后的平均值和下一个值;因此,您只能除以计算所用的数据量(2),这会忘记所有以前的数据。

如果您想要一个完全准确的平均值,那么您应该在List<>中存储每秒收集的速度值,然后在用户推送后通过迭代此list<>来计算最终的平均值&#34;成品&#34 ;.

如何执行此操作的示例:

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

答案 1 :(得分:1)

如果我理解得很好,你应该只保存这样的平均速度:

private int averageSpeed = 0;

当用户开始他的旅行时,例如:

public void Begin() {
  averageSpeed = 0;
}

计算速度时:

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

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

    averageSpeed = (averageSpeed + speed) / 2
}

当用户按下&#34;完成&#34;

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