D3.js 找到相对于给定坐标集最近的散点图点(圆)的最佳方法是什么?

D3.js 找到相对于给定坐标集最近的散点图点(圆)的最佳方法是什么?,d3.js,geometry,nearest-neighbor,D3.js,Geometry,Nearest Neighbor,假设在2 x 8的网格中有16个圆: svg = d3.select(body).append('svg').attr('height,h).attr('width',w); svg.selectAll('.centroids') .data(d3.range(0,16)) .enter() .append('circle') .attr('class','centroids') .attr('r','5') .attr(

假设在2 x 8的网格中有16个圆:

svg = d3.select(body).append('svg').attr('height,h).attr('width',w);

svg.selectAll('.centroids')
      .data(d3.range(0,16))
      .enter()
      .append('circle')
      .attr('class','centroids')
      .attr('r','5')
      .attr('cx', function(d,i) { return i * 10; })
      .attr('cy', function(d,i) {
        if (i > 7) return 20;
        return 10;
      });
给定该空间中的随机坐标,如何确定最近的
质心点

当然,N时间中的一种方法是循环所有点,测量斜边到
x
y
坐标的差值,选择最小值


不过我想找个更好的办法。有人知道优化方法吗?

优化将取决于您的具体设置:

  • 如果您有几个节点(如示例中的16个节点)处于随机位置,那么您的方法可能是最优的(只需计算斜边的平方,这将获得一些平方根运算)

  • 如果有许多节点处于随机位置,则需要开始考虑
    四叉树
    来管理节点。开销是不可忽略的,所以在拥有成百上千个节点之前不要担心它。另一方面,
    d3
    为您编写了所有代码

  • 对于网格:

    var startx=0;
    var offsetx=10;
    var cols=8;
    var starty=10;
    var offsety=10;
    var rows=2; 
    var xi=d3.median([0,cols-1, Math.round((x-startx)/stepx)])
    var yi=d3.median([0,rows-1, Math.round((y-starty)/stepy)])
    var i=xi + yi*cols
    
    这是常数时间,根据尺寸调整(多个)常数

    一点细节:
    (x-startx)/stepx
    允许缩放坐标,使第一个点位于0,下一个点位于1,等等。
    数学。舍入
    给出最接近的整数,
    d3。中值
    将结果推到
    0
    cols-1
    (检查每种情况,都意味着它比嵌套ifs更好)。。。。总的来说,这会给出最近列的索引,然后对行执行相同的操作,结果就是这样


    • 优化将取决于您的精确设置:

      • 如果您有几个节点(如示例中的16个节点)处于随机位置,那么您的方法可能是最优的(只需计算斜边的平方,这将获得一些平方根运算)

      • 如果有许多节点处于随机位置,则需要开始考虑
        四叉树
        来管理节点。开销是不可忽略的,所以在拥有成百上千个节点之前不要担心它。另一方面,
        d3
        为您编写了所有代码

      • 对于网格:

        var startx=0;
        var offsetx=10;
        var cols=8;
        var starty=10;
        var offsety=10;
        var rows=2; 
        var xi=d3.median([0,cols-1, Math.round((x-startx)/stepx)])
        var yi=d3.median([0,rows-1, Math.round((y-starty)/stepy)])
        var i=xi + yi*cols
        
        这是常数时间,根据尺寸调整(多个)常数

        一点细节:
        (x-startx)/stepx
        允许缩放坐标,使第一个点位于0,下一个点位于1,等等。
        数学。舍入
        给出最接近的整数,
        d3。中值
        将结果推到
        0
        cols-1
        (检查每种情况,都意味着它比嵌套ifs更好)。。。。总的来说,这会给出最近列的索引,然后对行执行相同的操作,结果就是这样


      坐标是根据您的代码固定的,还是希望对任何可能的位置集有一个更通用的解决方案?坐标将固定到网格上(不一定与上述相同)。一般的解决方案是理想的。为什么不使用voronoi呢?看一看这个例子:坐标是根据你的代码固定的,还是你想为任何可能的位置集提供一个更通用的解决方案?坐标将固定到一个网格上(不一定与上面相同)。一般的解决方案是理想的。为什么不使用voronoi呢?看看这个例子:很好的答案+1的方法,但完全同意这不一定是这个问题的最佳解决方案,考虑到分数的数量和他们是很好的答案这一事实+1的方法,但完全同意这不一定是这个问题的最佳解决方案,考虑到点数和网格化的事实