static internal VisibilityEdge AddEdge(VisibilityVertex source, VisibilityVertex target) { VisibilityEdge visEdge; if (source.TryGetEdge(target, out visEdge)) { return(visEdge); } Debug.Assert(source != target, "Self-edges are not allowed"); var edge = new VisibilityEdge(source, target); source.OutEdges.Insert(edge); target.InEdges.Add(edge); return(edge); }
/// <summary> /// /// </summary> /// <param name="pathStart"></param> /// <param name="pathEnd"></param> /// <param name="obstacles"></param> /// <param name="sourceVertex">graph vertex corresponding to the source</param> /// <param name="targetVertex">graph vertex corresponding to the target</param> /// <returns></returns> internal static VisibilityGraph GetVisibilityGraphForShortestPath(Point pathStart, Point pathEnd, IEnumerable <Polyline> obstacles, out VisibilityVertex sourceVertex, out VisibilityVertex targetVertex) { var holes = new List <Polyline>(OrientHolesClockwise(obstacles)); var visibilityGraph = CalculateGraphOfBoundaries(holes); var polygons = holes.Select(hole => new Polygon(hole)).ToList(); TangentVisibilityGraphCalculator.AddTangentVisibilityEdgesToGraph(polygons, visibilityGraph); PointVisibilityCalculator.CalculatePointVisibilityGraph(holes, visibilityGraph, pathStart, VisibilityKind.Tangent, out sourceVertex); PointVisibilityCalculator.CalculatePointVisibilityGraph(holes, visibilityGraph, pathEnd, VisibilityKind.Tangent, out targetVertex); return(visibilityGraph); }
static internal VisibilityEdge AddEdge(VisibilityVertex source, VisibilityVertex target) { VisibilityEdge visEdge; if (source.TryGetEdge(target, out visEdge)) { return(visEdge); } if (source == target) { Debug.Assert(false, "Self-edges are not allowed"); throw new InvalidOperationException("Self-edges are not allowed"); } var edge = new VisibilityEdge(source, target); source.OutEdges.Insert(edge); target.InEdges.Add(edge); return(edge); }
internal bool TryGetEdge(VisibilityVertex target, out VisibilityEdge visEdge) { var node = FindFirst(OutEdges, target.Point);// OutEdges.FindFirst(e => e.TargetPoint >= target.Point); if (node != null) { if (node.Item.Target == target) { visEdge = node.Item; return(true); } } node = FindFirst(target.OutEdges, Point);// target.OutEdges.FindFirst(e => e.TargetPoint >= Point); if (node != null) { if (node.Item.Target == this) { visEdge = node.Item; return(true); } } visEdge = null; return(false); }
internal static void CalculatePointVisibilityGraph(IEnumerable <Polyline> listOfHoles, VisibilityGraph visibilityGraph, Point point, VisibilityKind visibilityKind, out VisibilityVertex qVertex) { //maybe there is nothing to do var qv = visibilityGraph.FindVertex(point); if (qv != null) { qVertex = qv; return; } var calculator = new PointVisibilityCalculator(listOfHoles, visibilityGraph, point, visibilityKind); calculator.FillGraph(); qVertex = calculator.QVertex; Debug.Assert(qVertex != null); }
internal void SetPreviousEdge(VisibilityVertex v, VisibilityEdge e) { Debug.Assert(v == e.Source || v == e.Target); _prevEdgesDictionary[v] = e; }
internal void ShrinkLengthOfPrevEdge(VisibilityVertex v, double lengthMultiplier) { _prevEdgesDictionary[v].LengthMultiplier = lengthMultiplier; }
internal void AddVertex(VisibilityVertex vertex) { Debug.Assert(!PointToVertexMap.ContainsKey(vertex.Point), "A vertex already exists at this location"); PointToVertexMap[vertex.Point] = vertex; }
internal VisibilityEdge(VisibilityVertex source, VisibilityVertex target) : this(source, target, 1.0) { }
internal void RemoveEdge(VisibilityVertex v1, VisibilityVertex v2) { RemoveEdge(v1.Point, v2.Point); }