我正在计算速度,它运行正常。但我如何才能找到速度变量的平均值?速度值大约每秒变化一次(当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();
}
答案 0 :(得分:3)
CyrillFind的答案很接近,但如果考虑到总数据集,则会返回不正确的平均值。让我们说一下用户只运行游戏3秒并记录三个值(10,20,30)英里每小时。如果你计算平均值并加上它,那么就像你去的那样"然后平均值将为22.5。如果考虑了整套数据,那么它将平均为20.
这种情况发生在"当你去的时候"方法,因为每次你只考虑最后的平均值和下一个值;因此,您只能除以计算所用的数据量(2),这会忘记所有以前的数据。
如果您想要一个完全准确的平均值,那么您应该在List<>
中存储每秒收集的速度值,然后在用户推送后通过迭代此list<>
来计算最终的平均值&#34;成品&#34 ;.
如何执行此操作的示例:
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 :(得分:1)
如果我理解得很好,你应该只保存这样的平均速度:
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
}
当用户按下&#34;完成&#34;
时public void Finish() {
averageSpeedText.text = Mathf.RoundToInt(averageSpeed).ToString();
}