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

时间:2016-06-29 18:14:10

标签: 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('cx', function(d,i) { return i * 10; })
      .attr('cy', function(d,i) {
        if (i > 7) return 20;
        return 10;
      });

给定该空间中的随机坐标,如何确定最近的.centroid点?

N时间的一种方式当然是循环遍历所有点,将斜边测量为xy坐标的差异,选择最小值。

我想找到更好的方法。有谁知道一种优化的方式?

1 个答案:

答案 0 :(得分:3)

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

  • 如果你有几个节点(在你的例子中是16个),在随机位置,那么你的方法可能是最优的(只需计算斜边的平方,它可以获得几个平方根运算)。 p>

  • 如果您有许多随机位置的节点,您将需要开始考虑quadtrees来管理您的节点。开销不可忽略,因此在您拥有数百或数千个节点之前不要打扰它。从好的方面来说,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,等等。Math.round给出最接近的整数,d3.median0cols-1之间的结果(查看每个案例,所有意味着它比嵌套ifs更好)....总体而言,这给出了最近列的索引,然后你做同样的事情行,你就在那里!