/// <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);
    }
Exemple #2
0
        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);
        }
        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);
        }