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

李錦俊(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>
            欧美成人免费在线观看| 在线日韩欧美| 久久精品视频在线看| 欧美一区网站| 久久亚洲精品欧美| 欧美国产日韩视频| 欧美精品免费播放| 国产精品国产三级国产aⅴ入口| 亚洲精品乱码| 亚洲精品色图| 翔田千里一区二区| 另类图片国产| 欧美天堂亚洲电影院在线播放| 欧美日韩国内| 黑丝一区二区三区| 日韩一级黄色av| 亚洲欧美日韩在线观看a三区| 久久不见久久见免费视频1| 久久综合给合| 一区二区高清视频| 久久麻豆一区二区| 欧美亚洲不卡| 亚洲黄色一区二区三区| 亚洲欧美国产日韩天堂区| 美国成人直播| 亚洲图片欧美一区| 欧美激情无毛| 国产一区在线播放| 亚洲性视频网址| 欧美国产高清| 欧美一区亚洲一区| 欧美日韩一卡二卡| 亚洲人成人77777线观看| 久久国产天堂福利天堂| 日韩香蕉视频| 欧美激情第五页| 伊人久久大香线蕉综合热线| 亚洲一区三区视频在线观看| 免费成人av在线| 午夜精品视频在线观看| 国产精品久久久久久久第一福利| 亚洲欧洲另类| 欧美激情视频一区二区三区免费| 日韩视频精品在线| 久久一区精品| 香蕉久久夜色精品国产使用方法| 欧美日韩国产色视频| 亚洲国产一区二区三区a毛片| 久久精品国产久精国产思思| 中日韩高清电影网| 欧美日本免费| 99在线热播精品免费99热| 欧美成人综合| 男人的天堂亚洲在线| 依依成人综合视频| 久久夜色精品一区| 久久久精品免费视频| 激情综合色丁香一区二区| 久久露脸国产精品| 欧美在线一二三区| 黑人一区二区| 亚洲东热激情| 欧美国产精品日韩| 9久re热视频在线精品| 亚洲精品久久久蜜桃| 欧美久久成人| 亚洲一区自拍| 香蕉av777xxx色综合一区| 国产曰批免费观看久久久| 久久―日本道色综合久久| 欧美在线一二三| 亚洲国产美女久久久久| 亚洲国产高清在线观看视频| 欧美国产综合一区二区| 亚洲视频一区在线| 午夜精彩视频在线观看不卡| 国产日韩欧美中文| 欧美freesex交免费视频| 开心色5月久久精品| 一本到12不卡视频在线dvd| 中日韩男男gay无套| 国产婷婷色一区二区三区在线| 久久激情综合| 欧美成人免费在线观看| 亚洲在线第一页| 久久黄色级2电影| 亚洲九九爱视频| 亚洲欧美日韩在线不卡| 亚洲成色www8888| 99在线精品观看| 精品成人免费| 亚洲素人在线| 亚洲人成亚洲人成在线观看| 一区二区三区精品视频在线观看 | 免费国产自线拍一欧美视频| 99精品视频免费观看视频| 亚洲尤物影院| 亚洲国产色一区| 亚洲欧美999| 亚洲精品欧美日韩| 欧美一级视频免费在线观看| 亚洲激情精品| 久久国产精品99精品国产| 亚洲精品美女免费| 欧美在线观看www| 免费欧美在线| 久久久精品一品道一区| 欧美日本一道本| 免费日韩成人| 国产三级欧美三级| 一本久久a久久免费精品不卡| 影院欧美亚洲| 午夜精品一区二区三区在线视 | 欧美国产日韩在线观看| 欧美一区二区三区在| 欧美日本二区| 亚洲国产综合视频在线观看| 国产欧美日韩综合| 一区二区三区成人| 一本大道久久精品懂色aⅴ| 麻豆成人91精品二区三区| 久久免费精品视频| 国产在线精品自拍| 亚洲欧美视频在线观看视频| 亚洲无线一线二线三线区别av| 欧美sm重口味系列视频在线观看| 老司机免费视频一区二区三区| 国产精品亚洲综合天堂夜夜| 日韩香蕉视频| 亚洲欧美第一页| 国产精品女人久久久久久| 中日韩美女免费视频网址在线观看 | 久久精品国产清自在天天线 | 久久综合99re88久久爱| 国产在线播放一区二区三区| 亚洲欧美另类国产| 欧美一区二区三区在线观看视频 | 欧美大片在线观看一区| 激情综合自拍| 久久这里有精品15一区二区三区| 看片网站欧美日韩| 亚洲国产经典视频| 欧美大片va欧美在线播放| 亚洲电影视频在线| 在线视频欧美精品| 国产精品久久久久久久午夜| 亚洲在线一区二区| 久久九九精品| 在线免费日韩片| 欧美黄色免费网站| 一区二区三区视频免费在线观看| 中文网丁香综合网| 国产日韩欧美黄色| 久久综合狠狠| 亚洲伦理在线| 欧美一区二区三区的| 黑人一区二区| 欧美日韩亚洲一区二区三区在线观看 | 国产美女精品视频免费观看| 亚洲小说春色综合另类电影| 亚洲欧美视频在线观看| 国产欧美一区二区精品秋霞影院| 欧美伊人久久久久久久久影院 | 久久免费视频这里只有精品| 亚洲国产精品999| 午夜精品在线视频| 1024欧美极品| 欧美性猛交99久久久久99按摩| 小处雏高清一区二区三区| 亚洲国产精品一区二区第四页av | 午夜精品久久久99热福利| 狠狠做深爱婷婷久久综合一区| 欧美成人精品影院| 亚洲亚洲精品在线观看| 欧美大片在线观看一区二区| 亚洲男女自偷自拍| 亚洲狠狠丁香婷婷综合久久久| 国产精品99一区| 欧美99在线视频观看| 欧美一区二区三区精品| 亚洲欧洲久久| 美女脱光内衣内裤视频久久影院| 亚洲午夜在线观看视频在线| 尤妮丝一区二区裸体视频| 国产精品第13页| 欧美成人乱码一区二区三区| 欧美在线免费看| 亚洲小少妇裸体bbw| 亚洲激情在线观看| 嫩草成人www欧美| 久久裸体艺术| 久久久久久久一区| 欧美一级视频| 亚洲视频国产视频| 亚洲精品欧洲精品| 亚洲第一区在线| 国产揄拍国内精品对白| 国产麻豆日韩欧美久久| 欧美视频免费在线| 欧美国产一区视频在线观看|