public void NormalizeProbabilities() { var x = VelocityProbability.X.Total != 0 ? VelocityProbability.X.Normalized.GetValues() : GetEqualProbabilityDistribution(); var y = VelocityProbability.Y.Total != 0 ? VelocityProbability.Y.Normalized.GetValues() : GetEqualProbabilityDistribution(); VelocityProbability = new Velocity2dProbability(x, y); }
protected void TakeSingleStep() { var next = new FluidLayer(Size, Quantizations); foreach (var fluidCell in Layer.GetCells()) { var position = fluidCell.Position; var grid = new VelocityGrid(fluidCell.VelocityProbability); foreach (var distribution in grid.Distributions) { var x = position.X + distribution.Velocity.X; var y = position.Y + distribution.Velocity.Y; if (x < 0) { x = 0; } if (x >= Width) { x = Width - 1; } if (y < 0) { y = 0; } if (y >= Height) { y = Height - 1; } var nextPos = new Point(x, y); next[nextPos].NumberOfParticles = (int)Math.Round(fluidCell.NumberOfParticles * distribution.Probability); var nextVelocity = new Velocity2dProbability(next[nextPos].VelocityProbability + distribution.VelocityProbability * distribution.Probability * fluidCell.NumberOfParticles); next[nextPos].VelocityProbability = nextVelocity; } next[position].NumberOfParticles = fluidCell.NumberOfParticles; next[position].VelocityProbability = fluidCell.VelocityProbability; } Layer = next; }
public FluidCell(Point position, int quantizations) { Position = position; Quantizations = quantizations; VelocityProbability = new Velocity2dProbability(quantizations); }