我正在编写一个实现 SCVT(Spherical Centroidal Voronoi Tesselation)的程序。我从分布在单位球面上的一组点开始(我可以选择随机点或等面积螺旋)。会有几百到可能 64K 点。
然后,我需要生成大约数百万个随机样本点,为每个样本找到集合中最近的点,并使用它来计算该点的“权重”。(这个权重可能必须从另一个球形集合中查找,但是对于任何给定的算法运行,该集合将保持静态。)
然后我将原始点移动到计算点,并迭代该过程,大概 10 或 20 次。这将为我提供 Voronoi 瓷砖的中心以供后续使用。
稍后我将需要找到给定点的最近邻居,以查看用户单击了哪个图块。这在上述问题中很容易解决,并且无论如何都不需要超快。我需要提高效率的部分是单位球面上数百万个最近的邻居。任何指针?
哦,我使用的是 x、y、z 坐标,但这不是一成不变的。看起来它会简化事情。我也在使用我最熟悉的 C,但也不拘泥于那个选择。:)
我考虑过对样本点使用螺旋模式,因为这至少让我找到了最后一个点的邻居作为下一次搜索的良好起点。但如果我这样做,看起来它会使任何类型的树搜索变得无用。
编辑:[对不起,我以为我对标题和标签很清楚。我可以轻松生成随机点。问题是最近邻搜索。当所有点都在单位球面上时,什么是有效的算法?]