【问题标题】:Unity3D - Find average value of float that changes each secondUnity3D - 查找每秒变化的浮点平均值
【发布时间】:2016-04-28 12:28:51
【问题描述】:

我正在计算速度,它工作正常。但是我怎样才能找到速度变量的平均值呢?速度值大约每秒变化一次(当 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();
}

【问题讨论】:

  • 如果您知道他们总共花了多长时间以及他们走了多远,您可以使用这些来找到它,而不是使用实际的速度变量
  • 将overallDistance除以overallTime?
  • 宾果游戏,距离/时间 = 旅途的平均速度
  • 感谢 Alfie Goodacre

标签: c# average


【解决方案1】:

CyrillFind 的答案很接近,但如果您考虑到整个数据集,则会返回不正确的平均值。假设用户只运行了 3 秒游戏并记录了三个 (10, 20 ,30) mph 的值。如果您计算平均值并“随用随取”,则平均值将为 22.5。如果考虑到全部数据集,则平均为 20。

这种情况发生在“随用随取”方法中,因为每次您只考虑上一个平均值和下一个值;因此,您只需除以该计算 (2) 所拥有的数据量,该计算会忘记所有先前的数据。

如果您想要一个完全准确的平均值,那么您应该将每秒收集的速度值存储在List<> 中,然后在用户按下“完成”后通过迭代此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

【讨论】:

  • 是的。本来要写的列表是执行此操作的方法。如果您使用如何循环列表并返回平均值的代码块来更新您的答案,那就太好了。他可能是个初学者。我会给+1
  • 感谢 gjttt1。就像程序员说的,能举个小例子吗?
  • +1。我喜欢例子。我认为您需要将averageTotal / speeds.Count; 保存在returnAverage() 的局部变量中,然后将clear 保存在列表中,然后返回该局部变量。如果不清除,以后会有问题。不错的答案。 @NurlanShukurov 这就是您正在寻找的答案。
  • 非常感谢你们。你能投票赞成问题吗?我需要 15 个声望点来支持答案
  • @NurlanShukurov 刚刚做了,但这还不够。如果您提出另一个问题并提供代码,您可能会得到 >15 分。你还需要2个。没关系。你刚刚做了
【解决方案2】:

如果我理解得很好,您应该像这样存储平均速度:

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
}

当用户按下“完成”时

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

【讨论】:

  • 好的,我会试试的。谢谢
  • 不客气,不过 gjttt1 的回答更好 :)
猜你喜欢
  • 2021-06-09
  • 2020-10-09
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多