示例#1
0
        /// <summary>
        /// calculates maximum possible edge separation for the computed routing
        ///   if it is greater than bundlingSettings.EdgeSeparation, then proceed
        ///   if it is smaller, then either
        ///     stop edge bundling, or
        ///     reduce edge separation, or
        ///     move obstacles to get more free space
        /// </summary>
        bool AnalyzeEdgeSeparation()
        {
            Dictionary <EdgeGeometry, Set <CdtEdge> > crossedCdtEdges = new Dictionary <EdgeGeometry, Set <CdtEdge> >();

            shortestPathRouter.FillCrossedCdtEdges(crossedCdtEdges);
            Dictionary <CdtEdge, Set <EdgeGeometry> > pathsOnCdtEdge = GetPathsOnCdtEdge(crossedCdtEdges);
            double es = CalculateMaxAllowedEdgeSeparation(pathsOnCdtEdge);

            // TimeMeasurer.DebugOutput("opt es: " + es);

            if (es >= bundlingSettings.EdgeSeparation)
            {
                return(true); //we can even enlarge it here
            }
            if (es <= 0.02)
            {
                TimeMeasurer.DebugOutput("edge bundling can't be executed: not enough free space around obstacles");
                foreach (var e in regularEdges)
                {
                    e.Curve = null;
                }

                return(false);
            }
            // reducing edge separation
            // TimeMeasurer.DebugOutput("reducing edge separation to " + es);
            bundlingSettings.EdgeSeparation = es;
            shortestPathRouter.RouteEdges();
            return(true);
        }