Exemple #1
0
    // Called by LandMap.GetZones (), returns number of subregions
    public int ClusterLocationsAccordKMedoidsVoronoi(MapPoint[,] points, TerrainVerticesDatabase vertDatabase)
    {
        // K-means cluster algorithm to separate locations in the regions

        int regionId = 0;

        for (int isleId = 0; isleId < regions.Count; isleId++)
        {
            MapRegion region = regions[isleId];

            double[][] tileLocations = new double[region.turf.Count][];

            for (int i = 0; i < tileLocations.Length; i++)
            {
                tileLocations[i] = new double[3];

                TerrainVertData vertData = vertDatabase.GetVertDataFromRegionTile(region.turf[i], isleId);
                if (vertData != null)
                {
                    tileLocations[i][0] = region.turf[i].x;
                    tileLocations[i][1] = vertData.inlandPosition;
                    tileLocations[i][2] = region.turf[i].y;
                }
                else
                {
                    LoggerTool.Post("Null from VertDB for " + region.turf[i].ToString());
                }
            }

            int k = InitializeNumOfK(tileLocations.Length);
            k = Mathf.Max(1, k);
            Debug.Log(k + " centroid(s)");

            VoronoiIteration kmedoidsVoronoi = new VoronoiIteration(k);
            kmedoidsVoronoi.MaxIterations = 100;

            KMedoidsClusterCollection <double> clusters = kmedoidsVoronoi.Learn(tileLocations);

            int[] labels = clusters.Decide(tileLocations);

            Debug.Log("Number of labels = " + labels.Length);
            for (int i = 0; i < labels.Length; i++)
            {
                points[(int)tileLocations[i][0], (int)tileLocations[i][2]].areaValue = regionId + labels[i];
            }

            regionId += k;
        }

        return(regionId);
    }
Exemple #2
0
    public int ClusterLocationsAccordKMedoidsVoronoi(MapPoint[,] points)
    {
        // K-medoids cluster algorithm to separate locations in the regions

        int regionId = 0;

        for (int isleId = 0; isleId < regions.Count; isleId++)
        {
            MapRegion region = regions[isleId];

            double[][] tileLocations = new double[region.turf.Count][];

            for (int i = 0; i < tileLocations.Length; i++)
            {
                tileLocations[i]    = new double[2];
                tileLocations[i][0] = region.turf[i].x;
                tileLocations[i][1] = region.turf[i].y;
            }

            int k = InitializeNumOfK(region.turf.Count);
            Debug.Log(k + " centroid(s)");

            VoronoiIteration kmedoidsVoronoi = new VoronoiIteration(k);
            kmedoidsVoronoi.MaxIterations = 100;

            KMedoidsClusterCollection <double> clusters = kmedoidsVoronoi.Learn(tileLocations);

            int[] labels = clusters.Decide(tileLocations);

            Debug.Log("Number of labels = " + labels.Length);
            for (int i = 0; i < labels.Length; i++)
            {
                points[(int)tileLocations[i][0], (int)tileLocations[i][1]].areaValue = regionId + labels[i];
            }

            regionId += k;
        }

        return(regionId);
    }