示例#1
0
        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();
                }
            }
        }
示例#2
0
        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);
        }