我正在开发一个应用程序,它可以监控在赛道上比赛的汽车(计时),我需要记录汽车通过维修通道的次数。
我有代码来检测汽车何时进入维修通道,汽车在赛道上的位置通过一个名为splinePosition的变量记录下来,这个变量是一个0.00000到1.00000的浮点数。汽车在赛道上的位置(splinePosition)每隔250ms从游戏中传递到我的应用程序。
我想在每次赛车通过维修道并通过splinePosition 0.00000时添加到PitStops变量中,这就是开始和结束线。我试过这样做...
else if (CarLocation == CarLocationEnum.Pitlane)
{
LocationHint = "PIT";
if (Math.Abs(splinePosition) == 0)
PitStops += 1;
}
问题是我目前的代码不可靠,因为当汽车在坑道中高速行驶并通过花键位置0.00000时,在一个250ms的时间间隔内,花键位置可能是0.99000(就在终点线之前),而下一个可能是0.01000(就在终点线之后),所以从未增加PitStops变量,因为它从未看到0.00000。如果我为一个范围添加一个条件,它有时会根据车速将PitStops变量递增两次或更多(例如,它可能在该范围内有超过一个250ms的间隔)。
解决这个问题的正确方法是什么?
我想出了这样的方法。
public class Class
{
private double _prevPosition = 0;
public void Sample(double splinePosition)
{
int prevLane = (int)Math.Floor(this._prevPosition);
int currLane = (int)Math.Floor(this._prevPosition + splinePosition);
int numberOfPitstops = currLane - prevLane;
if (numberOfPitstops > 0)
{
//do whatever
}
this._prevPosition += splinePosition;
}
}
在每一次Sample调用时(即投票结果) 函数计算当前车道和前一个车道的差异。不幸的是,这种方法的可靠性受限于轮询的间隔:你应该保证每个车道至少调用一次函数。
如果汽车不能在时间间隔内绕过赛道,那么你要做的就是检查CurrentPos < LastPos.