void ExtendVisibilityGraphToLocation(Point location) {
     if (VisibilityGraph == null)
         VisibilityGraph = new VisibilityGraph();
     List<Polygon> addedPolygons = null;
     if (!activeRectangle.Contains(location)) {
         if (activeRectangle.IsEmpty)
             activeRectangle = new Rectangle(SourcePort.Location, location);
         else
             activeRectangle.Add(location);
         addedPolygons = GetAddedPolygonesAndMaybeExtendActiveRectangle();
         foreach (Polygon polygon in addedPolygons)
             VisibilityGraph.AddHole(polygon.Polyline);
     }
     if (addedPolygons == null || addedPolygons.Count == 0) {
         if (targetVisibilityVertex != null)
             VisibilityGraph.RemoveVertex(targetVisibilityVertex);
         CalculateEdgeTargetVisibilityGraph(location);
     }
     else {
         RemovePointVisibilityGraphs();
         var visibilityGraphGenerator = new InteractiveTangentVisibilityGraphCalculator(addedPolygons,
                                                                                        activePolygons,
                                                                                        VisibilityGraph);
         visibilityGraphGenerator.Run();
         activePolygons.AddRange(addedPolygons);
         CalculateEdgeTargetVisibilityGraph(location);
         CalculateSourcePortVisibilityGraph();
     }
 }
        void ExtendVisibilityGraphToTargetBoundaryPort(Point takenOutTargetPortLocation) {
            List<Polygon> addedPolygons = null;
            if (VisibilityGraph == null)
                VisibilityGraph = new VisibilityGraph();

            if (!activeRectangle.Contains(takenOutTargetPortLocation) ||
                !activeRectangle.Contains(TargetLoosePolyline.BoundingBox)) {
                if (activeRectangle.IsEmpty) {
                    activeRectangle = TargetLoosePolyline.BoundingBox;
                    activeRectangle.Add(SourcePort.Location);
                    activeRectangle.Add(StartPointOfEdgeRouting);
                    activeRectangle.Add(takenOutTargetPortLocation);
                } else {
                    activeRectangle.Add(takenOutTargetPortLocation);
                    activeRectangle.Add(TargetLoosePolyline.BoundingBox);
                }
                addedPolygons = GetAddedPolygonesAndMaybeExtendActiveRectangle();
                foreach (Polygon polygon in addedPolygons)
                    VisibilityGraph.AddHole(polygon.Polyline);
            }

            if (addedPolygons == null) {
                if (targetVisibilityVertex != null)
                    VisibilityGraph.RemoveVertex(targetVisibilityVertex);
                CalculateEdgeTargetVisibilityGraph(takenOutTargetPortLocation);
            } else {
                RemovePointVisibilityGraphs();
                var visibilityGraphGenerator = new InteractiveTangentVisibilityGraphCalculator(addedPolygons,
                                                                                               activePolygons,
                                                                                               VisibilityGraph);
                visibilityGraphGenerator.Run();
                activePolygons.AddRange(addedPolygons);
                CalculateEdgeTargetVisibilityGraph(takenOutTargetPortLocation);
                CalculateSourcePortVisibilityGraph();
            }
        }
        internal void CalculateWholeVisibilityGraphOnExistingGraph() {
            activePolygons = new List<Polygon>(AllPolygons());
            foreach (Polyline polylineLocal in ObstacleCalculator.LooseObstacles)
                VisibilityGraph.AddHole(polylineLocal);

            AlgorithmBase visibilityGraphGenerator;
            if (UseSpanner) {
                visibilityGraphGenerator = new ConeSpanner(ObstacleCalculator.LooseObstacles, VisibilityGraph)
                {ConeAngle = ConeSpannerAngle};
            }
            else {
                visibilityGraphGenerator = new InteractiveTangentVisibilityGraphCalculator(new List<Polygon>(),
                                                                                           activePolygons,
                                                                                           visibilityGraph);
            }
            visibilityGraphGenerator.Run();
        }
        /*
                void ShowPolylineAndObstaclesWithLineSeg(LineSegment lineSegment)
                {
                    var ls = GetDebugCurves();
                    ls.Add(new DebugCurve(2,"pink", lineSegment));
                    LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(ls);
                }
        */

        void ExtendVisibilityGraphToLocationOfTargetFloatingPort(Polyline portLoosePolyline) {
            if (VisibilityGraph == null)
                VisibilityGraph = new VisibilityGraph();

            List<Polygon> addedPolygons = null;
            Point targetLocation = targetPort.Location;
            if (!activeRectangle.Contains(targetLocation)) {
                if (activeRectangle.IsEmpty)
                    activeRectangle = new Rectangle(SourcePort.Location, targetLocation);
                else
                    activeRectangle.Add(targetLocation);
                addedPolygons = GetAddedPolygonesAndMaybeExtendActiveRectangle();
                foreach (Polygon polygon in addedPolygons)
                    VisibilityGraph.AddHole(polygon.Polyline);
            }

            if (addedPolygons == null) {
                if (targetVisibilityVertex != null)
                    VisibilityGraph.RemoveVertex(targetVisibilityVertex);
                CalculateEdgeTargetVisibilityGraphForFloatingPort(targetLocation, portLoosePolyline);
                if (SourceVisibilityVertex == null)
                    CalculateSourcePortVisibilityGraph();
            }
            else {
                RemovePointVisibilityGraphs();
                var visibilityGraphGenerator = new InteractiveTangentVisibilityGraphCalculator(addedPolygons,
                                                                                               activePolygons,
                                                                                               VisibilityGraph);
                visibilityGraphGenerator.Run();
                activePolygons.AddRange(addedPolygons);
                CalculateEdgeTargetVisibilityGraphForFloatingPort(targetLocation, portLoosePolyline);
                CalculateSourcePortVisibilityGraph();
            }
        }