private VelocityDistribution GetDistribution(Point sector, float amount, Velocity2dProbability probability)
        {
            var velocity = new Velocity2dProbability(probability.X.Quantizations);

            for (var i = -probability.X.Quantizations; i <= probability.X.Quantizations; i++)
            {
                if (Math.Sign(sector.X) == 0)
                {
                    velocity.X[i] = GetInvProbability(probability.X, i);
                }
                else if (Math.Sign(sector.X) == Math.Sign(i) && i != 0)
                {
                    velocity.X[i] = GetProbability(probability.X, i);
                }

                if (Math.Sign(sector.Y) == 0)
                {
                    velocity.Y[i] = GetInvProbability(probability.Y, i);
                }
                else if (Math.Sign(sector.Y) == Math.Sign(i))
                {
                    velocity.Y[i] = GetProbability(probability.Y, i);
                }
            }
            return(new VelocityDistribution(sector, amount, velocity));
        }
        public VelocityGrid(Velocity2dProbability probability)
        {
            var leftX   = GetLeft(probability.X);
            var rightX  = GetRight(probability.X);
            var middleX = 1f - leftX - rightX;
            var downY   = GetRight(probability.Y);
            var upY     = GetLeft(probability.Y);
            var middleY = 1f - downY - upY;

            _distributions[0, 0] = GetDistribution(new Point(-1, -1), leftX * upY, probability);
            _distributions[1, 0] = GetDistribution(new Point(0, -1), middleX * upY, probability);
            _distributions[2, 0] = GetDistribution(new Point(1, -1), leftX * upY, probability);

            _distributions[0, 1] = GetDistribution(new Point(-1, 0), leftX * middleY, probability);
            _distributions[1, 1] = GetDistribution(new Point(0, 0), middleX * middleY, probability);
            _distributions[2, 1] = GetDistribution(new Point(1, 0), leftX * middleY, probability);

            _distributions[0, 2] = GetDistribution(new Point(-1, 1), leftX * downY, probability);
            _distributions[1, 2] = GetDistribution(new Point(0, 1), middleX * downY, probability);
            _distributions[2, 2] = GetDistribution(new Point(1, 1), leftX * downY, probability);
        }
 public VelocityDistribution(Point velocity, float probability, Velocity2dProbability velocityProbability)
 {
     Velocity            = velocity;
     Probability         = probability;
     VelocityProbability = velocityProbability;
 }