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

李錦俊(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>
            欧美国产先锋| 欧美成人精品影院| 99亚洲视频| 欧美日韩在线免费| 亚洲欧美一区二区三区极速播放 | 亚洲国产综合91精品麻豆| 免费短视频成人日韩| aa日韩免费精品视频一| 美国十次成人| 日韩视频在线观看一区二区| 日韩午夜三级在线| 亚洲一区二区在| 欧美一级专区| 久热精品视频在线| 亚洲黄色精品| 亚洲精品中文字幕女同| 亚洲毛片在线观看.| 亚洲免费视频网站| 久久综合九色综合网站| 欧美激情一区二区三区在线| 欧美性视频网站| 国产在线成人| 日韩一级裸体免费视频| 欧美一级视频一区二区| 亚洲第一在线视频| 亚洲综合色网站| 欧美国产成人精品| 国内偷自视频区视频综合| 亚洲精品美女在线观看| 西瓜成人精品人成网站| 亚洲福利小视频| 欧美一区免费视频| 欧美理论在线| 亚洲高清不卡一区| 欧美伊人久久久久久午夜久久久久 | 欧美日本高清视频| 国产日韩欧美精品综合| 1000精品久久久久久久久| 在线国产欧美| 亚洲桃色在线一区| 狂野欧美一区| 亚洲视频一二| 欧美二区在线播放| 红桃视频亚洲| 午夜精品一区二区三区在线视| 久久亚洲精品一区| 欧美一进一出视频| 一本久久综合亚洲鲁鲁五月天| 午夜在线一区| 亚洲综合社区| 欧美人与性动交cc0o| 国产在线精品一区二区夜色| 国产一区二区三区高清 | 久久大逼视频| 欧美人与性动交α欧美精品济南到| 狠狠网亚洲精品| 亚洲欧美中文字幕| 日韩亚洲成人av在线| 欧美成人免费全部观看天天性色| 红桃视频一区| 久久久久成人精品免费播放动漫| 夜夜嗨av一区二区三区| 欧美激情在线观看| 亚洲欧洲日本在线| 亚洲大黄网站| 欧美成年视频| 亚洲精品视频在线观看免费| 欧美成人一品| 欧美成人伊人久久综合网| 在线免费高清一区二区三区| 久久这里只有| 另类激情亚洲| 亚洲精品欧美一区二区三区| 欧美成人网在线| 欧美国产精品中文字幕| 99精品黄色片免费大全| 最近看过的日韩成人| 欧美华人在线视频| 中日韩男男gay无套| 一区二区三区欧美日韩| 国产精品久久久久久一区二区三区 | 国产一区二区三区av电影| 亚洲综合视频网| 亚洲一区二区av电影| 国产精品不卡在线| 亚洲尤物在线视频观看| 亚洲午夜久久久久久尤物| 国产精品剧情在线亚洲| 久久国产精品电影| 免费在线一区二区| 99国产一区| 国产综合一区二区| 免费日韩成人| 欧美性一二三区| 久久国产精品亚洲va麻豆| 欧美一区网站| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲一二三区在线观看| 中文一区在线| 在线观看国产精品网站| 亚洲欧洲精品一区二区三区不卡| 欧美亚洲第一区| 久久久成人网| 欧美日韩精品免费观看视频完整| 欧美中文字幕视频| 欧美成人精品在线播放| 久久国产乱子精品免费女| 欧美高清视频www夜色资源网| 新67194成人永久网站| 久久精品国产96久久久香蕉| 亚洲日本中文字幕免费在线不卡| 亚洲午夜视频在线观看| 亚洲国产精品va| 亚洲欧美日韩在线| 一区二区三区免费看| 久久―日本道色综合久久| 亚洲欧美日韩国产一区| 免费不卡欧美自拍视频| 久久久久久网站| 在线亚洲一区二区| 久久午夜激情| 久久精品国产亚洲精品| 欧美日韩一区二区在线观看| 美国十次了思思久久精品导航| 国产精品爽爽爽| 亚洲久久成人| 亚洲另类在线视频| 免费的成人av| 欧美成人精品激情在线观看| 国产精品一级久久久| 一区二区不卡在线视频 午夜欧美不卡在 | 久久不射中文字幕| 久久精品日韩欧美| 午夜精品久久久久久久99樱桃 | 亚洲网站啪啪| 欧美a级一区二区| 欧美aaaaaaaa牛牛影院| 久久午夜av| 国产日韩在线看| 在线亚洲一区观看| 中文国产一区| 欧美日韩国产精品专区| 亚洲国产精品悠悠久久琪琪 | 欧美午夜精品久久久久久超碰| 亚洲二区免费| 亚洲激情在线观看| 久久精品盗摄| 牛牛影视久久网| 国语精品中文字幕| 久久精品国产成人| 美国成人毛片| 亚洲高清色综合| 欧美fxxxxxx另类| 亚洲国产毛片完整版| 亚洲剧情一区二区| 欧美视频国产精品| 亚洲电影免费观看高清| 久久久久久综合| 免费欧美高清视频| 亚洲精品国精品久久99热一| 欧美成人性生活| 亚洲精品资源美女情侣酒店| 在线亚洲欧美| 国产日韩欧美精品一区| 久久久久久久久久久久久久一区 | 亚洲精品五月天| 亚洲无人区一区| 国产日产精品一区二区三区四区的观看方式 | 亚洲视频专区在线| 久久精品一区蜜桃臀影院| 激情视频一区二区三区| 牛夜精品久久久久久久99黑人 | 国内精品99| 久久在线免费观看视频| 亚洲国产精品尤物yw在线观看| 日韩亚洲视频在线| 国产日产欧美精品| 欧美xx视频| 亚洲一区中文字幕在线观看| 久久精品免费播放| 99国产一区二区三精品乱码| 国产一区二区在线观看免费| 欧美成人69av| 欧美亚洲视频一区二区| 亚洲区中文字幕| 久久精品亚洲一区二区三区浴池| 韩国一区二区在线观看| 欧美精品一区二区三区四区| 欧美一区二区在线| 在线午夜精品| 亚洲高清一区二区三区| 日韩亚洲欧美成人| 久久精品人人爽| 亚洲最新视频在线| 久久视频国产精品免费视频在线| 99国内精品| 亚洲国产精品成人一区二区| 国产精品久久久久免费a∨ | 欧美午夜在线视频| 免费亚洲电影在线观看|