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