青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

李錦俊(mybios)的blog

游戲開發 C++ Cocos2d-x OpenGL DirectX 數學 計算機圖形學 SQL Server

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  86 Posts :: 0 Stories :: 370 Comments :: 0 Trackbacks

公告

QQ:30743734
EMain:mybios@qq.com

常用鏈接

留言簿(16)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 372566
  • 排名 - 67

最新評論

閱讀排行榜

評論排行榜

#ifndef?__ASTAR_SERACH_ALGO_H__
#define ?__ASTAR_SERACH_ALGO_H__

#include?
< Algorithm >
????
namespace ?fredazsq
{????
namespace ?linghuye
{????
????
/**/ /* ************************************************
**?尋路節點
************************************************
*/

template
< typename?TNodeLocation >
struct ?TAXNode
{????
????
float ???????G,?F;
????TNodeLocation??pos;
????TAXNode
* ???pParentNode;
????
bool ???????bClosed;???????? // ?使用狀態表明節點處于開放或關閉列表.
????
????
bool ? operator < ( const ?TAXNode & ?node)? const
????
{????
????????
return ?pos? < ?node.pos;
????}
????
}
;????
????
/**/ /* *****************************************************************************
**??封裝A*尋路算法
*******************************************************************************
**??作為棋盤信息提供類TField必須實現下列函數:
**??1.?bool?IsFieldThrough(TNodeLocation?pos)?const;????????????????????????????????????在?pos?位置是否為空,可通行.
**??2.?float?EvaluateStepCost(TNodeLocation?posFrom,?TNodeLocation?posTo,?TNodeLocation?posLastStep)?const;????????計算pos1,pos2到單步代價.
**??3.?float?EvaluateProbableCost(TNodeLocation?posFrom,?TNodeLocation?posTo)?const;????計算pos1,pos2到估算代價.
**??4.?TNodeLocation*?QueryNeiborLocations(TNodeLocation?pos,?int&?nNodeCount);?const????詢問pos的相鄰可通節點集
*******************************************************************************
**??TNodeLocation,節點位置
**??1.支持<,==,=操作符,如int.
*******************************************************************************
**??0.?初始化時傳入棋盤信息提供類的實例引用.
**??1.?使用主函數SearchPath進行搜索,使用QueryResultPath取得結果.
*****************************************************************************
*/

template
< class ?TField,? class ?TNodeLocation >
struct ?CAStar2DAlgo
{????
public :
????typedef?std::vector
< TNodeLocation > ????CResultPath;
????typedef?TAXNode
< TNodeLocation > ????????CAXNode;
????typedef?std::
set < CAXNode > ????????????CAXNodeSet;
????
????
struct ?CAXNodePriorityQueue???????????? // ?優先隊列?
???? {????
????????std::vector
< CAXNode *> ?m_heap;
????????
????????
static ? bool ?AXNodeCostSortPred(CAXNode * ?n1,?CAXNode * ?n2)
????????
{????
????????????
return ?(n1 -> G? + ?n1 -> F)? > ?(n2 -> G? + ?n2 -> F);
????????}

????????
????????
void ?push(CAXNode * ?pNode)
????????
{
????????????m_heap.push_back(pNode);
????????????std::push_heap(m_heap.begin(),?m_heap.end(),?
& CAXNodePriorityQueue::AXNodeCostSortPred);
????????}

????????
????????CAXNode
* ?pop()
????????
{????
????????????CAXNode
* ?pNode? = ?m_heap.front();
????????????std::pop_heap(m_heap.begin(),?m_heap.end(),?
& CAXNodePriorityQueue::AXNodeCostSortPred);
????????????m_heap.pop_back();
????????????
return ?pNode;
????????}

????????
????????
bool ?empty()
????????
{
????????????
return ?m_heap.empty();
????????}

????????
????????
void ?resort(CAXNode * ?pNode)
????????
{????
????????????std::vector
< CAXNode *> ::iterator?it? = ?std::find(m_heap.begin(),?m_heap.end(),?pNode);
????????????std::push_heap(m_heap.begin(),?it,?
& CAXNodePriorityQueue::AXNodeCostSortPred);
????????}

????????
????????
void ?clear()
????????
{
????????????m_heap.clear();
????????}

????}
;????
????????
public :????
????
const ?TField & ?m_field;
????TNodeLocation??m_posTarget;
????CAXNode
* ?m_ptrTargetNode;???????????????????? // ?Result?Node
????????
????CAXNodeSet?m_setNodes;????????????????????????
// ?All?nodes?in?use?
????CAXNodePriorityQueue?m_queOpenNodes;???????? // ?Cost?sorted?open?list
????????
public :????
????CAStar2DAlgo(
const ?TField & ?field)?:?m_field(field),?m_ptrTargetNode(NULL)
????
{????????
????}
????
????????
????
~ CAStar2DAlgo()
????
{????
????}
????
????????
????
void ?Reset()
????
{????
????????m_setNodes.clear();
????????m_queOpenNodes.clear();
????????m_ptrTargetNode?
= ?NULL;
????}
????
????????
public :????
????inline?CAXNode
* ?ClaimNode(TNodeLocation?pos,?CAXNode * ?pParentNode? = ?NULL)
????
{????
????????CAXNode?node;
????????node.pos?
= ?pos;
????????node.F?
= ?node.G? = ? 0 ;
????????node.bClosed?
= ? false ;???? // ?Default?is?open
????????node.pParentNode? = ?pParentNode;
????????
return ? & ( * m_setNodes.insert(node).first);
????}
????
????????
????
bool ?SearchPath(TNodeLocation?posStart,?TNodeLocation?posTarget)
????
{????
????????CAXNode
* ?pCurNode;
????????m_posTarget?
= ?posTarget;
????????
????????
// ?Add?start?node?into?open?list
????????CAXNode * ?pStartNode? = ?ClaimNode(posStart);
????????m_queOpenNodes.push(pStartNode);
????????
????????
while ( ! m_queOpenNodes.empty())
????????
{????
????????????
// ?Pick?lowest?cost?node
????????????pCurNode? = ?m_queOpenNodes.pop();
????????????
????????????
// ?Check?search?target
???????????? if (pCurNode -> pos? == ?m_posTarget)
????????????
{
????????????????m_ptrTargetNode?
= ?pCurNode;
????????????????
return ? true ;
????????????}

????????????
????????????
// ?Switch?node?from?OpenList?to?CloseList
????????????pCurNode -> bClosed? = ? true ;
????????????ProcessNeighborNodes(pCurNode);
????????}

????????
????????
return ? false ;
????}

????????
????
void ?ProcessNeighborNodes(CAXNode * ?pCurNode)
????
{????
????????CAXNode?tempNode;
????????
int ?nNodeCount? = ? 0 ;
????????TNodeLocation
* ?pLocs? = ?m_field.QueryNeiborLocations(pCurNode -> pos,?nNodeCount);
????????TNodeLocation?posLastStep?
= ?pCurNode -> pParentNode ? ?pCurNode -> pParentNode -> pos?:?pCurNode -> pos;
????????
????????
// ?For?each?neibors?
???????? for ( int ?i? = ? 0 ;?i? < ?nNodeCount;? ++ i)
????????
{????
????????????tempNode.pos?
= ?pLocs[i];
????????????
if (m_field.IsFieldThrough(tempNode.pos))
????????????
{????
????????????????CAXNodeSet::iterator?it?
= ?m_setNodes.find(tempNode);
????????????????
if (it? == ?m_setNodes.end())
????????????????
{????
????????????????????CAXNode
* ?pNewNode? = ?ClaimNode(tempNode.pos,?pCurNode);
????????????????????pNewNode
-> G? = ?pCurNode -> G? + ?m_field.EvaluateStepCost(pCurNode -> pos,?pNewNode -> pos,?posLastStep);
????????????????????pNewNode
-> F? = ?m_field.EvaluateProbableCost(pNewNode -> pos,?m_posTarget);
????????????????????m_queOpenNodes.push(pNewNode);
????????????????}
????
????????????????
else ? if ( ! it -> bClosed)
????????????????
{????
????????????????????CAXNode
& ?node? = ? * it;
????????????????????
float ?G? = ?pCurNode -> G? + ?m_field.EvaluateStepCost(pCurNode -> pos,?node.pos,?posLastStep);
????????????????????
if (G? < ?node.G)
????????????????????
{????
????????????????????????node.G?
= ?G;
????????????????????????node.pParentNode?
= ?pCurNode;
????????????????????????m_queOpenNodes.resort(
& node);
????????????????????}

????????????????}

????????????}

????????}

????}

????
????
/**/ /* *****************************************************************
????**??取回最終結果
????*****************************************************************
*/

????
bool ?QueryResultPath(CResultPath & ?path)
????
{????
????????
if ( ! m_ptrTargetNode)? return ? false ;
????????
????????CAXNode
* ?pNode? = ?m_ptrTargetNode;
????????
while (pNode)
????????
{????
????????????path.push_back(pNode
-> pos);
????????????pNode?
= ?pNode -> pParentNode;
????????}

????????
return ? true ;
????}

}
;

/**/ /* ******************************************************************************
**??TNodeLocation,節點位置
**??1.支持<,==?操作符號.
*******************************************************************************
*/

template
< typename?TNodeLocation >
struct ?CShisenFieldImpl
{????
????TNodeLocation
* ?QueryNeiborLocations(TNodeLocation?pos,? int & ?nRetCount)? const
????
{????
????????
static ? const ? int ?dy[ 4 ]? = ? {? 1 ,? 0 ,? 0 ,? - 1 ?} ;
????????
static ?TNodeLocation?posNeibors[ 4 ];???? // ?Single?thread
????????????????
????????nRetCount?
= ? 4 ;
????????
for ( int ?i? = ? 0 ;?i? < ? 4 ;?i ++ )
????????
{
????????????posNeibors[i].x?
= ?pos.x? + ?dx[i];
????????????posNeibors[i].y?
= ?pos.y? + ?dy[i];
????????}

????????
return ?posNeibors;
????}

????
????
float ?EvaluateStepCost(TNodeLocation?posFrom,?TNodeLocation?posTo,?TNodeLocation?posLast)? const
????
{????
????????
if (((posFrom.x - posTo.x)?? && ??(posLast.y - posFrom.y))?? || ??
???????????((posFrom.y
- posTo.y)?? && ??(posLast.x - posFrom.x)))
????????
{????
????????????
return ? 100 ;
????????}

????????
else ? return ? 1 ;
????}

????
????
float ?EvaluateProbableCost(TNodeLocation?pos1,?TNodeLocation?pos2)? const
????
{
????????
return ? 0 ;
????}

????
/**/ /* ????平滑優化
????float?EvaluateStepCost(MY_POSITION?posFrom,?MY_POSITION?posTo,?MY_POSITION?posLast)?const
????{????
????????int?cx1?=?posTo.x?-?posFrom.x;
????????int?cy1?=?posTo.y?-?posFrom.y;
????????int?cx2?=?posFrom.x?-?posLast.x;
????????int?cy2?=?posFrom.y?-?posLast.y;
????????return?((cx1?==?cx2??&&??cy1?==?cy2)??0?:?10)?+?((cx1??&&??cy1)??14?:?10);
????}
*/
????
}
;????
????
/**/ /* ******************************************************************************
**??最小路徑
******************************************************************************
*/

template
< typename?TNodeLocation >
struct ?CShortestPathFieldImpl
{????
????TNodeLocation
* ?QueryNeiborLocations(TNodeLocation?pos,? int & ?nRetCount)? const
????
{????
????????
static ? const ? int ?dx[ 4 ]? = ? {? 0 ,? - 1 ,? 1 ,?? 0 ?} ;
????????
static ? const ? int ?dy[ 4 ]? = ? {? 1 ,?? 0 ,? 0 ,? - 1 ?} ;
????????
static ?TNodeLocation?posNeibors[ 4 ];???? // ?Single?thread
????????????????
????????nRetCount?
= ? 4 ;
????????
for ( int ?i? = ? 0 ;?i? < ? 4 ;?i ++ )
????????
{
????????????posNeibors[i].x?
= ?pos.x? + ?dx[i];
????????????posNeibors[i].y?
= ?pos.y? + ?dy[i];
????????}

????????
return ?posNeibors;
????}

????
????
float ?EvaluateStepCost(TNodeLocation?posFrom,?TNodeLocation?posTo,?TNodeLocation?posLast)? const
????
{????
????????
return ? 1 ;
????}

????
????
float ?EvaluateProbableCost(TNodeLocation?pos1,?TNodeLocation?pos2)? const
????
{
????????
return ? 0 ;
????}

}
;

/**/ /* ******************************************************************************
**??最小路徑
******************************************************************************
*/

template
< typename?TNodeLocation >
struct ?CGamePathFieldImpl
{????
????TNodeLocation
* ?QueryNeiborLocations(TNodeLocation?pos,? int & ?nRetCount)? const
????
{????
????????
static ? const ? int ?dx[ 8 ]? = ? {? - 1 ,? 0 ,? 1 ,? - 1 ,? 1 ,? - 1 ,?? 0 ,?? 1 ?} ;
????????
static ? const ? int ?dy[ 8 ]? = ? {?? 1 ,? 1 ,? 1 ,?? 0 ,? 0 ,? - 1 ,? - 1 ,? - 1 ?} ;
????????
static ?MY_POSITION?posNeibors[ 8 ];
????????
????????nRetCount?
= ? 8 ;
????????
for ( int ?i? = ? 0 ;?i? < ? 8 ;?i ++ )
????????
{
????????????posNeibors[i].x?
= ?pos.x? + ?dx[i];
????????????posNeibors[i].y?
= ?pos.y? + ?dy[i];
????????}

????????
return ?posNeibors;
????}

????
????
float ?EvaluateStepCost(TNodeLocation?posFrom,?TNodeLocation?posTo,?TNodeLocation?posLast)? const
????
{????
????????
if (posFrom.x - posTo.x?? && ??posFrom.y - posTo.y)
????????
{
????????????
return ? 14 ;
????????}

????????
else ? return ? 10 ;
????}

????
????
float ?EvaluateProbableCost(TNodeLocation?posFrom,?TNodeLocation?posTo)? const
????
{
????????
return ?(abs(posFrom.x - posTo.x)? + ?abs(posFrom.y - posTo.y))? * ? 10 ;
????}

}
;

}
// ?namespace?linghuye
}
// ?namespace?fredazsq

