void AddSearchNode(int weight, int pos) { SearchNodeData node = new SearchNodeData(); node.Weight = weight; node.Pos = pos; m_aSearchPathD.Add(node); }
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); }
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); }