有3D空间,受立方体限制,边缘= 2000。
坐标系中心为点(0; 0; 0),因此最大/最小坐标值为1000 / -1000。
在K球体内部生成了10000个点,这些点位于立方体中。
每个球体的半径(R)为250。
球体中心位于不小于2 * R的距离。
需要确定哪个点与哪个球相关。
输入:10000个结构的数组,如:
struct Point {
int number;
int x;
int y;
int z;
}
其中number是点的唯一id,x,y,z - 它的坐标。
输出:
10000个结构的数组,如:
struct Point {
int number;
int cluster_id;
}
其中cluster_id是该点所属球体的唯一簇ID。
最初我考虑了以下解决方案:
1)找到从坐标中心(0; 0; 0)到点坐标的每个点的欧几里德距离。
2)按降序对这个距离数组进行排序。
3)从已排序的距离数组中获取点并输入一组新的群集最大值。
4)将数组中的以下点与集群最大值集合中的每个值进行比较(最初为1个值)。
如果它的欧几里德距离小于或等于2 * R,那么
将此点标记为属于Kth群集(范围= 1..N),否则将该点添加到群集最大值集。
5)重复步骤4.
我有两个问题:
1)如果Claster Maximals位于球体表面,我的算法只会出现问题。
2)另外,根据任务要求,可能存在2个球体只有1个且只有共同点的情况。
我想如果点属于2个球体,可以用这两个中的任何一个的cluster_id标记它。
请你为这项任务提供合适的解决方案吗?
答案 0 :(得分:0)
给出半径,找到邻居最多的点。
以邻居的平均值为中心,删除半径范围内的所有内容。
重复直到没有密集点为止。
执行一些后处理以进一步优化未分配的点并确保最小距离。