private List <Predecessor <Tv> > GetPredecessors(Vertex <Tv> vSource, Vertex <Tv> vTarget, Graph <Tv> graph) { var predecessors = new List <Predecessor <Tv> >(); var vComparer = new VertexComparer <Tv>(); var isTargetReached = false; var vTreatables = graph.Vertices.Where(v => v.Id.Equals(vSource.Id)).ToList(); while (vTreatables.Any() && vTreatables.Any(v => v.Distance != double.PositiveInfinity) && !isTargetReached) { var vToTreat = vTreatables.OrderBy(v => v.Distance).ThenBy(v => v.Id).First(); // Find the new vertex to treat // Get its untreated vertices brothers var s1 = graph.Edges.Where(e => e.Vertex1.Id.Equals(vToTreat.Id)).Select(e => e.Vertex2); var s2 = graph.Edges.Where(e => e.Vertex2.Id.Equals(vToTreat.Id)).Select(v => v.Vertex1); var vSiblings = s1.Union(s2, vComparer).Where(v => !v.IsTreated).OrderByDescending(s => s.Distance).ToList(); if (vSiblings.Any()) { foreach (var sibling in vSiblings) { var dis = vToTreat.Distance + 1; if (dis < sibling.Distance) // distance from source vertex is shorter { sibling.Distance = dis; // Set the new distance on the current vertex predecessors.Add(new Predecessor <Tv>(sibling, vToTreat)); } } } vToTreat.IsTreated = true; isTargetReached = predecessors.Exists(p => p.Vertex1.Equals(vTarget)); vTreatables = graph.Vertices.Where(v => !v.IsTreated).ToList(); } return(predecessors); }
public int Compare(Triangle3D x, Triangle3D y) { var result = VertexComparer.Compare(x.Point0, y.Point0); if (result == 0) { result = VertexComparer.Compare(x.Point1, y.Point1); if (result == 0) { result = VertexComparer.Compare(x.Point2, y.Point2); } } return(result); }
static NewParticleRenderer() { vertexComparer = new VertexComparer(); }