#endif // __FIELD_SERACH_ALGO_H__
posted on 2006-11-19 01:40 李錦俊(mybios) 閱讀(1468) 評論(0)  編輯 收藏 引用 所屬分類: 數學、幾何和圖形學
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产自产2019最新不卡| 亚洲网站啪啪| 亚洲精品社区| 亚洲精品五月天| 99av国产精品欲麻豆| 一本综合精品| 性欧美xxxx视频在线观看| 久久精品女人的天堂av| 裸体丰满少妇做受久久99精品| 久久在线视频| 亚洲大胆女人| 91久久中文字幕| 中文av一区特黄| 欧美亚洲一区二区三区| 老牛嫩草一区二区三区日本| 欧美人与禽性xxxxx杂性| 国产精品三区www17con| 在线成人激情| 亚洲欧美中文另类| 欧美成人精品一区| 一本色道久久综合亚洲精品婷婷| 午夜在线电影亚洲一区| 欧美大香线蕉线伊人久久国产精品| 国产精品sm| 亚洲精品久久久蜜桃| 久久国产一区二区三区| 亚洲精品一区二区在线观看| 小辣椒精品导航| 欧美日韩岛国| 亚洲二区三区四区| 久久爱另类一区二区小说| 亚洲精品少妇| 欧美不卡高清| 黄色欧美成人| 久久激情综合网| 亚洲午夜视频在线| 欧美久久成人| 亚洲国产精品va| 老司机一区二区| 欧美在线高清视频| 国产欧美日韩另类视频免费观看| 国产精品99久久久久久久久久久久| 欧美α欧美αv大片| 久久成人综合视频| 狠狠操狠狠色综合网| 欧美一级视频一区二区| 亚洲美女在线看| 欧美91视频| 亚洲激情视频在线| 免费久久99精品国产| 久久福利一区| 精品成人一区二区| 久久亚洲影院| 欧美96在线丨欧| 亚洲高清二区| 亚洲欧美一区二区视频| 亚洲美女免费视频| 欧美裸体一区二区三区| 亚洲人成网站影音先锋播放| 欧美成人一区二区三区片免费| 欧美一区二视频| 国产日韩一区| 久久久人成影片一区二区三区观看| 亚洲主播在线播放| 国产欧美一区二区三区另类精品| 性做久久久久久久久| 亚洲性色视频| 国产日韩一区二区三区在线播放| 久久se精品一区精品二区| 久久国产精彩视频| 亚洲电影av在线| 欧美激情一区二区三区在线视频观看| 久久久国产精品一区二区中文| 国语自产偷拍精品视频偷| 久久在线播放| 欧美紧缚bdsm在线视频| 亚洲一区二区免费视频| 香港成人在线视频| 亚洲第一成人在线| 亚洲精品一级| 国产日韩欧美麻豆| 欧美 日韩 国产 一区| 欧美精品一区三区| 午夜精品久久久久久久久| 欧美在线视频不卡| 日韩午夜电影在线观看| 午夜精品区一区二区三| 亚洲国产毛片完整版| 在线视频日韩精品| 在线欧美三区| 亚洲性色视频| 亚洲精品免费一区二区三区| 亚洲网站视频福利| 亚洲黄色免费| 午夜宅男久久久| 一区二区免费在线播放| 欧美一区=区| 亚洲日本一区二区三区| 午夜在线播放视频欧美| av成人黄色| 老司机精品导航| 久久成人人人人精品欧| 欧美日韩国产不卡| 老巨人导航500精品| 国产精品久久久久9999| 亚洲国产精品黑人久久久| 国产视频久久久久| 一本大道久久精品懂色aⅴ| 亚洲第一区中文99精品| 狠狠久久五月精品中文字幕| 亚洲精品在线观看免费| 韩日成人在线| 亚洲一区二区三区高清不卡| 亚洲人成久久| 久久综合久久综合久久| 久久久久久久欧美精品| 国产精品久久久久久久久久久久久久 | 亚洲经典自拍| 亚洲一卡久久| 99视频在线观看一区三区| 欧美一区二区三区视频| 欧美激情中文不卡| 欧美国产一区在线| 在线精品视频一区二区| 欧美一激情一区二区三区| 亚洲伊人伊色伊影伊综合网| 欧美激情一区二区三区不卡| 欧美aaa级| 在线观看成人小视频| 欧美一区二区三区免费在线看| 欧美一区二区性| 国产精品一区在线观看你懂的| 日韩一级视频免费观看在线| 一级成人国产| 国产精品二区影院| 亚洲图片在线观看| 欧美一二三视频| 国产伦精品一区二区三区照片91| 亚洲天堂第二页| 欧美一区二区三区视频| 国产情人节一区| 久久精品官网| 欧美电影在线观看| 亚洲六月丁香色婷婷综合久久| 蜜臀va亚洲va欧美va天堂| 欧美成人久久| 亚洲毛片在线免费观看| 欧美日韩一区二区三区视频| 一区二区三区波多野结衣在线观看| 亚洲视频一二区| 国产精品日韩欧美综合 | 欧美极品欧美精品欧美视频| 亚洲国产人成综合网站| 亚洲乱码久久| 国产精品乱码一区二区三区| 午夜亚洲性色福利视频| 牛夜精品久久久久久久99黑人| 亚洲国产mv| 欧美色另类天堂2015| 欧美亚洲午夜视频在线观看| 欧美黄色免费| 午夜精品一区二区三区在线视| 国产亚洲午夜高清国产拍精品| 久久蜜桃精品| 一区二区三区.www| 美女主播一区| 亚洲自拍偷拍福利| 亚洲第一搞黄网站| 欧美色中文字幕| 午夜视频久久久| 亚洲国产mv| 国产精品人人做人人爽| 久久亚洲电影| 一本大道久久a久久综合婷婷| 久久免费视频网| 日韩一区二区免费高清| 国产日韩精品一区二区| 欧美国产日韩一区二区三区| 午夜国产精品视频| 亚洲欧洲在线播放| 久热精品视频在线| 亚洲综合色噜噜狠狠| 亚洲精品日韩激情在线电影| 亚洲欧洲一区二区三区| 蜜臀av一级做a爰片久久| 在线一区二区三区做爰视频网站| 久久久99国产精品免费| 一区二区三区日韩在线观看 | 久久爱www| 一区二区三区国产在线| 嫩草国产精品入口| 久久精品国产亚洲a| 一区二区三区四区精品| 一区二区三区在线免费播放| 欧美日韩综合视频| 欧美激情小视频| 欧美不卡高清| 欧美成人精品三级在线观看| 久久精品一区四区| 亚洲欧美综合精品久久成人|