private void AddToCenterList(List <Characteristics.Center> centers, Characteristics.Center center) { if (center != null && centers.IndexOf(center) < 0) { centers.Add(center); } }
private void Build(Polygon polygon, VoronoiBase voronoi) { Dictionary <Point, Characteristics.Center> centerLoopup = new Dictionary <Point, Characteristics.Center>(); foreach (var point in polygon.Points) { Characteristics.Center center = new Characteristics.Center { id = data.centers.Count, pos = point.ToVector(), neighbours = new List <Characteristics.Center>(), borders = new List <Characteristics.Border>(), corners = new List <Characteristics.Corner>() }; data.centers.Add(center); centerLoopup[point] = center; } foreach (var face in voronoi.Faces) { face.BorderLooping(halfEdge => { Point voronoiEdge1 = halfEdge.Origin; Point voronoiEdge2 = halfEdge.Twin.Origin; Point delaunayEdge1 = polygon.Points[halfEdge.Face.ID]; Point delaunayEdge2 = polygon.Points[halfEdge.Twin.Face.ID]; Characteristics.Border border = new Characteristics.Border { id = data.borders.Count, midPoint = new Vector2((float)(voronoiEdge1.X + voronoiEdge2.X) / 2, (float)(voronoiEdge1.Y + voronoiEdge2.Y) / 2), v0 = MakeCorner(voronoiEdge1), v1 = MakeCorner(voronoiEdge2), d0 = centerLoopup[delaunayEdge1], d1 = centerLoopup[delaunayEdge2] }; if (border.d0 != null) { border.d0.borders.Add(border); } if (border.d1 != null) { border.d1.borders.Add(border); } if (border.v0 != null) { border.v0.protrudes.Add(border); } if (border.v1 != null) { border.v1.protrudes.Add(border); } data.borders.Add(border); if (border.d0 != null && border.d1 != null) { AddToCenterList(border.d0.neighbours, border.d1); AddToCenterList(border.d1.neighbours, border.d0); } if (border.v0 != null && border.v1 != null) { AddToCornerList(border.v0.adjacent, border.v1); AddToCornerList(border.v1.adjacent, border.v0); } if (border.d0 != null) { AddToCornerList(border.d0.corners, border.v0); AddToCornerList(border.d0.corners, border.v1); } if (border.d1 != null) { AddToCornerList(border.d1.corners, border.v0); AddToCornerList(border.d1.corners, border.v1); } if (border.v0 != null) { AddToCenterList(border.v0.touches, border.d0); AddToCenterList(border.v0.touches, border.d1); } if (border.v1 != null) { AddToCenterList(border.v1.touches, border.d0); AddToCenterList(border.v1.touches, border.d1); } }); } }
// Assigning habitats to each polygon meaning that if there is sealine or sea next to it, // then it is habitat otherwise it will depend on the humidity. it will check whether it is high low or medium humidity. private static string GetHabitat(Characteristics.Center p) { if (p.sea) { return("SEA"); } else if (p.water) { if (p.built < 0.1f) { return("MARSH"); } if (p.built > 0.8f) { return("ICE"); } return("LAKE"); } else if (p.sealine) { return("BEACH"); } else if (p.built > 0.8f) { if (p.humidity > 0.50f) { return("SNOW"); } else if (p.humidity > 0.33f) { return("TUNDRA"); } else if (p.humidity > 0.16f) { return("BARE"); } else { return("SCORCHED"); } } else if (p.built > 0.6f) { if (p.humidity > 0.66f) { return("TAIGA"); } else if (p.humidity > 0.33f) { return("SHRUBLAND"); } else { return("TEMPERATE_DESERT"); } } else if (p.built > 0.3f) { if (p.humidity > 0.83f) { return("TEMPERATE_RAIN_FOREST"); } else if (p.humidity > 0.50f) { return("TEMPERATE_DECIDUOUS_FOREST"); } else if (p.humidity > 0.16f) { return("GRASSLAND"); } else { return("TEMPERATE_DESERT"); } } else { if (p.humidity > 0.66f) { return("TROPICAL_RAIN_FOREST"); } else if (p.humidity > 0.33f) { return("TROPICAL_SEASONAL_FOREST"); } else if (p.humidity > 0.16f) { return("GRASSLAND"); } else { return("SUBTROPICAL_DESERT"); } } }