public double[] GetTerritories(ref CityRender cityRender, ref int[] downhill, ref Mesh mesh, ref double[] h) { var cities = cityRender.Cities; var n = cityRender.AreaProperties.NumberOfTerritories; if (n > cities.Count) { n = cities.Count; } var flux = GetFlux(ref mesh, ref downhill, h); var territories = new double[h.Length]; var queue = new SimplePriorityQueue <CityProperty>();//5 is made up number for (var i = 0; i < n; i++) { territories[cities[i]] = cities[i]; var nbs = Neighbours(mesh, cities[i]); for (var j = 0; j < nbs.Count; j++) { var score = Weight(mesh, h, flux, cities[i], nbs[j]); queue.Enqueue(new CityProperty() { Score = score, City = cities[i], Vx = nbs[j] }, (float)score); } } while (queue.Count > 0) { var u = queue.Dequeue(); if (territories[u.Vx] != 0) { continue; } territories[u.Vx] = u.City; var nbs = Neighbours(mesh, u.Vx); for (var i = 0; i < nbs.Count; i++) { var v = nbs[i]; if (territories[v] != 0) { continue; } var newdist = Weight(mesh, h, flux, u.Vx, v); var score = u.Score + newdist; queue.Enqueue(new CityProperty() { Score = score, City = u.City, Vx = v }, (float)score); } } return(territories); }
public void PlaceCities(ref CityRender cityRender, ref int[] downhill, ref Mesh mesh, ref double[] h) { var n = cityRender.AreaProperties.NumberOfCities; var cities = cityRender.Cities; for (var i = 0; i < n; i++) { PlaceCity(ref cities, ref downhill, ref mesh, ref h); } cityRender.Cities = cities; }
public List <List <Point> > GetBorders(ref Mesh mesh, ref CityRender cityRender, ref double[] h) { var terr = cityRender.Territories; var edges = new List <Point[]>(); for (var i = 0; i < mesh.Edges.Count; i++) { var e = mesh.Edges[i]; if (e.Right == null) { continue; } if (IsNearEdge(mesh, e.Spot1) || IsNearEdge(mesh, e.Spot2)) { continue; } if (h[e.Spot1] < 0 || h[e.Spot2] < 0) { continue; } if (terr[e.Spot1] != terr[e.Spot2]) { edges.Add(new Point[] { e.Left, e.Right }); } } var output = new List <List <Point> >(); var mergedSegments = MergeSegments(edges); foreach (var segment in mergedSegments) { output.Add(RelaxPath(segment)); } return(output); }