嗯…假设标记未分组,不分层或没有其他内容:为什么-在显示标记之前-您不创建特定密度的网格并将标记简单地装到网格的单元格中?
如果您随后算出几个标记落入同一容器(网格单元)中,则可以将它们分组。如果您需要更巧妙的分组,还可以检查相邻的单元格。
也许听起来有点原始,但:
- 没有n ^ 2个算法
- 没有关于输入顺序的假设
- 无需额外处理不会显示的标记
网格的代码:
注意-我来自C 世界(通过[algorithm]标记在此处获得),因此我将坚持使用伪C
。我不知道mapview的API。但是,如果无法将其有效地翻译为您使用的任何语言/库,我会感到惊讶。
输入:-标记列表-世界坐标中的矩形查看窗口(当前正在查看的世界部分)
最简单的形式如下所示:
void draw(MarkerList mlist, View v) { //binning: list<Marker> grid[densityX][densityY]; //2D array with some configurable, fixed density foreach(Marker m in mlist) { if (m.within(v)) { int2 binIdx; binIdx.x=floor(densityX*(m.coord.x-v.x1)/(v.x2-v.x1)); binIdx.y=floor(densityY*(m.coord.y-v.y1)/(v.y2-v.y1)); grid[binIdx.x][binIdx.y].push(m); //just push the reference } //drawing: for (int i=0; i<densityX; ++i) for (int j=0; j<densityY; ++j) { if (grid[i][j].size()>N) { GroupMarker g; g.add(grid[i][j]); //process the list of markers belonging to this cell g.draw(); } else { foreach (Marker m in grid[i][j]) m.draw() } }}
可能出现的问题是在某些群集组中可能会出现不必要的网格拆分,从而形成两个GroupMarker。为了解决这个问题,您可能不仅要考虑一个网格单元,而且还要考虑“
绘图”部分中的相邻网格,并且-如果进行分组,则将相邻单元标记为已访问。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)