Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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;
                }
            }
        }
Exemplo n.º 3
0
        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);
            }
        }