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