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");
         }
     }
 }