/// <summary> /// 处理urlId1(非vpx节点)和urlId2(vpx节点)间的连接 /// </summary> /// <param name="linkType"></param> /// <param name="urlId1"></param> /// <param name="urlId2"></param> /// <param name="visitedSl"></param> private void ProcessGraphLink(LinkType linkType, int urlId1, int urlId2, List <RawSubLink> visitedSl) { var rLink = GetLinkValue(linkType, urlId1, urlId2); //处理sublink的连接 if (rLink != null) { foreach (var sl in rLink.SubList) { if (!visitedSl.Contains(sl)) { int oppositeUrlId = -1; RawSubLink oppositeSl = null; //处理与vpx链接的子链接 ProcessSubLink(linkType, sl, urlId1, urlId2, ref oppositeUrlId, ref oppositeSl); if ((oppositeUrlId != -1) && (oppositeSl != null)) {//当找到对面有对应的非vpx端点和sublink的时候 RawSubLink newSl = new RawSubLink(sl.End1Pos, oppositeSl.End2Pos); AddSubLink(linkType, urlId1, oppositeUrlId, newSl); //把处理过的子链接加入visitedSl,避免2次访问 visitedSl.Add(sl); visitedSl.Add(oppositeSl); } } } } }
//添加一个RowSubLink到相关的两个RowLink上 public void AddSubLink(LinkType type, int urlId1, int urlId2, RawSubLink sLink) { //往链接为urlId1,urlId2的位置添加一条RowSubLink AddSubLinkInner(type, urlId1, urlId2, sLink); //往链接为urlId2,urlId1的位置添加一条RowSubLink RawSubLink oppositeSLink = sLink.GetOppositeSL(); AddSubLinkInner(type, urlId2, urlId1, oppositeSLink); }
//添加一个RowSubLink到相关的RowLink上 private void AddSubLinkInner(LinkType type, int urlId1, int urlId2, RawSubLink sLink) { //获取一条RowLink RawLink rowLink = GetLinkValue(type, urlId1, urlId2); if (rowLink == null) { rowLink = new RawLink(type, urlId1, urlId2); SetLinkValue(rowLink); } rowLink.AddSubLine(sLink); }
/// <summary> ///处理一个子链接,得到对面的非vpx端点的urlId和对应的sublink /// </summary> /// <param name="sl"></param> /// <param name="urlId1"></param> /// <param name="urlId2"></param> /// <param name="oppositeUrlId">一个输出的引用,用来记录对面的非vpx端点的urlId</param> /// <param name="oppositeSl">一个输出的引用,用来记录对面的非vpx端点对应的sublink</param> private void ProcessSubLink(LinkType linkType, RawSubLink sl, int urlId1, int urlId2, ref int oppositeUrlId, ref RawSubLink oppositeSl) { bool findFlag = false;//是否找到下一条子链接的标志,找到就可以结束循环 //返回条件 if (NodeArray[urlId2].Type != EndType.VPX) { oppositeUrlId = urlId2; oppositeSl = sl; return; } //访问urlId2端点与其他端点(除了urlId1)的连接 for (int i = 0; i < NodeArray.Length; i++) { if (i != urlId1) { //访问每个端点的子链接,按照深度来搜索 var rLink = GetLinkValue(linkType, urlId2, i); if (rLink != null) { foreach (var sLink in rLink.SubList) { //判断子链接sl与访问的子链接sLink是否是尾(sl)首(sLink)相连 if (sLink.End1Pos == sl.End2Pos) { //!!!注意递归调用 ProcessSubLink(linkType, sLink, urlId2, i, ref oppositeUrlId, ref oppositeSl); findFlag = true; } if (findFlag) { break; } } } } if (findFlag) { break; } } }
public void AddSubLine(RawSubLink subLink) { SubList.Add(subLink); }