Example #1
0
        protected virtual void Initialize(FloodParameters parameters, int[,] markMatrix)
        {
            MarkMatrix = markMatrix;

            // deconstructing parameters
            NeighbourhoodType              = parameters.NeighbourhoodType;
            StartX                         = parameters.StartX;
            StartY                         = parameters.StartY;
            ProcessStartAsFirstNeighbour   = parameters.ProcessStartAsFirstNeighbour;
            Qualifier                      = parameters.Qualifier;
            NeighbourProcessor             = parameters.NeighbourProcessor;
            NeighbourStopCondition         = parameters.NeighbourStopCondition;
            SpreadingPositionVisitor       = parameters.SpreadingPositionVisitor;
            SpreadingPositionStopCondition = parameters.SpreadingPositionStopCondition;
            PositionsToVisit               = parameters.PositionsToVisitQueue;
            if (PositionsToVisit.Any())
            {
                throw new ArgumentException("Provided PositionsToVisitQueue was not empty at the beginning of flood spilling.", nameof(parameters));
            }
            FloodBounds boundsRestriction = parameters.BoundsRestriction
                                            ?? new FloodBounds(markMatrix.GetLength(0), markMatrix.GetLength(1));

            GuardBounds(boundsRestriction, StartX, StartY);
            OffsetX = -boundsRestriction.MinX;
            OffsetY = -boundsRestriction.MinY;
            MinX    = boundsRestriction.MinX;
            MinY    = boundsRestriction.MinY;
            MaxX    = boundsRestriction.MaxX;
            MaxY    = boundsRestriction.MaxY;

            InitializeMarkMatrix();
        }
Example #2
0
        protected void GuardBounds(FloodBounds bounds, int startX, int startY)
        {
            int xResultSize = MarkMatrix.GetLength(0);
            int yResultSize = MarkMatrix.GetLength(1);

            if (xResultSize < bounds.SizeX || yResultSize < bounds.SizeY)
            {
                throw new ArgumentException($"MarkMatrix size ({xResultSize}, {yResultSize}) " +
                                            $"is smaller than bounds size ({bounds.SizeX}, {bounds.SizeY})");
            }

            if (!bounds.Contains(startX, startY))
            {
                throw new ArgumentException($"start position ({startX}, {startY}) is not contained in given bounds " +
                                            $"(minX {bounds.MinX}, minY {bounds.MinY}, sizeX {bounds.SizeX}, sizeY {bounds.SizeY}).");
            }
        }