protected override void InternalCompute() { var visibilityGraph = new VisibilityGraph(); foreach (TVertex vertex in VisitedGraph.Vertices) { Point pos = _vertexPositions[vertex]; Size sz = _vertexSizes[vertex]; var rect = new Rect(new Point(pos.X - (sz.Width / 2), pos.Y - (sz.Height / 2)), sz); rect.Inflate(_parameters.VertexMargin, _parameters.VertexMargin); visibilityGraph.Obstacles.Add(new Obstacle(rect.TopLeft, rect.TopRight, rect.BottomRight, rect.BottomLeft)); } foreach (TEdge edge in VisitedGraph.Edges) { visibilityGraph.SinglePoints.Add(_vertexPositions[edge.Source]); visibilityGraph.SinglePoints.Add(_vertexPositions[edge.Target]); } var vertexPoints = new HashSet <PointVertex>(_vertexPositions.Select(kvp => new PointVertex(kvp.Value))); visibilityGraph.Compute(); IUndirectedGraph <PointVertex, Edge <PointVertex> > graph = visibilityGraph.Graph; var usedEdges = new HashSet <Edge <PointVertex> >(); foreach (TEdge edge in VisitedGraph.Edges) { var pos1 = new PointVertex(_vertexPositions[edge.Source]); var pos2 = new PointVertex(_vertexPositions[edge.Target]); TryFunc <PointVertex, IEnumerable <Edge <PointVertex> > > paths = graph.ShortestPathsDijkstra(e => GetWeight(vertexPoints, usedEdges, pos1, pos2, e), pos1); IEnumerable <Edge <PointVertex> > path; if (paths(pos2, out path)) { var edgeRoute = new List <Point>(); bool first = true; PointVertex point = pos1; foreach (Edge <PointVertex> e in path) { if (!first) { edgeRoute.Add(point.Point); } usedEdges.Add(e); point = e.GetOtherVertex(point); first = false; } _edgeRoutes[edge] = edgeRoute.ToArray(); } } }
public static IEnumerable <TEdge> FindShortestPath <TVertex, TEdge>( IUndirectedGraph <TVertex, TEdge> graph, TVertex startVertex, TVertex endVertex) where TEdge : class, IEdge <TVertex> { Func <TEdge, double> edgeCost = e => 1; // constant cost var tryGetPaths = graph.ShortestPathsDijkstra(edgeWeights: edgeCost, source: startVertex); IEnumerable <TEdge> edgePath; if (!tryGetPaths(endVertex, out edgePath)) { return(Enumerable.Empty <TEdge>()); } return(edgePath); }