public List<RouteVertex> FindShortestPath(RouteVertex start, RouteVertex end)
 {
     start.IsEdgeEndpoint = false;
     end.IsEdgeEndpoint = false;
     foreach (var vertex in this.graph.Vertices) {
         vertex.Reset();
     }
     start.Distance = 0;
     bool reached = false;
     while (!reached)
     {
         RouteVertex minVertex = null;
         foreach (var minCandidate in graph.Vertices.Where(v => !v.IsPermanent && v.IsAvailable)) {
             if (minVertex == null || minCandidate.Distance < minVertex.Distance) {
                 minVertex = minCandidate;
             }
         }
         minVertex.IsPermanent = true;
         if (minVertex == end) {
             reached = true;
         }
         foreach (var edge in minVertex.Neighbors) {
             if (minVertex.Distance + edge.Length < edge.EndVertex.Distance) {
                 edge.EndVertex.Distance = minVertex.Distance + edge.Length;
                 edge.EndVertex.Predecessor = minVertex;
             }
         }
     }
     List<RouteVertex> path = new List<RouteVertex>();
     RouteVertex pathVertex = end;
     while (pathVertex != start) {
         if (pathVertex == null)
             break;
         path.Add(pathVertex);
         //pathVertex.IsUsed = true;
         pathVertex = pathVertex.Predecessor;
     }
     path.Add(start);
     start.IsEdgeEndpoint = true;
     end.IsEdgeEndpoint = true;
     path.Reverse();
     return path;
 }
Exemple #2
0
 public RouteGraphEdge(RouteVertex startVertex, RouteVertex endVertex)
 {
     this.StartVertex = startVertex;
     this.EndVertex = endVertex;
     this.Length = GeomUtils.LineLenght(startVertex, endVertex);
 }
Exemple #3
0
 public void AddNeighbor(RouteVertex target)
 {
     this.Neighbors.Add(new RouteGraphEdge(this, target));
 }
Exemple #4
0
 void setStartVertex(IEdge edge, RouteVertex value)
 {
     edgeStarts[edge] = value;
 }
Exemple #5
0
 void setEndVertex(IEdge edge, RouteVertex value)
 {
     edgeEnds[edge] = value;
 }
Exemple #6
0
 void AddEdgeEndpointVertices(IEdge edge, Point2D? edgeStart, Point2D? edgeEnd)
 {
     if (edgeStart == null || edgeEnd == null) {
         // should not happen
         return;
     }
     var startPoint = new RouteVertex(edgeStart.Value.X, edgeStart.Value.Y);
     startPoint.IsEdgeEndpoint = true;
     var endPoint = new RouteVertex(edgeEnd.Value.X, edgeEnd.Value.Y);
     endPoint.IsEdgeEndpoint = true;
     this.vertices.Add(startPoint);
     this.vertices.Add(endPoint);
     // remember what RouteVertices we created for this user edge
     this.setStartVertex(edge, startPoint);
     this.setEndVertex(edge, endPoint);
 }