我们说我在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时间的一种方式当然是循环遍历所有点,将斜边测量为x
和y
坐标的差异,选择最小值。
我想找到更好的方法。有谁知道一种优化的方式?
答案 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.median
推0
和cols-1
之间的结果(查看每个案例,所有意味着它比嵌套ifs更好)....总体而言,这给出了最近列的索引,然后你做同样的事情行,你就在那里!