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(); } }