Exemplo n.º 1
0
        /// <summary>
        /// Нахождение границ всех зон
        /// </summary>
        /// <param name="grd">Файл grd с зонами</param>
        /// <param name="root">Дерево русел</param>
        public static void ExtractBoundary(GrdFile grd, Node root)
        {
            Preconditions.CheckNotNull(grd, "grd");
            Preconditions.CheckNotNull(root, "root");

            var zones = new Dictionary <int, List <Point> >();

            for (int j = 0; j < grd.Column; j++)
            {
                for (int i = 0; i < grd.Row; i++)
                {
                    var zone = (int)grd.Data[i, j];

                    if (zone > 0 && !zones.ContainsKey(zone))
                    {
                        var boundary = ExtractBoundary(grd, new Point(i, j - 1));
                        zones.Add(zone, boundary);
                    }
                }
            }

            root.Traverse(node =>
            {
                var label = node.Label;

                if (!zones.ContainsKey(label))
                {
                    return;
                }

                node.Boundary = zones[label];
            });
        }
Exemplo n.º 2
0
        private static List <Point> ExtractBoundary(GrdFile grd, Point start)
        {
            int[] dx = { 1, 1, 0, -1, -1, -1, 0, 1 };
            int[] dy = { 0, -1, -1, -1, 0, 1, 1, 1 };

            var x   = start.X;
            var y   = start.Y;
            var dir = 7;

            List <Point> contour = new List <Point> {
                start
            };

            do
            {
                for (int i = dir; i < dir + 8; i++)
                {
                    var nx = x + dx[i % 8];
                    var ny = y + dy[i % 8];

                    if (grd.Data[nx, ny] == -1)
                    {
                        contour.Add(new Point(nx, ny));
                        dir = i % 2 == 0 ? (i + 7) % 8 : (i + 6) % 8;
                        x   = nx;
                        y   = ny;
                        break;
                    }
                }
            } while (!(contour.Last() == contour.First()));

            contour.RemoveAt(0);
            return(contour);
        }
Exemplo n.º 3
0
        public void ShouldReadFile()
        {
            var file = GrdFile.Read(@"D:\input\zones.grd");

            Assert.AreEqual("DSBB", file.Info);
            Assert.AreEqual(944, file.Row);
            Assert.AreEqual(944, file.Column);
            Assert.AreEqual(8457525, file.MinX);
            Assert.AreEqual(8504675, file.MaxX);
            Assert.AreEqual(5364775, file.MinY);
            Assert.AreEqual(5411925, file.MaxY);
            Assert.AreEqual(58, file.MaxZ);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Объединение двух соседних зон
        /// </summary>
        /// <param name="grd">Файл grd с зонами</param>
        /// <param name="first">Первая зона</param>
        /// <param name="second">Вторая зона</param>
        public static void Union(GrdFile grd, Node first, Node second)
        {
            Preconditions.CheckNotNull(grd, "grd");
            Preconditions.CheckNotNull(first, "first");
            Preconditions.CheckNotNull(second, "second");

            var boundary = CommonBoundary(first, second);

            if (boundary == null || boundary.Count == 0)
            {
                return;
            }

            foreach (var point in boundary)
            {
                grd.Data[point.X, point.Y] = second.Label;
            }

            FillZone(grd.Data, boundary[0], second.Label, first.Label);
        }
Exemplo n.º 5
0
        private void FillZones(IEnumerable <Edge> edges)
        {
            _grd = new GrdFile();

            foreach (var edge in edges)
            {
                GrdGraphics.DrawLine(_grd, (int)edge.V0.X, (int)edge.V0.Y, (int)edge.V1.X, (int)edge.V1.Y);
            }

            _root.Traverse(node =>
            {
                if (node.Vertices.Count == 0)
                {
                    return;
                }

                var vertex = node.Vertices[0];

                FillZone(vertex, node.Label);
            });
        }
Exemplo n.º 6
0
        /// <summary>
        /// Объединение зон
        /// </summary>
        /// <param name="map">Карта затопления</param>
        /// <param name="zones">Зоны и их общие точки</param>
        /// <param name="percent">Условие</param>
        /// <returns>Зоны, которые нужно объединить</returns>
        public Dictionary <Pair <int, int>, IList <Point> > Union(GrdFile map, Dictionary <Pair <int, int>, IList <Point> > zones, float percent)
        {
            Preconditions.CheckNotNull(map, "map");
            Preconditions.CheckNotNull(zones, "zones");

            var union = new Dictionary <Pair <int, int>, IList <Point> >();

            foreach (var zone in zones)
            {
                var first  = zone.Key.Key;
                var second = zone.Key.Value;
                var points = zone.Value;

                if (Condition(map, points, percent))
                {
                    union.Add(new Pair <int, int>(first, second), points);
                }
            }

            return(union);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Условие объединения зон
        /// </summary>
        /// <param name="map">Карта затопления</param>
        /// <param name="points">Общая граница двух зон</param>
        /// <param name="arg">Процент мокрых точек</param>
        /// <returns></returns>
        public override bool Condition(GrdFile map, IEnumerable <Point> points, float arg)
        {
            return(new Random().NextDouble() > arg);

            Preconditions.CheckNotNull(map, "map");
            Preconditions.CheckNotNull(points, "points");

            var x = 0;
            var y = 0;

            foreach (var p in points)
            {
                y++;
                if (map.Data[p.X, p.Y] >= 0.5) // высота, с которой считаем что точка мокрая
                {
                    x++;
                }
            }

            return(x / (double)y > arg);
        }
Exemplo n.º 8
0
        public void OnMapLoad(string fileName)
        {
            Preconditions.CheckNotNullOrEmpty(fileName, "fileName");

            _map = GrdFile.Read(fileName);
        }
Exemplo n.º 9
0
 /// <summary>
 /// Условие объединения зон
 /// </summary>
 /// <param name="map">Карта затопления</param>
 /// <param name="points">Общая граница двух зон</param>
 /// <param name="arg">Параметр объединения</param>
 /// <returns></returns>
 public abstract bool Condition(GrdFile map, IEnumerable <Point> points, float arg);