我正在OpenStreetMap地图上写一个快递/物stream模拟,并已经意识到,如下图所示的基本A *algorithm对于大型地图(如大伦敦)来说速度不够快。 绿色节点对应于放置在开放/优先级队列中的绿色节点,由于数目庞大(整个地图大概是1-2百万),需要5秒左右的时间才能find所画的路线。 不幸的是每条路线100毫秒是我的绝对限制。 目前,节点既存储在邻接列表中,也存储在空间100×100二维数组中。 我正在寻找的方法,我可以权衡预处理的时间,空间,如果需要路线的最佳性,更快的查询。 对于启发式成本的直线Haversine公式是根据轮廓仪最昂贵的函数 – 我尽可能地优化了我的基本A *。 例如,我想如果我从2D数组的每个象限中select一个任意节点X并在每个象限之间运行A *,则可以将path存储到磁盘以便后续模拟。 在查询时,我只能在象限中运行A *search,以便在预先计算的路线和X之间进行search。 有没有我上面描述的更精致的版本,或者我应该追求的另一种方法。 非常感谢! 为了logging,下面是一些基准结果,用于任意加权启发式成本,并计算10对随机挑选的节点之间的path: Weight // AvgDist% // Time (ms) 1 1 1461.2 1.05 1 1327.2 1.1 1 900.7 1.2 1.019658848 196.4 1.3 1.027619169 53.6 1.4 1.044714394 33.6 1.5 1.063963413 25.5 1.6 1.071694171 24.1 1.7 1.084093229 24.3 1.8 1.092208509 22 1.9 1.109188175 […]
我有四个2d顶点ABCD旋转矩形,我需要栅格化/绘制(有效地)在pixelbufer setpixel(x,y,颜色) 怎么做? 我正在尝试一些代码 // convertilg abcd do up down left right, // calculating some dx_left dx_right on y– // etc (frustrating on special cases when there are 2 up_y vertices in same line etc) for(;;) { drawhorizontalline(y, xstart, xend, color); if(y==downy) break; y–; xstart+=dxstart; xend+=dxend; if(y==lefty) dxstart = dxright; if(y==righty) dxend = dxleft; } […]