public override IPoints GetCluster(ClusterInfo clusterInfo) { return RunClusterAlgo(clusterInfo); }
public IPoints RunClusterAlgo(ClusterInfo clusterInfo) { // Skip points outside the grid IPoints filtered = clusterInfo.IsFilterData ? FilterDataset(Dataset, Grid) : Dataset; // Put points in buckets foreach (var p in filtered.Data) { var idxy = GetPointMappedIds(p, Grid, DeltaX, DeltaY); var idx = idxy[0]; var idy = idxy[1]; // Bucket id var id = GetId(idx, idy); // Bucket exists, add point if (BucketsLookup.ContainsKey(id)) { BucketsLookup[id].Points.Add(p); } // New bucket, create and add point else { var bucket = new Bucket(idx, idy, id); bucket.Points.Add(p); BucketsLookup.Add(id, bucket); } } // Calculate centroid for all buckets SetCentroidForAllBuckets(BucketsLookup.Values); // Merge if gridpoint is to close if (AlgoConfig.DoMergeGridIfCentroidsAreCloseToEachOther) MergeClustersGrid(); if (AlgoConfig.DoUpdateAllCentroidsToNearestContainingPoint) UpdateAllCentroidsToNearestContainingPoint(); // Check again // Merge if gridpoint is to close if (AlgoConfig.DoMergeGridIfCentroidsAreCloseToEachOther && AlgoConfig.DoUpdateAllCentroidsToNearestContainingPoint) { MergeClustersGrid(); // And again set centroid to closest point in bucket UpdateAllCentroidsToNearestContainingPoint(); } return GetClusterResult(Grid); }
public abstract IPoints GetCluster(ClusterInfo clusterInfo);