public override void BuildWayFork(ref Point a, ref Point b) { for (int i = 0; (a.coef_comm.Intersect(b.coef_comm).Count() != 1) //пока точки не связаны напрямую & (a.Name != b.Name); i++) { if (!fork.Contains(b)) { fork.Add(b); //добавляем В "вилку" } b = PointCommunications.NextPointByFork(b, fork); //и берем следующую точку по нелинейному участку, не важно по какому направлению if (fork.Count == 1) //если в "вилке" 1 элемент { PointCommunications.bufferPoints.Push(b); //то запоминаем этот путь, добавляя В в buferpoints } if (b == null) //если алгоритм зашел в тупик и не дошел до точки А { int count = fork.Count; for (int j = 0; j < count - 1; j++) //возвращаемся обратно по пройденному неправильному пути к точке-развилке { fork.Remove(fork.Last()); //удаляя неправильный путь из "вилки" (удаляя точки) } b = fork.Last(); } } fork.Add(b); //добавляем последнюю найденную точку В в "вилку" fork.Add(a); //и туда же добавляем А как нелинейный участок пути }
public override void BuildWayB(ref Point b) { if (b.coef_comm.Count() <= 2) //если В - линейный участок { if (!wayB.Contains(b)) //и если нет В в списке нелинейного пути вблизи В { wayB.Add(b); //то добавляем в этот список } b = PointCommunications.NextPointByWay(b, wayB); //и идем к следующей точке от В и переопределяем ее } }
public override void BuildWayB(ref Point b) { if (b.coef_comm.Count() <= 2) //если В - линейный участок { //wayB.Add(b); if (!wayB.Contains(b)) //и если нет В в списке нелинейного пути вблизи В { if (wayA.Count == 0 || wayB.Count == 0) { wayB.Add(b); //то добавляем в этот список b = PointCommunications.NextPointByWay(b, wayB); } else if (wayB.First() != wayA.Last()) { wayB.Add(b); List <Point> buff = new List <Point>(); foreach (Point o in wayB) { buff.Add(o); } b = wayB.First(); buff.Remove(wayB.First()); wayB.Clear(); wayB.Add(b); } else { wayB.Add(b); //то добавляем в этот список b = PointCommunications.NextPointByWay(b, wayB); } } else if (wayB.Count != 0 && b.coef_comm.Count() == 1) { wayB.Add(b); List <Point> buff = new List <Point>(); foreach (Point o in wayB) { buff.Add(o); } b = wayB.First(); buff.Remove(wayB.First()); wayB.Clear(); wayB.Add(b); b = PointCommunications.NextPointByWay(b, buff); //берем другую точку, которая в другой стороне и не содержится в wayB } //и идем к следующей точке от В и переопределяем ее } }
PointCommunications PC = new PointCommunications(); //после редактирования удалить и сделать этот класс статическим public override bool BuildWayA(ref Point a) { if (!wayA.Contains(a) && (a.coef_comm.Count() <= 2)) { wayA.Add(a); //то уже идем от точки А, добавляя ее в коллекцию вблизи А a = PointCommunications.NextPointByWay(a, wayA); //и берем следующую точку по пути от А и переопределяем ее return(true); } else { return(false); } }
public override void BuildWayFork(ref Point a, ref Point b) { List <Point> buff = new List <Point>(); PointCommunications.bufferPoints.Push(b); for (int i = 0; (a.coef_comm.Intersect(b.coef_comm).Count() != 1) //пока точки не связаны напрямую & (a.Name != b.Name); i++) { if (!fork.Contains(b)) { fork.Add(b); //добавляем В "вилку" } b = PointCommunications.NextPointByFork(b, fork.Union(buff).ToList()); //и берем следующую точку по нелинейному участку, не важно по какому направлению if (b == null) { } else if (b.coef_comm.Count > 2) { PointCommunications.bufferPoints.Push(b); } if (b == null) //если алгоритм зашел в тупик и не дошел до точки А { b = PointCommunications.bufferPoints.Peek(); while (b != fork.Last()) { buff.Add(fork.Last()); fork.Remove(fork.Last()); } b = (PointCommunications.NextPointByFork(b, fork.Union(buff).ToList()) == null)? PointCommunications.NextPointByFork(b, buff): PointCommunications.NextPointByFork(b, fork.Union(buff).ToList()); if (b.coef_comm.Count > 2 && !PointCommunications.bufferPoints.Contains(b)) { PointCommunications.bufferPoints.Push(b); } if (fork.Contains(b)) { PointCommunications.bufferPoints.Pop(); while (b != fork.Last()) { buff.Add(fork.Last()); fork.Remove(fork.Last()); } } } } fork.Add(b); //добавляем последнюю найденную точку В в "вилку" fork.Add(a); //и туда же добавляем А как нелинейный участок пути }
PointCommunications PC = new PointCommunications(); //после редактирования удалить и сделать этот класс статическим public override bool BuildWayA(ref Point a) { if (!wayA.Contains(a) && (a.coef_comm.Count() <= 2)) { if (wayA.Count == 0 || wayB.Count == 0) { wayA.Add(a); //то уже идем от точки А, добавляя ее в коллекцию вблизи А a = PointCommunications.NextPointByWay(a, wayA); //и берем следующую точку по пути от А и переопределяем ее return(true); } else if (wayA.First() != wayB.Last()) { wayA.Add(a); List <Point> buff = new List <Point>(); foreach (Point o in wayA) { buff.Add(o); } a = wayA.First(); buff.Remove(wayA.First()); wayA.Clear(); wayA.Add(a); } else { wayA.Add(a); //то добавляем в этот список a = PointCommunications.NextPointByWay(a, wayA); return(true); } return(true); } else { return(false); } }