static void MoveLowerSite(OverlappedEdge edge, Point[] posNew, Point[] oldPos,
                                  Set <int> visited)
        {
            double idealLen = edge.idealDistance;
            var    dir      = -oldPos[edge.target] + oldPos[edge.source];
            var    len      = dir.Length;

            dir *= (idealLen / len + 0.01);
            var standingNode = edge.target;
            var movedNode    = edge.source;

            posNew[movedNode] = posNew[standingNode] + dir;
            visited.Insert(movedNode);
        }
        /// <summary>
        /// Returns a tuple representing an edge with: nodeId1, nodeId2, t(overlapFactor), ideal distance, edge weight.
        /// </summary>
        /// <param name="nodeId1"></param>
        /// <param name="nodeId2"></param>
        /// <param name="point1"></param>
        /// <param name="point2"></param>
        /// <param name="nodeSizes"></param>
        /// <param name="forLayers"></param>
        /// <returns></returns>
        internal static OverlappedEdge GetIdealEdge(int nodeId1, int nodeId2,
                                                    Point point1,
                                                    Point point2,
                                                    Size[] nodeSizes, bool forLayers)
        {
            double t;

            double idealDist = GetIdealEdgeLength(nodeId1, nodeId2, point1, point2, nodeSizes, out t);
            double length    = (point1 - point2).Length;

            Rectangle box1, box2;

            if (forLayers)
            {
                int maxId = Math.Max(nodeId1, nodeId2);
                box1 = new Rectangle(nodeSizes[maxId], point1);
                box2 = new Rectangle(nodeSizes[maxId], point2);
            }
            else
            {
                box1 = new Rectangle(nodeSizes[nodeId1], point1);
                box2 = new Rectangle(nodeSizes[nodeId2], point2);
            }
            var distBox = GetDistanceRects(box1, box2);

            double weight;

            if (t > 1) //overlap
            {
                weight = -(idealDist - length);
            }
            else
            {
                weight = distBox;
            }
            int smallId = nodeId1;
            int bigId   = nodeId2;

            if (nodeId1 > nodeId2)
            {
                smallId = nodeId2;
                bigId   = nodeId1;
            }
            return(OverlappedEdge.Create(smallId, bigId, t, idealDist, weight));
        }
 static double GetEdgeWidth(OverlappedEdge edge)
 {
     return(edge.overlapFactor > 1 ? 6 : 2);
 }