public IEnumerable <Point4Dstep> Plot2D(ChannelTrace channelX, ChannelTrace channelY) { var qX = new Queue <int>(channelX.Times); var qY = new Queue <int>(channelY.Times); var timeX = 0; var timeY = 0; var xCoord = 0; var yCoord = 0; var result = new List <Point4Dstep>(); while (qX.Count > 0 || qY.Count > 0) { var xPeek = qX.Count == 0?int.MaxValue: qX.Peek() + timeX; var yPeek = qY.Count == 0?int.MaxValue: qY.Peek() + timeY; if (xPeek == yPeek) { timeX += qX.Dequeue(); timeY += qY.Dequeue(); xCoord += 1; yCoord += 1; } else if (xPeek > yPeek) { timeY += qY.Dequeue(); yCoord += 1; } else if (yPeek > xPeek) { timeX += qX.Dequeue(); xCoord += 1; } result.Add(point(xCoord, yCoord)); } return(result); }
internal void CalculateAccelerationExact(double initialSpeed, double desiredSpeed, double acceleration, ChannelTrace trace) { var deltaSpeed = desiredSpeed - initialSpeed; var distance = deltaSpeed / acceleration; var lastStep = 0; var lastStepTime = 0.0; var currentDistance = 0.0; var currentTime = 0.0; var currentSpeed = initialSpeed; while (currentSpeed <= desiredSpeed) { currentTime += 0.00000001; currentSpeed = initialSpeed + currentTime * acceleration; currentDistance = initialSpeed * currentTime + 0.5 * acceleration * currentTime * currentTime; var currentStep = (int)currentDistance; if (currentStep != lastStep) { var deltaTime = currentTime - lastStepTime; var deltaTimeScaled = (int)Math.Round(deltaTime * 2000000); trace.AddTime(deltaTimeScaled); lastStepTime = currentTime; lastStep = currentStep; } } }
public void CalculateAcceleration(int stepCount, int initialDelta, int initialN, ChannelTrace trace) { if (initialN < 0) { throw new NotImplementedException("deceleration"); } var currentDelta = (int)(initialDelta * 0.676); var currentN = initialN; var rest = 0; for (var i = 0; i < stepCount; ++i) { /* * accumulator += currentDelta; ++currentN; * * while (2 * accumulator > 4 * currentN - 1) * { * accumulator -= (4 * currentN - 1) / 2; * --currentDelta; * }*/ ++currentN; var newDelta = currentDelta - ((2 * currentDelta + rest) / (4 * currentN + 1)); rest = (2 * currentDelta + rest) % (4 * currentN + 1); trace.AddTime((int)currentDelta); } }