/// <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]; }); }
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); }
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); }
/// <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); }
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); }); }
/// <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); }
/// <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); }
public void OnMapLoad(string fileName) { Preconditions.CheckNotNullOrEmpty(fileName, "fileName"); _map = GrdFile.Read(fileName); }
/// <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);