/// <summary> /// Creates the voronoi graph. /// </summary> static void CreateVoronoiGraph() { //Set map sizes WorldGen.MapX = WorldGen.width; WorldGen.MapY = WorldGen.height; //Create the IslandHandler WorldGen.IslandHandler = new IslandService(WorldGen.MapX, WorldGen.MapY); //init the points hash var points = new HashSet <BenTools.Mathematics.Vector>(); //for each dot in the complexity setting create random dots that are within the map and add them to the points list for (int i = 0; i < WorldGen.DotCount; i++) { points.Add(new BenTools.Mathematics.Vector(Random.Range(0, WorldGen.MapX), Random.Range(0, WorldGen.MapY))); } //init the map WorldGen.voronoiMap = null; //iterate on the graph 3 times (more is square, less is chaotic) for (int i = 0; i < 3; i++) { //set the map to the points by computing the graph WorldGen.voronoiMap = Fortune.ComputeVoronoiGraph(points); //for each point in the list, do some error checking and reprocessing foreach (BenTools.Mathematics.Vector vector in points) { double v0 = 0.0d; double v1 = 0.0d; int say = 0; foreach (VoronoiEdge edge in WorldGen.voronoiMap.Edges) { if (edge.LeftData == vector || edge.RightData == vector) { double p0 = (edge.VVertexA[0] + edge.VVertexB[0]) / 2; double p1 = (edge.VVertexA[1] + edge.VVertexB[1]) / 2; v0 += double.IsNaN(p0) ? 0 : p0; v1 += double.IsNaN(p1) ? 0 : p1; say++; } } if (((v0 / say) < WorldGen.MapX) && ((v0 / say) > 0)) { vector[0] = v0 / say; } if (((v1 / say) < WorldGen.MapY) && ((v1 / say) > 0)) { vector[1] = v1 / say; } } } //after 3 runs our grid should be good and we can save the final map WorldGen.voronoiMap = Fortune.ComputeVoronoiGraph(points); }
public void LoadMap(LoadMapParams loadMapParams) { MapX = loadMapParams.MapX; MapY = loadMapParams.MapY; IslandHandler = new IslandService(MapX, MapY); VoronoiGraph voronoiMap = null; for (int i = 0; i < 3; i++) { voronoiMap = Fortune.ComputeVoronoiGraph(loadMapParams.Points); foreach (Vector vector in loadMapParams.Points) { double v0 = 0.0d; double v1 = 0.0d; int say = 0; foreach (VoronoiEdge edge in voronoiMap.Edges) { if (edge.LeftData == vector || edge.RightData == vector) { double p0 = (edge.VVertexA[0] + edge.VVertexB[0]) / 2; double p1 = (edge.VVertexA[1] + edge.VVertexB[1]) / 2; v0 += double.IsNaN(p0) ? 0 : p0; v1 += double.IsNaN(p1) ? 0 : p1; say++; } } if (((v0 / say) < MapX) && ((v0 / say) > 0)) { vector[0] = v0 / say; } if (((v1 / say) < MapY) && ((v1 / say) > 0)) { vector[1] = v1 / say; } } } voronoiMap = Fortune.ComputeVoronoiGraph(loadMapParams.Points); ImproveMapData(voronoiMap, loadMapParams.Fix); }