예제 #1
0
        /// <summary>
        /// 按单元格数量分割区域
        /// </summary>
        /// <param name="RowNum"></param>
        /// <param name="ColNum"></param>
        private void PartitionArea(int RowNum, int ColNum)
        {
            Geometry.Grid grid;
            double        w = disasterArea.Width / ColNum;
            double        h = disasterArea.Height / RowNum;

            if (_InitGrids == null)
            {
                _InitGrids = new List <Geometry.Grid>();
            }
            else
            {
                _InitGrids.Clear();
            }

            for (int i = 0; i < ColNum; i++)
            {
                for (int j = 0; j < RowNum; j++)
                {
                    grid      = new Geometry.Grid();
                    grid.Row  = j; grid.Col = i;
                    grid.XMin = disasterArea.XMin + w * (double)i;
                    grid.YMin = disasterArea.YMin + h * (double)j;
                    grid.XMax = grid.XMin + w;
                    grid.YMax = grid.YMin + h;
                    _InitGrids.Add(grid);
                }
            }
        }
예제 #2
0
 private static void SetGridMerged(Geometry.Grid grid)
 {
     foreach (Geometry.Grid g in DataGrid)
     {
         if (g.Equal(grid))
         {
             g.isMerged = true;
         }
     }
 }
예제 #3
0
 /// <summary>
 /// 在数据单元格中是否存在
 /// </summary>
 /// <param name="grid"></param>
 /// <returns></returns>
 private static bool ExistsGridInDataGrid(ref Geometry.Grid grid)
 {
     foreach (Geometry.Grid g in DataGrid)
     {
         if (g.Equal(grid))
         {
             grid = g; return(true);
         }
     }
     return(false);
 }
예제 #4
0
        /// <summary>
        /// 合并单元格近邻
        /// </summary>
        /// <param name="grid"></param>
        public static void MergeNN(Geometry.Grid grid, ref IPolygon area)
        {
            System.Diagnostics.Debug.Print("Merge: row=" + grid.Row.ToString() + ",col=" + grid.Col.ToString());
            if (!grid.isMerged)
            {
                IPolygon polygon = grid.BuildPolygon();
                area          = MergePolygon(area, polygon);
                grid.isMerged = true;
                //SetGridMerged(grid);
            }
            //计算近邻
            Geometry.Grid GridUp, GridLeft, GridRight, GridDown;
            GridUp    = grid.GetNeighbor(Geometry.GridNeighborTypes.UP);
            GridLeft  = grid.GetNeighbor(Geometry.GridNeighborTypes.LEFT);
            GridRight = grid.GetNeighbor(Geometry.GridNeighborTypes.RIGHT);
            GridDown  = grid.GetNeighbor(Geometry.GridNeighborTypes.DOWN);

            if (ExistsGridInDataGrid(ref GridUp))
            {
                if (!GridUp.isMerged)
                {
                    MergeNN(GridUp, ref area);
                }
            }
            if (GridLeft != null)
            {
                if (ExistsGridInDataGrid(ref GridLeft))
                {
                    if (!GridLeft.isMerged)
                    {
                        MergeNN(GridLeft, ref area);
                    }
                }
            }
            if (ExistsGridInDataGrid(ref GridRight))
            {
                if (!GridRight.isMerged)
                {
                    MergeNN(GridRight, ref area);
                }
            }
            if (GridDown != null)
            {
                if (ExistsGridInDataGrid(ref GridDown))
                {
                    if (!GridDown.isMerged)
                    {
                        MergeNN(GridDown, ref area);
                    }
                }
            }
            return;
        }
예제 #5
0
 /// <summary>
 /// 是否已存在于数据单元格集中
 /// </summary>
 /// <param name="grid"></param>
 /// <returns></returns>
 private bool isContainedInDataGrids(Geometry.Grid grid)
 {
     if (_DataGrids == null)
     {
         return(false);
     }
     else
     {
         foreach (Geometry.Grid g in _DataGrids)
         {
             if (grid.Equal(g))
             {
                 return(true);
             }
         }
         return(false);
     }
 }
예제 #6
0
        /// <summary>
        /// 按单元大小分割区域
        /// </summary>
        private void PartitionArea(double width, double height)
        {
            Geometry.Grid grid;
            int           cn = (int)Math.Ceiling(disasterArea.Width / width);
            int           rn = (int)Math.Ceiling(disasterArea.Height / height);

            if (_InitGrids == null)
            {
                _InitGrids = new List <Geometry.Grid>();
            }
            else
            {
                _InitGrids.Clear();
            }

            for (int i = 0; i < cn; i++)
            {
                for (int j = 0; j < rn; j++)
                {
                    grid      = new Geometry.Grid();
                    grid.Row  = j; grid.Col = i;
                    grid.XMin = disasterArea.XMin + width * (double)i;
                    grid.YMin = disasterArea.YMin + height * (double)j;
                    //当单元为最右、最上面的时候,则为边界值
                    if (i == cn - 1)
                    {
                        grid.XMax = disasterArea.XMax;
                    }
                    else
                    {
                        grid.XMax = grid.XMin + width;
                    }
                    if (j == rn)
                    {
                        grid.YMax = disasterArea.YMax;
                    }
                    else
                    {
                        grid.YMax = grid.YMin + height;
                    }
                    _InitGrids.Add(grid);
                }
            }
        }