InteractiveEdgeRouter CreateInteractiveEdgeRouter(IEnumerable<Shape> obstacleShapes) { //we need to create a set here because one loose polyline can hold several original shapes var loosePolys = new Set<Polyline>(obstacleShapes.Select(sh => shapesToTightLooseCouples[sh].LooseShape.BoundaryCurve as Polyline)); var router = new InteractiveEdgeRouter { VisibilityGraph = visGraph, TightHierarchy = CreateTightObstacleHierarachy(obstacleShapes), LooseHierarchy = CreateLooseObstacleHierarachy(loosePolys), UseSpanner = true, LookForRoundedVertices = true, TightPadding = tightPadding, LoosePadding = LoosePadding, UseEdgeLengthMultiplier = UseEdgeLengthMultiplier, UsePolylineEndShortcutting = UsePolylineEndShortcutting, UseInnerPolylingShortcutting = UseInnerPolylingShortcutting, AllowedShootingStraightLines = AllowedShootingStraightLines, CacheCorners = CacheCornersForSmoothing, }; router.AddActivePolygons(loosePolys.Select(polyline => new Polygon(polyline))); return router; }
void ScaleDownLooseHierarchy(InteractiveEdgeRouter interactiveEdgeRouter, Set<Shape> obstacleShapes) { var loosePolys = new List<Polyline>(); foreach (var obstacleShape in obstacleShapes) { var tl = shapesToTightLooseCouples[obstacleShape]; loosePolys.Add( InteractiveObstacleCalculator.LoosePolylineWithFewCorners(tl.TightPolyline, tl.Distance / BundleRouter.SuperLoosePaddingCoefficient)); } interactiveEdgeRouter.LooseHierarchy=CreateLooseObstacleHierarachy(loosePolys); interactiveEdgeRouter.ClearActivePolygons(); interactiveEdgeRouter.AddActivePolygons(loosePolys.Select(polyline => new Polygon(polyline))); }