51 lines
1.4 KiB
C#
51 lines
1.4 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Assets.Common;
|
|
using Assets.Voronoi;
|
|
|
|
namespace Assets.Map
|
|
{
|
|
public class Location
|
|
{
|
|
public List<Site> Sites = new List<Site>();
|
|
|
|
public IEnumerable<int> Points => Sites.SelectMany(site => site.Vertices);
|
|
public IEnumerable<int> BoundaryPoints => BoundaryEdges.SelectMany(edge => new [] { edge.Item1, edge.Item2 }).Distinct();
|
|
public IEnumerable<int> InsidePoints => Points.Except(BoundaryPoints);
|
|
|
|
public List<(int, int)> BoundaryEdges = new List<(int, int)>();
|
|
|
|
public Point Center => PointUtils.Mean(Sites.Select(s => s.Point));
|
|
|
|
public LocationType Type;
|
|
|
|
public List<Point> DetailedEdge = new List<Point>();
|
|
|
|
public void AddSite(Site site)
|
|
{
|
|
site.Location = this;
|
|
Sites.Add(site);
|
|
|
|
FixBoundaryEdges(site);
|
|
}
|
|
|
|
private void FixBoundaryEdges(Site site)
|
|
{
|
|
var a = BoundaryEdges;
|
|
var b = site.Edges.Select(x => x.Item1 < x.Item2 ? x : (x.Item2, x.Item1));
|
|
|
|
BoundaryEdges = a.Union(b).Except(a.Intersect(b)).ToList();
|
|
}
|
|
}
|
|
|
|
public class LocationSite
|
|
{
|
|
public readonly Site Site;
|
|
public Location Location;
|
|
|
|
public LocationSite(Site site)
|
|
{
|
|
Site = site;
|
|
}
|
|
}
|
|
} |