Ejemplo n.º 1
0
 public override bool GetBool(object dataHolder)
 {
     if (dataHolder is INodeLabelLayout)
     {
         var node = layoutGraph.GetOwner((INodeLabelLayout)dataHolder);
         if (layoutGraph is CopiedLayoutGraph)
         {
             bool[] selectedLabels = selectedLabelsAtItemProvider.Get(node) as bool[];
             if (selectedLabels != null)
             {
                 var nodeLabelLayouts = layoutGraph.GetLabelLayout(node);
                 for (int i = 0; i < nodeLabelLayouts.Length; i++)
                 {
                     var nodeLabelLayout = nodeLabelLayouts[i];
                     if (nodeLabelLayout == dataHolder && selectedLabels.Length > i)
                     {
                         return(selectedLabels[i]);
                     }
                 }
             }
         }
     }
     else if (dataHolder is IEdgeLabelLayout)
     {
         var edge = layoutGraph.GetOwner((IEdgeLabelLayout)dataHolder);
         if (layoutGraph is CopiedLayoutGraph)
         {
             bool[] selectedLabels = selectedLabelsAtItemProvider.Get(edge) as bool[];
             if (selectedLabels != null)
             {
                 var edgeLabelLayouts = layoutGraph.GetLabelLayout(edge);
                 for (int i = 0; i < edgeLabelLayouts.Length; i++)
                 {
                     var edgeLabelLayout = edgeLabelLayouts[i];
                     if (edgeLabelLayout == dataHolder && selectedLabels.Length > i)
                     {
                         return(selectedLabels[i]);
                     }
                 }
             }
         }
     }
     return(false);
 }
        /// <inheritdoc/>
        public virtual double GetProfit(LabelCandidate candidate)
        {
            if (candidate.Owner is IEdgeLabelLayout)
            {
                return(1);
            }
            double           profit = 0;
            INodeLabelLayout nl     = (INodeLabelLayout)candidate.Owner;
            var node            = graph.GetOwner(nl);
            var nodeLayout      = graph.GetLayout(node);
            var candidateLayout = candidate.BoundingBox;

            var isLeft   = candidateLayout.X + candidateLayout.Width / 2 < nodeLayout.X;
            var isRight  = candidateLayout.X + candidateLayout.Width / 2 > (nodeLayout.X + nodeLayout.Width);
            var isTop    = candidateLayout.Y + candidateLayout.Height / 2 < nodeLayout.Y;
            var isBottom = candidateLayout.Y + candidateLayout.Height / 2 > (nodeLayout.Y + nodeLayout.Height);

            var horizontalCenter = !isLeft && !isRight;
            var verticalCenter   = !isTop && !isBottom;

            if (horizontalCenter && verticalCenter)
            {
                // candidate is in center -> don't use
                return(0);
            }
            else if (horizontalCenter || verticalCenter)
            {
                profit = 0.95;
            }
            else
            {
                // diagonal candidates get a bit less profit
                profit = 0.9;
            }
            foreach (var edge in node.Edges)
            {
                var portLocation = edge.Source == node?graph.GetSourcePointRel(edge) : graph.GetTargetPointRel(edge);

                if (Math.Abs(portLocation.X) > Math.Abs(portLocation.Y))
                {
                    // edge at left or right
                    if (portLocation.X < 0 && isLeft || portLocation.X > 0 && isRight)
                    {
                        if (isTop || isBottom)
                        {
                            profit -= 0.03;
                        }
                        else
                        {
                            // edge at same side as candidate
                            profit -= 0.2;
                        }
                    }
                    else if (horizontalCenter)
                    {
                        // candidate is close to the edge but not on the same side
                        profit -= 0.01;
                    }
                }
                else
                {
                    // edge at top or bottom
                    if (portLocation.Y < 0 && isTop || portLocation.Y > 0 && isBottom)
                    {
                        if (isLeft || isRight)
                        {
                            profit -= 0.03;
                        }
                        else
                        {
                            profit -= 0.2;
                        }
                    }
                    else if (verticalCenter)
                    {
                        // candidate is close to the edge but not on the same side
                        profit -= 0.01;
                    }
                }
            }

            return(Math.Max(0, profit));
        }
Ejemplo n.º 3
0
 /// <inheritdoc/>
 public override bool GetBool(object dataHolder)
 {
     return(nonTreeEdgeDp.GetBool(graph.GetOwner((IEdgeLabelLayout)dataHolder)));
 }