循环的引用计数,最终会被 乘于 10 来作为距离分段选择路径进行路线优化
nBeginSift 与 nEndSift的间距越大,并不表示最终路径就越好,最终优化出来的路径,还是会和地形有关。
其实最好路径优化算法是按照角度的变化来选择路径优化,但是预计开销会比较大,有了这个优化方式作为基础,你可以自己去写根据角度变化来优化的算法。
[cpp]
bool CAStar::SearchEx(int X, int Y, std::list &lResult, double dbGapBreak, int nBeginSift, int nEndSift)?
{?
??? DWORD dwTime = clock();?
??? if(!Search(X, Y, lResult, dbGapBreak))?
??????? return false;?
??? std::list::iterator it = lResult.begin();?
??? std::list::iterator it2 = it;?
?????
??? std::list l2;?
??? for(int i = nBeginSift; i < nEndSift; i++)?
??? {?
??????? it = lResult.begin();?
??????? it2 = it;?
??????? for(;it != lResult.end(); ++it)?
??????? {?
??????????? if(_p2g(it2->x, it2->y, it->x, it->y) > (double)(i * 10))?
??????????? {?
??????????????? SetDestinationPos(it->x, it->y);?
??????????????? l2.clear();?
??????????????? if(Search(it2->x, it2->y, l2, 0.0))?
??????????????? {?
??????????????????? it = lResult.erase(it2, it);?
??????????????????? lResult.insert(it, (l2.begin()), (l2.end()));?
??????????????? }?
??????????????? it2 = it;?
??????????? }?
??????? }?
??? }?
?????
??? _outf("耗时:%d 毫秒", clock() - dwTime);?
??? return true;?
}?
bool CAStar::SearchEx(int X, int Y, std::list &lResult, double dbGapBreak, int nBeginSift, int nEndSift)
{
?DWORD dwTime = clock();
?if(!Search(X, Y, lResult, dbGapBreak))
??return false;
?std::list::iterator it = lResult.begin();
?std::list::iterator it2 = it;
?
?std::list l2;
?for(int i = nBeginSift; i < nEndSift; i++)
?{
??it = lResult.begin();
??it2 = it;
??for(;it != lResult.end(); ++it)
??{
???if(_p2g(it2->x, it2->y, it->x, it->y) > (double)(i * 10))
???{
????SetDestinationPos(it->x, it->y);
????l2.clear();
????if(Search(it2->x, it2->y, l2, 0.0))
????{
?????it = lResult.erase(it2, it);
?????lResult.insert(it, (l2.begin()), (l2.end()));
????}
????it2 = it;
???}
??}
?}
?
?_outf("耗时:%d 毫秒", clock() - dwTime);
?return true;
}
?
?
?
以下为 nBeginSift = 6????? nEndSift = 15 的优化结果。
测试时间结果:
[3368] 耗时:47 毫秒
?
?
vcnRo/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />
?
?