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