public static void Voronoi(int seed, CVec2 dimensions, ref Map map) { List <CVec2> sites = MakeVoronoiSites(seed, dimensions, 6); for (var itY = 0; itY < dimensions.y; ++itY) { for (var itX = 0; itX < dimensions.x; ++itX) { var idx = map.Idx(itX, itY); map.tiles[idx].Layers.Remove(LayerType.Voronoi); float bestDistance = 9999999; for (var itSite = 0; itSite < sites.Count; ++itSite) { CVec2 site = sites[itSite]; float siteDistance = site.DistanceTo(map.tiles[idx].Location); if (itSite == 0) { var layer = new VoronoiLayer { VoronoiSite = site, VoronoiColor = GenerateColor(0) }; map.tiles[idx].Layers.Add(LayerType.Voronoi, layer); bestDistance = siteDistance; } else if (siteDistance < bestDistance) { var layer = map.tiles[idx].Layers[LayerType.Voronoi] as VoronoiLayer; layer.VoronoiSite = site; layer.VoronoiColor = GenerateColor(itSite); bestDistance = siteDistance; //map.tiles[idx].Layers[LayerType.Voronoi] = layer; } } } } }
public static List <CVec2> MakeVoronoiSites(int seed, CVec2 dimensions, int count) { var result = new List <CVec2>(); var seedOffset = 2939; var rng = seed > 0 ? new Random(seed + seedOffset) : new Random(); for (var i = 0; i < count; ++i) { CVec2 next = new CVec2(rng.Next(dimensions.x), rng.Next(dimensions.y)); result.Add(next); } return(result); }