/// <summary> /// Определение 3. Две простые цепи, соединяющие х1 и х2, называются непересекающимися (или /// вершинно-непересекающимися), если у них нет общих вершин, отличных от х1 и х2 (и, следовательно, нет общих ребер). /// </summary> /// <param name="path1"></param> /// <param name="path2"></param> /// <returns></returns> public static bool IsNonIntersected(Path path1, Path path2) { Debug.Assert(new StackListQueue <Vertex> { path1.First(), path1.Last(), path2.First(), path2.Last(), }.Distinct().Count() == 2); IEnumerable <Vertex> intersect = path1.GetRange(1, path1.Count - 2) .Intersect(path2.GetRange(1, path2.Count - 2)); return(!intersect.Any()); }
/// <summary> /// Разбиение грани путём, контакные вершины которого принадлежат данной грани /// </summary> /// <returns></returns> public IEnumerable <Edge> Split(Path path) { Debug.Assert(path.FromTo(this)); var list = new StackListQueue <Edge>(); if (path.Count() < 2) { return(list); } int index1 = IndexOf(path.First()); int index2 = IndexOf(path.Last()); List <Vertex> vertexs = path.ToList(); if (index1 == index2) { // Вырожденый случай когда путь представляет собой цикл // и пересечение с грань происходит только в одной точке if (path.Count > 3) { list.Add(new Edge(path.GetRange(0, path.Count - 1))); } list.Add(this); } else { if (index1 > index2) { int t = index1; index1 = index2; index2 = t; vertexs.Reverse(); } List <Vertex> list1 = GetRange(0, index1); list1.AddRange(vertexs.GetRange(0, vertexs.Count - 1)); list1.AddRange(GetRange(index2, this.Count() - index2)); list.Add(new Edge(list1)); vertexs.Reverse(); List <Vertex> list2 = GetRange(index1, index2 - index1); list2.AddRange(vertexs.GetRange(0, path.Count() - 1)); list.Add(new Edge(list2)); } Debug.WriteLineIf(list.Any(), this + " split by " + path + " is " + string.Join(",", list.Select(item => item.ToString()))); return(list); }
public static bool IsNoCircle(Path path) { return(!path.First().Equals(path.Last())); }