c#-Unity3D-查找每秒变化的浮点平均值

我正在计算速度,效果很好.但是如何找到速度变量的平均值?速度值大约每秒更改一次(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();
}

解决方法:

CyrillFind的答案很接近,但是如果考虑到总数据集,则将返回不正确的平均值.假设用户仅运行游戏3秒钟并记录了(10,20,30)mph的三个值,一秒钟.如果您计算平均值并“随身携带”添加到平均值,则平均值将为22.5.如果考虑全部数据,则平均为20.

这是因为“每次使用时”方法会发生这种情况,因为每次您只考虑最后的平均值和下一个值.因此,您只需除以用于计算的数据量(2),就可以忽略之前的所有数据.

如果想要完全准确的平均值,则应将每秒收集的速度值存储在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 =距离/时间.

上一篇:糖果传递


下一篇:yield from