private Biomes GetBiome(Center p) { if (p.Ocean) { return Biomes.Ocean; } if (p.Water) { if (p.Elevation < 0.1) { return Biomes.Marsh; } if (p.Elevation > 0.8) { return Biomes.Ice; } return Biomes.Lake; } if (p.Coast) { return Biomes.Beach; } if (p.Elevation > 0.8) { if (p.Moisture > 0.8) { return Biomes.Snow; } if (p.Moisture > 0.5) { return Biomes.Snow; } if (p.Moisture > 0.33) { return Biomes.Tundra; } if (p.Moisture > 0.16) { return Biomes.Bare; } return Biomes.Scorched; } if (p.Elevation > 0.6) { if (p.Moisture > 0.66) return Biomes.Taiga; if (p.Moisture > 0.33) return Biomes.Shrubland; return Biomes.TemperateDesert; } if (p.Elevation > 0.3) { if (p.Moisture > 0.83) return Biomes.TemperateRainForest; if (p.Moisture > 0.5) return Biomes.TemperateDecidousForest; if (p.Moisture > 0.16) return Biomes.Grassland; return Biomes.TemperateDesert; } if (p.Moisture > 0.66) return Biomes.TropicalRainForest; if (p.Moisture > 0.33) return Biomes.TropicalSeasonalForest; if (p.Moisture > 0.16) return Biomes.Grassland; return Biomes.SubtropicalDesert; }
private void BuildGraph(IEnumerable <Vector2> points, Voronoi2.Voronoi voronoi) { var libEdges = voronoi.Edges; var centerLookup = new Dictionary <Vector2, Center>(); foreach (var point in points) { var p = new Center { Index = _centers.Count, Point = point, Neighbors = new List <Center>(), Borders = new List <Edge>(), Corners = new List <Corner>() }; _centers.Add(p); centerLookup[point] = p; } foreach (var p in _centers) { voronoi.Region(p.Point); } _cornerMap = new Dictionary <int, List <Corner> >(); foreach (var libEdge in libEdges) { var dedge = libEdge.DelaunayLine(); var vedge = libEdge.VoronoiEdge(); var edge = new Edge { Index = _edges.Count, River = 0, Midpoint = vedge.P0.HasValue && vedge.P1.HasValue ? Vector2.Lerp(vedge.P0.Value, vedge.P1.Value, 0.5f) : (Vector2?)null }; _edges.Add(edge); edge.V0 = MakeCorner(vedge.P0); edge.V1 = MakeCorner(vedge.P1); edge.D0 = dedge.P0.HasValue ? centerLookup[dedge.P0.Value] : null; edge.D1 = dedge.P1.HasValue ? centerLookup[dedge.P1.Value] : null; if (edge.D0 != null) { edge.D0.Borders.Add(edge); } if (edge.D1 != null) { edge.D1.Borders.Add(edge); } if (edge.V0 != null) { edge.V0.Protrudes.Add(edge); } if (edge.V1 != null) { edge.V1.Protrudes.Add(edge); } if (edge.D0 != null && edge.D1 != null) { AddToCenterList(edge.D0.Neighbors, edge.D1); AddToCenterList(edge.D1.Neighbors, edge.D0); } if (edge.V0 != null && edge.V1 != null) { AddToCornersList(edge.V0.Adjacent, edge.V1); AddToCornersList(edge.V1.Adjacent, edge.V0); } if (edge.D0 != null) { AddToCornersList(edge.D0.Corners, edge.V0); AddToCornersList(edge.D0.Corners, edge.V1); } if (edge.D1 != null) { AddToCornersList(edge.D1.Corners, edge.V0); AddToCornersList(edge.D1.Corners, edge.V1); } if (edge.V0 != null) { AddToCenterList(edge.V0.Touches, edge.D0); AddToCenterList(edge.V0.Touches, edge.D1); } if (edge.V1 != null) { AddToCenterList(edge.V1.Touches, edge.D0); AddToCenterList(edge.V1.Touches, edge.D1); } } }
private string GetBiome(Center p) { if (p.Ocean) { return("Ocean"); } if (p.Water) { if (p.Elevation < 0.1f) { return("Marsh"); } if (p.Elevation > 0.8f) { return("Ice"); } return("Lake"); } if (p.Coast) { return("Beach"); } if (p.Elevation > 0.8f) { if (p.Moisture > 0.50f) { return("Snow"); } if (p.Moisture > 0.33f) { return("Tundra"); } if (p.Moisture > 0.16f) { return("Bare"); } return("Scorched"); } if (p.Elevation > 0.6f) { if (p.Moisture > 0.66f) { return("Taiga"); } if (p.Moisture > 0.33f) { return("Shrubland"); } return("TemperateDesert"); } if (p.Elevation > 0.3f) { if (p.Moisture > 0.83) { return("TemperateRainForest"); } if (p.Moisture > 0.50f) { return("TemperateDecidousForest"); } if (p.Moisture > 0.16f) { return("Grassland"); } return("TemperateDesert"); } if (p.Moisture > 0.66f) { return("TropicalRainForest"); } if (p.Moisture > 0.33f) { return("TropicalSeasonalForest"); } if (p.Moisture > 0.16f) { return("Grassland"); } return("SubtropicalDesert"); }
private string GetBiome(Center p) { if (p.Ocean) { return "Ocean"; } if (p.Water) { if (p.Elevation < 0.1f) return "Marsh"; if (p.Elevation > 0.8f) return "Ice"; return "Lake"; } if (p.Coast) { return "Beach"; } if (p.Elevation > 0.8f) { if (p.Moisture > 0.50f) return "Snow"; if (p.Moisture > 0.33f) return "Tundra"; if (p.Moisture > 0.16f) return "Bare"; return "Scorched"; } if (p.Elevation > 0.6f) { if (p.Moisture > 0.66f) return "Taiga"; if (p.Moisture > 0.33f) return "Shrubland"; return "TemperateDesert"; } if (p.Elevation > 0.3f) { if (p.Moisture > 0.83) return "TemperateRainForest"; if (p.Moisture > 0.50f) return "TemperateDecidousForest"; if (p.Moisture > 0.16f) return "Grassland"; return "TemperateDesert"; } if (p.Moisture > 0.66f) return "TropicalRainForest"; if (p.Moisture > 0.33f) return "TropicalSeasonalForest"; if (p.Moisture > 0.16f) return "Grassland"; return "SubtropicalDesert"; }
private void BuildGraph(IEnumerable<Vector2> points, Voronoi2.Voronoi voronoi) { var libEdges = voronoi.Edges; var centerLookup = new Dictionary<Vector2, Center>(); foreach (var point in points) { var p = new Center { Index = _centers.Count, Point = point, Neighbors = new List<Center>(), Borders = new List<Edge>(), Corners = new List<Corner>() }; _centers.Add(p); centerLookup[point] = p; } foreach (var p in _centers) { voronoi.Region(p.Point); } _cornerMap = new Dictionary<int, List<Corner>>(); foreach (var libEdge in libEdges) { var dedge = libEdge.DelaunayLine(); var vedge = libEdge.VoronoiEdge(); var edge = new Edge { Index = _edges.Count, River = 0, Midpoint = vedge.P0.HasValue && vedge.P1.HasValue ? Vector2.Lerp(vedge.P0.Value, vedge.P1.Value, 0.5f) : (Vector2?) null }; _edges.Add(edge); edge.V0 = MakeCorner(vedge.P0); edge.V1 = MakeCorner(vedge.P1); edge.D0 = dedge.P0.HasValue ? centerLookup[dedge.P0.Value] : null; edge.D1 = dedge.P1.HasValue ? centerLookup[dedge.P1.Value] : null; if (edge.D0 != null) {edge.D0.Borders.Add(edge);} if (edge.D1 != null) { edge.D1.Borders.Add(edge);} if (edge.V0 != null) { edge.V0.Protrudes.Add(edge);} if (edge.V1 != null) { edge.V1.Protrudes.Add(edge);} if (edge.D0 != null && edge.D1 != null) { AddToCenterList(edge.D0.Neighbors, edge.D1); AddToCenterList(edge.D1.Neighbors, edge.D0); } if (edge.V0 != null && edge.V1 != null) { AddToCornersList(edge.V0.Adjacent, edge.V1); AddToCornersList(edge.V1.Adjacent, edge.V0); } if (edge.D0 != null) { AddToCornersList(edge.D0.Corners, edge.V0); AddToCornersList(edge.D0.Corners, edge.V1); } if (edge.D1 != null) { AddToCornersList(edge.D1.Corners, edge.V0); AddToCornersList(edge.D1.Corners, edge.V1); } if (edge.V0 != null) { AddToCenterList(edge.V0.Touches, edge.D0); AddToCenterList(edge.V0.Touches, edge.D1); } if (edge.V1 != null) { AddToCenterList(edge.V1.Touches, edge.D0); AddToCenterList(edge.V1.Touches, edge.D1); } } }
private static void AddToCenterList(IList<Center> neighbors, Center x) { if ( x!=null && neighbors.IndexOf(x) < 0) neighbors.Add(x); }
private static void AddToCenterList(ICollection<Center> v, Center center) { if (center != null && !v.Contains(center)) { v.Add(center); } }
private void BuildGraph(VoronoiGraph voronoi) { var points = voronoi.Sites; var libedges = voronoi.Edges; var centerLookup = new Dictionary<PointF, Center>(); foreach (var point in points) { point.Region(new RectangleF(0, 0, voronoi.Width, voronoi.Height)); var p = new Center { Index = Centers.Count, Point = point }; Centers.Add(p); centerLookup[point] = p; } foreach (var libedge in libedges.Where(e=>e.Visible)) { var dedge = libedge.DelauneyLine; var vedge = libedge.VoronoiEdge; var edge = new Edge1 { Index = Edges.Count, Midpoint = (Valid(vedge.P1) && Valid(vedge.P2)) ? new PointF((vedge.P1.X + vedge.P2.X) * 0.5f, (vedge.P1.Y + vedge.P2.Y) * 0.5f) : InvalidPoint }; Edges.Add(edge); // edges point to corners edge.V0 = MakeCorner(vedge.P1); edge.V1 = MakeCorner(vedge.P2); // edges point to centers edge.D0 = centerLookup[dedge.P1]; edge.D1 = centerLookup[dedge.P2]; // Centers point to edges if (edge.D0 != null) { edge.D0.Borders.Add(edge); } if (edge.D1 != null) { edge.D1.Borders.Add(edge); } // Corners point to edges if (edge.V0 != null) { edge.V0.Protrudes.Add(edge); } if (edge.V1 != null) { edge.V1.Protrudes.Add(edge); } // Centers point to centers if (edge.D0 != null && edge.D1 != null) { AddToCenterList(edge.D0.Neighbors, edge.D1); AddToCenterList(edge.D1.Neighbors, edge.D0); } // Corners point to corners if (edge.V0 != null && edge.V1 != null) { AddToCornerList(edge.V0.Adjacent, edge.V1); AddToCornerList(edge.V1.Adjacent, edge.V0); } // Centers point to corners if (edge.D0 != null) { AddToCornerList(edge.D0.Corners, edge.V0); AddToCornerList(edge.D0.Corners, edge.V1); } if (edge.D1 != null) { AddToCornerList(edge.D1.Corners, edge.V0); AddToCornerList(edge.D1.Corners, edge.V1); } // Corners point to centers if (edge.V0 != null) { AddToCenterList(edge.V0.Touches, edge.D0); AddToCenterList(edge.V0.Touches, edge.D1); } if (edge.V1 != null) { AddToCenterList(edge.V1.Touches, edge.D0); AddToCenterList(edge.V1.Touches, edge.D1); } } }
private Edge1 LookupEdgeFromCenter(Center p, Center r) { foreach (var edge in p.Borders) { if (edge.D0 == r || edge.D1 == r) { return edge; } } return null; }