Ejemplo n.º 1
0
    void AddSearchNode(int weight, int pos)
    {
        SearchNodeData node = new SearchNodeData();

        node.Weight = weight;
        node.Pos    = pos;
        m_aSearchPathD.Add(node);
    }
Ejemplo n.º 2
0
    SearchNodeData GetSWeightNode()
    {
        SearchNodeData node = new SearchNodeData();

        if (m_aSearchPathD.Count == 0)
        {
            return(node);
        }
        else
        {
            node = m_aSearchPathD[0];
        }
        for (int i = 1; i < m_aSearchPathD.Count; i++)
        {
            if (m_aSearchPathD[i].Weight < node.Weight)
            {
                node = m_aSearchPathD[i];
            }
        }
        return(node);
    }
Ejemplo n.º 3
0
    public bool     FindPath(int nDestScene, int nSrcScene, out List <SceneTransferData> rOutPath)
    {
        rOutPath = new List <SceneTransferData>();
        //不是有效的场景,那么返回失败
        if (!IsValidSceneID(nDestScene) || !IsValidSceneID(nSrcScene))
        {
            return(false);
        }

        //  [8/3/2011 ivan edit]
        ClearPathData();

        //添加原场景到OpenList里
        AddToOpenList(nSrcScene);
        //添加
        AddFirstSearchPathNode(nSrcScene);

        //循环查找,直到找到或遍历完了为止
        bool bFind      = false;
        int  nShortesID = -1;

        while (!IsOpenListEmpty() && !bFind && m_aSearchPathD.Count > 0)
        {
            //找到代价最小的
            SearchNodeData node = GetSWeightNode();
            nShortesID = node.Pos;
            //然后删除之
            m_aSearchPathD.Remove(node);

            //检查是否是终点
            if (IsEnd(nShortesID, nDestScene))
            {
                bFind = true;
                break;
            }

            //添加最佳路线进入
            int nID = GetSceneWayInfoIDFromSearchPathNodeID(nShortesID);
            if (nID < 0)
            {
                break;
            }
            AddSearchPathNode(nShortesID, nID);
        }
        if (bFind)
        {
            if (nShortesID >= 0 && nShortesID < m_nCurrentSearchPos)
            {
                rOutPath.Clear();
                for (int i = 0; i < SearchPathNode.MAX_PATH_ID_ARRAY; i++)
                {
                    int nID = m_aSearchPathNode[nShortesID].nPathIDArray[i];
                    if (nID < 0)
                    {
                        break;
                    }
                    //添加路径
                    rOutPath.Add(m_pTransferData[nID]);
                }
            }
        }
        return(bFind);
    }