public static Graph ShortestPath(VisibilityGraph visibilityGraph, Vertex origin, Vertex destination) { Graph shortest; bool containsOrigin = visibilityGraph.Contains(origin); bool containsDestination = visibilityGraph.Contains(destination); if (containsOrigin && containsDestination) { shortest = Algorithms.Dijkstra(visibilityGraph, origin, destination); } else { Vertex gO = (!containsOrigin) ? origin : null; Vertex gD = (!containsDestination) ? destination : null; Graph tempGraph = new Graph(); if (!containsOrigin) { foreach (Vertex v in VisibleVertices(origin, visibilityGraph.baseGraph, null, gD, null, false, true)) { tempGraph.AddEdge(Edge.ByStartVertexEndVertex(origin, v)); } } if (!containsDestination) { foreach (Vertex v in VisibleVertices(destination, visibilityGraph.baseGraph, gO, null, null, false, true)) { tempGraph.AddEdge(Edge.ByStartVertexEndVertex(destination, v)); } } shortest = Algorithms.Dijkstra(visibilityGraph, origin, destination, tempGraph); } return(shortest); }
/// <summary> /// Adds specific points as gVertices to the VisibilityGraph Graph /// </summary> /// <param name="visibilityGraph">VisibilityGraph Graph</param> /// <param name="vertices">Points to add as gVertices</param> /// <returns></returns> public static VisibilityGraph AddVertices(VisibilityGraph visibilityGraph, List <gVertex> vertices, bool reducedGraph = true) { //TODO: Seems that original graph gets updated as well if (vertices == null) { throw new NullReferenceException("vertices"); } VisibilityGraph newVisGraph = (VisibilityGraph)visibilityGraph.Clone(); List <gVertex> singleVertices = new List <gVertex>(); foreach (gVertex v in vertices) { if (newVisGraph.Contains(v)) { continue; } gEdge closestEdge = newVisGraph.baseGraph.edges.OrderBy(e => e.DistanceTo(v)).First(); if (!gBase.Threshold(closestEdge.DistanceTo(v), 0)) { singleVertices.Add(v); } else if (v.OnEdge(closestEdge.StartVertex, closestEdge.EndVertex)) { v.polygonId = closestEdge.StartVertex.polygonId; newVisGraph.baseGraph.polygons[v.polygonId] = newVisGraph.baseGraph.polygons[v.polygonId].AddVertex(v, closestEdge); singleVertices.Add(v); } } newVisGraph.baseGraph.ResetEdgesFromPolygons(); foreach (gVertex centre in singleVertices) { foreach (gVertex v in VisibleVertices(centre, newVisGraph.baseGraph, null, null, singleVertices, false, reducedGraph)) { newVisGraph.AddEdge(new gEdge(centre, v)); } } return(newVisGraph); }
/// <summary> /// Adds specific points as Vertices to the VisibilityGraph Graph /// </summary> /// <param name="visibilityGraph">VisibilityGraph Graph</param> /// <param name="vertices">Points to add as gVertices</param> /// <returns></returns> public static VisibilityGraph AddVertices(VisibilityGraph visibilityGraph, List <Vertex> vertices, bool reducedGraph = true) { if (vertices == null) { throw new NullReferenceException("Vertices"); } VisibilityGraph newVisGraph = (VisibilityGraph)visibilityGraph.Clone(); List <Vertex> singleVertices = new List <Vertex>(); foreach (Vertex vertex in vertices) { if (newVisGraph.Contains(vertex)) { continue; } Edge closestEdge = newVisGraph.baseGraph.Edges.OrderBy(e => e.DistanceTo(vertex)).First(); if (!closestEdge.DistanceTo(vertex).AlmostEqualTo(0)) { singleVertices.Add(vertex); } else if (vertex.OnEdge(closestEdge.StartVertex, closestEdge.EndVertex)) { int polygonId = closestEdge.StartVertex.Parent.Id; newVisGraph.baseGraph._polygonsDict[polygonId] = newVisGraph.baseGraph._polygonsDict[polygonId].AddVertex(vertex, closestEdge); singleVertices.Add(vertex); } } newVisGraph.baseGraph.ResetEdgesFromPolygons(); foreach (Vertex centre in singleVertices) { foreach (Vertex v in VisibleVertices(centre, newVisGraph.baseGraph, null, null, singleVertices, false, reducedGraph)) { newVisGraph.AddEdge(Edge.ByStartVertexEndVertex(centre, v)); } } return(newVisGraph); }