Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity3D-查找每秒更改的浮点平均值_C#_Average - Fatal编程技术网

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

C# Unity3D-查找每秒更改的浮点平均值,c#,average,C#,Average,我在计算速度,它工作得很好。但我怎样才能找到速度变量的平均值呢?速度值大约每秒更改一次(当GPS值更新时)。我需要显示用户按下“完成”按钮时的平均速度 谢谢你的帮助 以下是我的示例代码: void Update() { timer += Time.deltaTime; if (lonA != Input.location.lastData.longitude || latA != Input.location.lastData.latitude) { C

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

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

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
}
当用户按下“Finish”时


CyrillFind的答案很接近,但如果考虑到总数据集,将返回不正确的平均值。假设用户只运行游戏3秒钟,并记录三个(10、20、30)mph的值。如果你计算平均值并加上“随走随走”,那么平均值为22.5。如果将全套数据考虑在内,则平均值为20

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

如果希望获得完全准确的平均值,则应将每秒收集的速度值存储在
列表中
,然后在用户按下“Finished”(完成)按钮后,通过迭代该
列表
计算平均值

如何执行此操作的示例:

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;
}
列表速度=新列表()
void CalculateSpeed()
{
速度=最后距离/最后时间*3.6f;
speedText.text=Mathf.RoundToInt(speed.ToString();
速度。添加(速度);
}
void float returnAverage()//完成时调用
{
浮动平均总数;
浮动最终;
对于(int i=0;i

比这更好更简单,如果您知道用户在跑步时跟踪的距离和时间,那么只需使用公式
speed=distance/time

如果您知道他们总共花了多长时间以及走了多远,您只需使用它们来查找,而不必使用实际的速度变量将总距离除以总时间?答对了,距离/时间=旅程的平均速度谢谢Alfie GoodacreOk,我会试试的。谢谢,不客气,不过GJTT1的答案更好:)是的。我本来打算写的。列表是实现这一点的方法。若你们用一个代码块来更新你们的答案,告诉你们如何循环列表并返回平均值,那个将是一件好事。他可能是个初学者。我会给你+1汉克GJTT1。就像程序员说的,你能举个小例子吗?+1。我喜欢例子。我想你需要保存
averageTotal/speeds.CountreturnAverage()
中的局部变量中执行code>,然后
清除列表,然后返回该局部变量。如果未清除此项,则稍后将出现问题。回答得好@NurlanShukurov这就是你们想要的答案。非常感谢你们。你能投票表决这个问题吗?我需要15点声望才能投票answer@NurlanShukurov只是做了,但这还不够。如果你问另一个问题并提供一个代码,你可能会得到>15分。你还需要两个。不要介意。你刚刚做到了
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;
}