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