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);
        }
Пример #2
0
            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);
            }
Пример #3
0
 static NewParticleRenderer()
 {
     vertexComparer = new VertexComparer();
 }