D3.js 找到相对于给定坐标集最近的散点图点(圆)的最佳方法是什么?
假设在2 x 8的网格中有16个圆: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(
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的方法,但完全同意这不一定是这个问题的最佳解决方案,考虑到点数和网格化的事实