コード例 #1
0
ファイル: Terrain.cs プロジェクト: r2d2m/FantasyMapGenerator
        public double[] GetTerritories(ref CityRender cityRender, ref int[] downhill, ref Mesh mesh, ref double[] h)
        {
            var cities = cityRender.Cities;
            var n      = cityRender.AreaProperties.NumberOfTerritories;

            if (n > cities.Count)
            {
                n = cities.Count;
            }
            var flux        = GetFlux(ref mesh, ref downhill, h);
            var territories = new double[h.Length];
            var queue       = new SimplePriorityQueue <CityProperty>();//5 is made up number

            for (var i = 0; i < n; i++)
            {
                territories[cities[i]] = cities[i];
                var nbs = Neighbours(mesh, cities[i]);
                for (var j = 0; j < nbs.Count; j++)
                {
                    var score = Weight(mesh, h, flux, cities[i], nbs[j]);
                    queue.Enqueue(new CityProperty()
                    {
                        Score = score,
                        City  = cities[i],
                        Vx    = nbs[j]
                    }, (float)score);
                }
            }
            while (queue.Count > 0)
            {
                var u = queue.Dequeue();
                if (territories[u.Vx] != 0)
                {
                    continue;
                }
                territories[u.Vx] = u.City;
                var nbs = Neighbours(mesh, u.Vx);
                for (var i = 0; i < nbs.Count; i++)
                {
                    var v = nbs[i];
                    if (territories[v] != 0)
                    {
                        continue;
                    }
                    var newdist = Weight(mesh, h, flux, u.Vx, v);
                    var score   = u.Score + newdist;
                    queue.Enqueue(new CityProperty()
                    {
                        Score = score,
                        City  = u.City,
                        Vx    = v
                    }, (float)score);
                }
            }
            return(territories);
        }
コード例 #2
0
ファイル: Terrain.cs プロジェクト: r2d2m/FantasyMapGenerator
        public void PlaceCities(ref CityRender cityRender, ref int[] downhill, ref Mesh mesh, ref double[] h)
        {
            var n      = cityRender.AreaProperties.NumberOfCities;
            var cities = cityRender.Cities;

            for (var i = 0; i < n; i++)
            {
                PlaceCity(ref cities, ref downhill, ref mesh, ref h);
            }
            cityRender.Cities = cities;
        }
コード例 #3
0
ファイル: Terrain.cs プロジェクト: r2d2m/FantasyMapGenerator
        public List <List <Point> > GetBorders(ref Mesh mesh, ref CityRender cityRender, ref double[] h)
        {
            var terr  = cityRender.Territories;
            var edges = new List <Point[]>();

            for (var i = 0; i < mesh.Edges.Count; i++)
            {
                var e = mesh.Edges[i];
                if (e.Right == null)
                {
                    continue;
                }
                if (IsNearEdge(mesh, e.Spot1) || IsNearEdge(mesh, e.Spot2))
                {
                    continue;
                }
                if (h[e.Spot1] < 0 || h[e.Spot2] < 0)
                {
                    continue;
                }
                if (terr[e.Spot1] != terr[e.Spot2])
                {
                    edges.Add(new Point[] { e.Left, e.Right });
                }
            }

            var output         = new List <List <Point> >();
            var mergedSegments = MergeSegments(edges);

            foreach (var segment in mergedSegments)
            {
                output.Add(RelaxPath(segment));
            }

            return(output);
        }