using System.Collections.Generic; using System.Linq; using Assets.Common; using Assets.Voronoi; namespace Assets.Cities { public class City { public Graph startGraph; public List sites; public Graph roads = new Graph(); public Graph fieldBoundaries = new Graph(); public List fields = new List(); public List<(int, int)> edges; public City(Graph startGraph) { this.startGraph = startGraph; this.sites = new List(); this.edges = new List<(int, int)>(); } public City(Graph startGraph, List sitesList) : this(startGraph) { this.sites = sitesList; } public void AddSite(MapSite site) { sites.Add(site); FixBoundaryEdges(site); } private void FixBoundaryEdges(MapSite site) { var a = edges; var b = site.Edges.Select(x => x.Item1 < x.Item2 ? x : (x.Item2, x.Item1)); edges = a.Union(b).Except(a.Intersect(b)).ToList(); } public void CreateRoadGraph(IList points) { var pointsForRoads = sites.SelectMany(site => site.Boundary.Select(i => (i, points[i])).Append((-1, site.Center))).Distinct().ToList(); var mapping = pointsForRoads.Select((x, i) => x.Item1 == -1 ? (-1, -1) : (i, x.Item1)).Where(x => x.Item1 != -1).ToDictionary(x => x.Item2, x => x.Item1); VoronoiGenerator generator = new VoronoiGenerator(pointsForRoads.Select(x => x.Item2)); generator.Generate(); roads = generator.Delaunay.Morph(s => s.Point); fieldBoundaries = new Graph { Vertices = roads.Vertices, Edges = edges.Select(e => (mapping[e.Item1], mapping[e.Item2])) }; } } }