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

李錦俊(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>
            欧美高潮视频| 久久激情视频久久| 欧美金8天国| 日韩一级精品视频在线观看| 欧美大成色www永久网站婷| 老司机免费视频久久| 亚洲黄色在线观看| 亚洲日本视频| 欧美人在线观看| 欧美在线日韩精品| 久久久久国产免费免费| 亚洲三级国产| 亚洲一级黄色| 亚洲第一在线综合在线| 日韩视频一区二区| 国内成人精品2018免费看| 欧美高清视频一区二区三区在线观看| 欧美精品三级日韩久久| 欧美亚洲一区三区| 欧美成人免费在线观看| 亚洲综合精品| 蜜桃久久精品乱码一区二区| 亚洲网站在线播放| 欧美中文在线字幕| 中国亚洲黄色| 久久亚洲国产精品一区二区| 亚洲视频在线视频| 久久综合婷婷| 欧美亚洲一区二区在线观看| 亚洲午夜影视影院在线观看| 欧美日韩国产一区二区三区地区 | 91久久中文| 亚洲一区中文| 国产日韩亚洲欧美| 久久综合电影一区| 久久精品一区二区三区不卡| 91久久精品日日躁夜夜躁国产| 日韩午夜在线观看视频| 韩国女主播一区| 一区二区三区欧美成人| 亚洲成人在线免费| 亚洲欧美日本精品| 亚洲一区二区三区四区五区午夜| 久久中文字幕一区二区三区| 性久久久久久久久| 欧美日韩另类丝袜其他| 欧美大片专区| 亚洲成人在线视频播放| 欧美在线观看天堂一区二区三区| 在线视频中文亚洲| 欧美国产日韩精品| 亚洲高清影视| 亚洲国产欧美久久| 欧美在线国产精品| 久久精品91| 国产精品一区亚洲| 亚洲欧美中文日韩在线| 亚洲欧美在线一区| 国产精品人成在线观看免费| 亚洲免费观看高清在线观看 | 亚洲欧美精品| 国产精品v欧美精品∨日韩| 亚洲美女中文字幕| 中文亚洲欧美| 国产精品视频免费一区| 亚洲网址在线| 久久精品国产第一区二区三区| 国产精品人人做人人爽人人添| 亚洲淫片在线视频| 久久精品30| 在线日韩中文字幕| 欧美精品观看| 一本大道久久a久久精品综合| 亚洲一区激情| 国产日韩欧美a| 久久免费少妇高潮久久精品99| 免费看成人av| 亚洲美女黄色| 国产精品久久久| 亚洲综合视频在线| 久久免费高清视频| 亚洲黄色高清| 欧美特黄一级大片| 久久不射中文字幕| 欧美激情精品久久久| 一本色道久久| 国产日韩欧美精品| 免费毛片一区二区三区久久久| 亚洲国产一成人久久精品| 中文亚洲字幕| 国产一区二区三区在线观看精品 | 日韩一级黄色av| 欧美一区二区高清| 亚洲高清不卡| 国产精品久久久久一区二区三区共| 亚洲午夜成aⅴ人片| 美女91精品| 一区二区三区免费在线观看| 国产亚洲二区| 欧美国产精品v| 亚洲男人第一av网站| 嫩草影视亚洲| 欧美主播一区二区三区美女 久久精品人 | 亚洲国产99| 欧美专区福利在线| 亚洲精品网址在线观看| 国产精品一区二区a| 欧美极品影院| 久久伊人免费视频| 亚洲一二三区在线| 亚洲国产综合91精品麻豆| 久久精品一区二区三区不卡牛牛 | 一区二区久久久久久| 国产在线欧美日韩| 欧美日韩在线另类| 毛片av中文字幕一区二区| 亚洲欧美影院| 亚洲视频一区二区| 亚洲国产精品热久久| 久久久国产亚洲精品| 亚洲欧美精品伊人久久| 日韩午夜免费| 亚洲欧洲一区二区在线观看| 国产欧美日韩视频| 国产精品高清在线观看| 欧美精品在线视频观看| 美女脱光内衣内裤视频久久影院 | 有码中文亚洲精品| 国产亚洲精品aa午夜观看| 国产精品扒开腿做爽爽爽视频| 欧美成年人网站| 久久日韩精品| 久久九九热免费视频| 欧美影院视频| 久久se精品一区二区| 亚洲欧美在线一区| 亚洲在线网站| 亚洲欧美视频在线观看| 亚洲一品av免费观看| 夜夜精品视频一区二区| 中日韩美女免费视频网址在线观看 | 国产亚洲午夜高清国产拍精品| 国产精品ⅴa在线观看h| 国产精品国产a| 国产精品久久久久久久久果冻传媒| 欧美激情精品久久久久| 欧美日韩精品一区二区天天拍小说| 欧美国产视频在线| 欧美韩日一区| 欧美视频免费在线| 国产毛片一区| 国产综合色在线视频区| 在线日本成人| 99视频一区二区| 亚洲一区二区伦理| 久久aⅴ国产紧身牛仔裤| 另类春色校园亚洲| 亚洲电影免费观看高清完整版在线观看| 免费观看成人网| 亚洲激情成人网| 亚洲一区日本| 久久久久久久久久久久久女国产乱| 毛片av中文字幕一区二区| 欧美精品成人| 国产精品一二一区| 国内成人精品一区| 91久久精品国产91性色| 午夜精品免费在线| 美女啪啪无遮挡免费久久网站| 亚洲精品久久嫩草网站秘色 | 亚洲日本中文字幕区| 亚洲一区二区视频| 玖玖玖国产精品| 欧美日韩国产丝袜另类| 国产一区美女| 一区二区欧美精品| 久久九九国产精品| 亚洲片国产一区一级在线观看| 亚洲性感美女99在线| 美女黄色成人网| 国产精品久久久久久久浪潮网站| 激情五月婷婷综合| 99精品免费网| 久久夜色精品国产欧美乱| 日韩一区二区精品| 久久久女女女女999久久| 欧美视频一区在线| 亚洲国产日韩在线| 久久精品视频免费| 亚洲剧情一区二区| 久久久夜色精品亚洲| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲片国产一区一级在线观看| 先锋影音网一区二区| 亚洲人成网站在线播| 男人的天堂成人在线| 国产亚洲欧洲997久久综合| 亚洲永久在线| 亚洲狼人综合| 欧美77777|