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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #6
0
 internal void SetPreviousEdge(VisibilityVertex v, VisibilityEdge e)
 {
     Debug.Assert(v == e.Source || v == e.Target);
     _prevEdgesDictionary[v] = e;
 }
예제 #7
0
 internal void ShrinkLengthOfPrevEdge(VisibilityVertex v, double lengthMultiplier)
 {
     _prevEdgesDictionary[v].LengthMultiplier = lengthMultiplier;
 }
예제 #8
0
 internal void AddVertex(VisibilityVertex vertex)
 {
     Debug.Assert(!PointToVertexMap.ContainsKey(vertex.Point), "A vertex already exists at this location");
     PointToVertexMap[vertex.Point] = vertex;
 }
예제 #9
0
 internal VisibilityEdge(VisibilityVertex source, VisibilityVertex target) : this(source, target, 1.0)
 {
 }
 internal void RemoveEdge(VisibilityVertex v1, VisibilityVertex v2)
 {
     RemoveEdge(v1.Point, v2.Point);
 }