• <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>

            李錦俊(mybios)的blog

            游戲開發(fā) C++ Cocos2d-x OpenGL DirectX 數(shù)學(xué) 計(jì)算機(jī)圖形學(xué) SQL Server

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

            公告

            QQ:30743734
            EMain:mybios@qq.com

            常用鏈接

            留言簿(16)

            我參與的團(tuán)隊(duì)

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 370223
            • 排名 - 67

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            #ifndef?__ASTAR_SERACH_ALGO_H__
            #define ?__ASTAR_SERACH_ALGO_H__

            #include?
            < Algorithm >
            ????
            namespace ?fredazsq
            {????
            namespace ?linghuye
            {????
            ????
            /**/ /* ************************************************
            **?尋路節(jié)點(diǎn)
            ************************************************
            */

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

            template
            < class ?TField,? class ?TNodeLocation >
            struct ?CAStar2DAlgo
            {????
            public :
            ????typedef?std::vector
            < TNodeLocation > ????CResultPath;
            ????typedef?TAXNode
            < TNodeLocation > ????????CAXNode;
            ????typedef?std::
            set < CAXNode > ????????????CAXNodeSet;
            ????
            ????
            struct ?CAXNodePriorityQueue???????????? // ?優(yōu)先隊(duì)列?
            ???? {????
            ????????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);
            ????????????????????}

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

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

            ????????}

            ????}

            ????
            ????
            /**/ /* *****************************************************************
            ????**??取回最終結(jié)果
            ????*****************************************************************
            */

            ????
            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,節(jié)點(diǎn)位置
            **??1.支持<,==?操作符號(hào).
            *******************************************************************************
            */

            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 ;
            ????}

            ????
            /**/ /* ????平滑優(yōu)化
            ????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) 閱讀(1455) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)學(xué)、幾何和圖形學(xué)
            国产亚洲精品久久久久秋霞| 久久久久久A亚洲欧洲AV冫| 亚洲国产日韩欧美久久| 99久久精品国产一区二区| 99久久精品午夜一区二区| 亚洲精品乱码久久久久久 | 久久久99精品成人片中文字幕| 久久99国产精品一区二区| 久久亚洲春色中文字幕久久久| 国产aⅴ激情无码久久| 狠狠精品久久久无码中文字幕| 九九精品久久久久久噜噜| 亚洲国产综合久久天堂| 色综合久久久久综合99| 性做久久久久久久久| 要久久爱在线免费观看| 日产精品久久久久久久| 久久久久波多野结衣高潮| 一本色道久久88精品综合| 无码AV波多野结衣久久| 久久国产色AV免费看| 国产精品欧美久久久天天影视| 久久99国产精品久久99果冻传媒| 国内精品伊人久久久久| 91精品观看91久久久久久 | 久久AV高清无码| 久久被窝电影亚洲爽爽爽| 久久亚洲精品视频| 国产视频久久| 日本WV一本一道久久香蕉| 欧美午夜精品久久久久免费视 | 日本道色综合久久影院| 国产精品欧美久久久久天天影视 | 亚洲愉拍99热成人精品热久久 | 久久久久久国产精品无码下载| 国产69精品久久久久APP下载 | 久久精品国产清高在天天线| 青青国产成人久久91网| 欧美一级久久久久久久大| 一本久久知道综合久久| 精品精品国产自在久久高清|