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(); }
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})."); } }