Algorithm 球体上密度最高的位置

Algorithm 球体上密度最高的位置,algorithm,math,geometry,computational-geometry,Algorithm,Math,Geometry,Computational Geometry,球面上有很多点。 如何计算具有最大点密度的球体的面积/光斑? 我需要尽快完成这项工作。例如,如果这是一个正方形,我想我可以创建一个网格,然后让点投票决定网格的哪个部分是最好的。 我尝试过将点转换成球坐标,然后做一个网格,这两种方法都没有很好的效果,因为北极周围的点离球很近,但在转换后很遥远 感谢您按照我在回答中的描述,将其划分为相等面积的区域(以平行线和子午线为界),并计算每个区域的点数 区域的纵横比将不均匀(当N~M时,赤道区域将更为“方形”,而极地区域将更为拉长)。 这不是问题,因为随着N和

球面上有很多点。 如何计算具有最大点密度的球体的面积/光斑? 我需要尽快完成这项工作。例如,如果这是一个正方形,我想我可以创建一个网格,然后让点投票决定网格的哪个部分是最好的。 我尝试过将点转换成球坐标,然后做一个网格,这两种方法都没有很好的效果,因为北极周围的点离球很近,但在转换后很遥远

感谢您按照我在回答中的描述,将其划分为相等面积的区域(以平行线和子午线为界),并计算每个区域的点数

区域的纵横比将不均匀(当
N~M
时,赤道区域将更为“方形”,而极地区域将更为拉长)。 这不是问题,因为随着
N
M
的增加,区域的直径变为0。 这种方法的计算简单性胜过了包含漂亮图片的其他优秀答案中更好的区域一致性


一个简单的修改是在链接答案中描述的
N*M
区域中添加两个“极帽”区域,以提高数值稳定性(当点非常接近极点时,其经度定义不清楚)。这样区域的纵横比是有界的。

考虑使用地理方法来解决这个问题。GIS工具、SQL中的地理数据类型等都处理球体的曲率。如果你不是真的在地球上建模,你可能需要找到一个使用纯球体而不是类地球球体的坐标系

为了提高速度,如果您有大量的点,并且需要它们的最密集位置,光栅热图类型的解决方案可能会很好地工作。您可以创建低分辨率光栅,然后缩放到高密度区域,并仅创建您关心的高分辨率单元

您可以使用保留区域的


这将允许您使用该技巧有效地计算网格中的点,也可以计算滑动窗口(box Parzen窗口)中的点。

将球体上的点视为3D点可能不会太糟糕

尝试以下任一方法:

  • 选择k,在3D中对数据中的每个点或选定的关注点进行近似k-NN搜索,然后根据其到查询点的距离对结果进行加权。不同的近似k-NN算法的复杂度可能不同
  • 构建一个类似于k-d树的空间分区数据结构,然后进行近似(或精确)范围计数查询,其中球范围以数据中的每个点或所选兴趣点为中心。对于使用最新算法的每个近似范围查询,复杂性为O(log(n)+epsilon^(-3))或O(epsilon^(-3)*log(n)),其中epsilon是范围错误阈值w.r.t.查询球的大小。对于精确范围查询,每个查询的复杂度为O(n^(2/3))

  • 在混合中添加一些其他替代方案:可以通过细化内接多面体,在球形几何体上定义许多(几乎)规则网格

    第一个选项称为二十面体网格,它是球面的三角剖分。通过围绕每个顶点连接三角形的中心,还可以基于基础三角剖分创建双六边形栅格:

    如果不喜欢三角形(和/或六边形),另一个选项是立方体球体栅格,它是通过细分内接立方体的面并将结果投影到球面上形成的:

    在这两种情况下,重要的一点是生成的网格几乎是规则的——因此,要计算球体上密度最高的区域,只需执行直方图样式的分析,计算每个网格单元的采样数

    正如许多评论者所指出的那样,为了解释网格中的轻微不规则性,可以通过除以每个网格单元的面积来归一化直方图计数。然后,得出的密度作为“每单位面积”的测量值。要计算每个网格单元的面积,有两个选项:(i)可以通过假设边是直线来计算每个单元的“平坦”面积——当网格足够密集时,这种近似可能非常好,或者(ii)可以计算“真实”面积通过计算必要的曲面积分来计算曲面面积

    如果您对高效执行必要的“单元中的点”查询感兴趣,一种方法是将网格构造为一个——从一个粗糙的内接多面体开始,并将其面细化为一个子面树。要定位封闭单元,只需从根遍历树,这通常是一个
    O(log(n))
    操作


    您可以获得有关这些网格类型的其他信息。

    事实上,没有真正的理由将球体划分为常规的非重叠网格,请尝试以下方法:

    • 将球体划分为半重叠的圆

      有关生成均匀分布点(圆心)的信息,请参见此处

    • 通过一个简单的点积,你可以很快识别出每个圆中的点。如果某些点被重复计数,这并不重要,点最多的圆仍然代表最高密度

    mathematica实现 这需要12秒来分析5000个点。(写起来大约花了10分钟)


    这与我的答案正好相反

    只需将等距球面顶点方程转化为曲面单元指数即可。甚至不要试图想象不同的细胞,否则你会发疯。但是如果有人真的这么做了,那么请把结果贴在这里(现在让我说)

    现在只需创建二维细胞图,并在
    O(N)
    中进行密度计算(如直方图所示)
     testcircles = { RandomReal[ {0, 1}, {3}] // Normalize};
     Do[While[ (test = RandomReal[ {-1, 1}, {3}] // Normalize ;
         Select[testcircles , #.test > .9 & , 1] ) == {} ];
            AppendTo[testcircles, test];, {2000}];
     vmax = testcircles[[First@
        Ordering[-Table[ 
            Count[ (testcircles[[i]].#) & /@ points   , x_ /; x > .98 ] ,
                  {i, Length[testcircles]}], 1]]];