private void ExecuteAlgorithm(int x, int y, IsValidHandler isValid, PointActionHandler action) { ///Flood-Fill algorithm Queue<Point> q = new Queue<Point>(); if (regionMask[x, y]) return; q.Enqueue(new Point(x, y)); while (q.Count > 0) { Point p = q.Peek(); int x1 = p.X; int y1 = p.Y; if (isValid.Invoke(p)) { action.Invoke(p.X, p.Y); } if (isValid.Invoke(new Point(x1, y1 + 1))) { action.Invoke(x1, y1 + 1); q.Enqueue(new Point(x1, y1 + 1)); } if (isValid.Invoke(new Point(x1, y1 - 1))) { action.Invoke(x1, y1 - 1); q.Enqueue(new Point(x1, y1 - 1)); } if (isValid.Invoke(new Point(x1 + 1, y1))) { action.Invoke(x1 + 1, y1); q.Enqueue(new Point(x1 + 1, y1)); } if (isValid.Invoke(new Point(x1 - 1, y1))) { action.Invoke(x1 - 1, y1); q.Enqueue(new Point(x1 - 1, y1)); } q.Dequeue(); if (border) { q.Clear(); depth = Int32.MaxValue; } } ///end of Flood-Fill algorithm }
private void ExecuteAlgorithm(int x, int y, IsValidHandler isValid, PointActionHandler action) { ///Flood-Fill algorithm Queue<Point> q = new Queue<Point>(); if (regionMask[x, y] != 0) return; q.Enqueue(new Point(x, y)); while (q.Count > 0) { Point p = q.Peek(); int x1 = p.X; int y1 = p.Y; if (isValid.Invoke(p) & !trainset.Contains(image.GetPixel(x1, y1))) { action.Invoke(p.X, p.Y); } if (isValid.Invoke(new Point(x1, y1 + 1))) { action.Invoke(x1, y1 + 1); q.Enqueue(new Point(x1, y1 + 1)); } if (isValid.Invoke(new Point(x1, y1 - 1))) { action.Invoke(x1, y1 - 1); q.Enqueue(new Point(x1, y1 - 1)); } if (isValid.Invoke(new Point(x1 + 1, y1))) { action.Invoke(x1 + 1, y1); q.Enqueue(new Point(x1 + 1, y1)); } if (isValid.Invoke(new Point(x1 - 1, y1))) { action.Invoke(x1 - 1, y1); q.Enqueue(new Point(x1 - 1, y1)); } q.Dequeue(); } ///end of Flood-Fill algorithm }