internal bool HasAngle(BasicGraphPath p2) { Vec2 t1 = new Vec2((float)this.list[this.list.Count - 2].position.X, (float)this.list[this.list.Count - 2].position.Z); Vec2 t2 = new Vec2((float)this.list[this.list.Count - 1].position.X, (float)this.list[this.list.Count - 1].position.Z); Vec2 v1 = t2 - t1; v1 = v1.normalize(); t1 = new Vec2((float)p2.list[0].position.X, (float)p2.list[0].position.Z); t2 = new Vec2((float)p2.list[1].position.X, (float)p2.list[1].position.Z); Vec2 v2 = t2 - t1; v2 = v2.normalize(); return(Math.Abs(Vec2.AngleBetweenVectors(v1, v2)) > 0.25f); }
internal BasicGraphPath(BasicGraphPath p1, BasicGraphPath p2) { if (p1.End != p2.Start) { throw new Exception("This cannot be done!"); } this.list = new List <BasicGraphNode>(p1.list.Count + p2.list.Count - 1); foreach (BasicGraphNode bn in p1.list) { this.list.Add(bn); } this.list.RemoveAt(this.list.Count - 1); foreach (BasicGraphNode bn in p2.list) { this.list.Add(bn); } foreach (BasicGraphNode bn in this.list) { bn.partOfPath.Add(this); } this.reversed = p1.reversed; }
public void CombinePathsWithoutIntersectionOfSameType() { List <BasicGraphPath> newPaths = new List <BasicGraphPath>(); while (paths.Count > 0) { if (paths.Count == 1) { newPaths.Add(paths[0]); paths.Clear(); } else { BasicGraphPath path = paths[0]; bool unchanged = true; if (path.Start.partOfPath.Count == 2) { for (int i = 1; i < paths.Count - 1; ++i) { BasicGraphPath p2 = paths[i]; if ((path.Start == p2.Start || path.Start == p2.End) && path.type == p2.type) { if (path.Start == p2.End) { p2.Reverse(); } path.Reverse(); if (!path.HasAngle(p2)) { paths.Remove(path); path.Delete(); paths.Remove(p2); p2.Delete(); paths.Insert(0, new BasicGraphPath(path, p2)); unchanged = false; break; } } } } if (unchanged && path.End.partOfPath.Count == 2) { for (int i = 1; i < paths.Count - 1; ++i) { BasicGraphPath p2 = paths[i]; if ((path.End == p2.Start || path.End == p2.End) && path.type == p2.type) { if (path.End == p2.End) { p2.Reverse(); } if (!path.HasAngle(p2)) { paths.Remove(path); path.Delete(); paths.Remove(p2); p2.Delete(); paths.Insert(0, new BasicGraphPath(path, p2)); unchanged = false; break; } } } } if (unchanged) { paths.Remove(path); newPaths.Add(path); } } } paths = newPaths; }