inz-00/Assets/Scripts/Cities/City.cs
2019-11-10 23:20:24 +01:00

60 lines
1.9 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Assets.Common;
using Assets.Voronoi;
namespace Assets.Cities
{
public class City
{
public Graph<MapSite> startGraph;
public List<MapSite> sites;
public Graph<Point> roads = new Graph<Point>();
public Graph<Point> fieldBoundaries = new Graph<Point>();
public List<CityField> fields = new List<CityField>();
public List<(int, int)> edges;
public City(Graph<MapSite> startGraph)
{
this.startGraph = startGraph;
this.sites = new List<MapSite>();
this.edges = new List<(int, int)>();
}
public City(Graph<MapSite> startGraph, List<MapSite> 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<Point> 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<Point> { Vertices = roads.Vertices, Edges = edges.Select(e => (mapping[e.Item1], mapping[e.Item2])) };
}
}
}