private void is_Satisfy(int midRow, int midCol, int NeiborRow, int NeiborCol, double dis, IRaster InAccRaster, IRaster InSurRaster, IRaster InLabel, Stack <RasterPixel_2> RpArr)
 {
     if (is_boundary_pixel(NeiborRow, NeiborCol, InAccRaster))
     {
         if (in_Radius(midRow, midCol, NeiborRow, NeiborCol, dis, InAccRaster))
         {
             RasterPixel_2 rp = new RasterPixel_2(NeiborRow, NeiborCol, InAccRaster.Value[NeiborRow, NeiborCol], InSurRaster.Value[NeiborRow, NeiborCol]);
             RpArr.Push(rp);
             InLabel.Value[rp.Row, rp.Column] = rp.Value2;
         }
     }
 }
        public void Execute()
        {
            RcIndex               rc     = Point_to_Raster(pointLayer, Accumulation);
            RasterPixel_2         rp1    = new RasterPixel_2(rc.Row, rc.Column, Accumulation.Value[rc.Row, rc.Column], Surface.Value[rc.Row, rc.Column]);
            Stack <RasterPixel_2> RpArr1 = new Stack <RasterPixel_2>();
            Stack <RasterPixel_2> RpArr2 = new Stack <RasterPixel_2>();

            RpArr1.Push(rp1);
            Label.Value[rp1.Row, rp1.Column] = rp1.Value2;
            do
            {
                RasterPixel_2 rp2 = RpArr1.Pop();
                RpArr2.Push(rp2);
                is_Satisfy(rp2.Row, rp2.Column, rp2.Row, rp2.Column - 1, Radius, Accumulation, Surface, Label, RpArr1);     //Left
                is_Satisfy(rp2.Row, rp2.Column, rp2.Row, rp2.Column + 1, Radius, Accumulation, Surface, Label, RpArr1);     //Right
                is_Satisfy(rp2.Row, rp2.Column, rp2.Row - 1, rp2.Column, Radius, Accumulation, Surface, Label, RpArr1);     //Top
                is_Satisfy(rp2.Row, rp2.Column, rp2.Row + 1, rp2.Column, Radius, Accumulation, Surface, Label, RpArr1);     //Bottom
                is_Satisfy(rp2.Row, rp2.Column, rp2.Row - 1, rp2.Column - 1, Radius, Accumulation, Surface, Label, RpArr1); //TopLeft
                is_Satisfy(rp2.Row, rp2.Column, rp2.Row - 1, rp2.Column + 1, Radius, Accumulation, Surface, Label, RpArr1); //TopRight
                is_Satisfy(rp2.Row, rp2.Column, rp2.Row + 1, rp2.Column - 1, Radius, Accumulation, Surface, Label, RpArr1); //BottomLeft
                is_Satisfy(rp2.Row, rp2.Column, rp2.Row + 1, rp2.Column + 1, Radius, Accumulation, Surface, Label, RpArr1); //BottomRight
            } while (RpArr1.Count > 0);
            RasterPixel_2 rp3        = Search_pour_pixel(RpArr2);
            Coordinate    ResultCoor = Rc_to_Coor(rp3.Row, rp3.Column, Accumulation);

            FeatureSet pointF = new FeatureSet(FeatureType.Point);

            pointF.Projection = Accumulation.Projection;
            DataColumn Column1 = new DataColumn("ID");

            pointF.DataTable.Columns.Add(Column1);
            DataColumn Column2 = new DataColumn("Accumulation");

            pointF.DataTable.Columns.Add(Column2);
            DataColumn Column3 = new DataColumn("Elevation");

            pointF.DataTable.Columns.Add(Column3);

            Point    point          = new Point(ResultCoor);
            IFeature currentFeature = pointF.AddFeature(point);

            currentFeature.DataRow["ID"]           = 0;
            currentFeature.DataRow["Accumulation"] = rp3.Value1;
            currentFeature.DataRow["Elevation"]    = rp3.Value2;
            pointF.SaveAs(savePath, false);
            MainMap.Layers.Add(pointF);
        }