54 double max_radius_sq = max_radius * max_radius;
57 uint32_t first_cluster_to_split = 0;
58 for (; first_cluster_to_split < k; first_cluster_to_split++)
59 if (radii[first_cluster_to_split] > max_radius_sq)
61 if (first_cluster_to_split == k)
65 uint32_t *temp_clusters =
lwalloc(
sizeof(uint32_t) * n);
66 double *temp_radii =
lwalloc(
sizeof(
double) * n);
71 for (uint32_t cluster = first_cluster_to_split; cluster < k; cluster++)
73 if (radii[cluster] <= max_radius_sq)
77 uint32_t cluster_size = 0;
78 for (uint32_t i = 0; i < n; i++)
79 if (clusters[i] == cluster)
80 temp_objs[cluster_size++] = objs[i];
81 if (cluster_size <= 1)
85 kmeans(temp_objs, temp_clusters, cluster_size, temp_centers, temp_radii, 2, 0);
89 for (uint32_t i = 0; i < n; i++)
90 if (clusters[i] == cluster)
91 if (temp_clusters[d++])
94 centers[cluster] = temp_centers[0];
95 centers[new_k] = temp_centers[1];
96 radii[cluster] = temp_radii[0];
97 radii[new_k] = temp_radii[1];
void * lwalloc(size_t size)
static uint32_t kmeans(POINT4D *objs, uint32_t *clusters, uint32_t n, POINT4D *centers, double *radii, uint32_t min_k, double max_radius)