public static string GenerateCurvedPath(this LinkModel link) { var sX = link.GetMiddleSourceX(); var sY = link.GetMiddleSourceY(); double tX, tY; if (link.IsAttached) { tX = link.GetMiddleTargetX(); tY = link.GetMiddleTargetY(); } else { tX = link.OnGoingPosition !.X; tY = link.OnGoingPosition.Y; } var cX = (sX + tX) / 2; var cY = (sY + tY) / 2; var curvePointA = GetCurvePoint(sX, sY, cX, cY, link.SourcePort.Alignment); var curvePointB = GetCurvePoint(tX, tY, cX, cY, link.TargetPort?.Alignment); return(FormattableString.Invariant($"M {sX} {sY} C {curvePointA}, {curvePointB}, {tX} {tY}")); }
/// <summary> /// If the link is attached, returns the same output as GetMiddleTargetY(). /// Otherwise, returns the Y value of link's ongoing position. /// </summary> /// <param name="link">The LinkModel entity</param> public static double GetTargetY(this LinkModel link) { if (!link.IsAttached) { return(link.OnGoingPosition !.Y); } return(link.GetMiddleTargetY()); }
public static string CalculateAngleForTargetArrow(this LinkModel link) { var sX = link.GetMiddleSourceX(); var sY = link.GetMiddleSourceY(); double tX, tY; if (link.IsAttached) { tX = link.GetMiddleTargetX(); tY = link.GetMiddleTargetY(); } else { tX = link.OnGoingPosition !.X; tY = link.OnGoingPosition.Y; } var angle = 90 + Math.Atan2(tY - sY, tX - sX) * 180 / Math.PI; return(angle.ToString(CultureInfo.InvariantCulture)); }
public static string GenerateCurvedPath(this LinkModel link) { var sX = link.GetMiddleSourceX(); var sY = link.GetMiddleSourceY(); double tX, tY; if (link.IsAttached) { tX = link.GetMiddleTargetX(); tY = link.GetMiddleTargetY(); } else { tX = link.OnGoingPosition !.X; tY = link.OnGoingPosition.Y; } return($"M {sX.ToInvariantString()} {sY.ToInvariantString()} " + $"C {((sX + tX) / 2).ToInvariantString()} {sY.ToInvariantString()}," + $" {((sX + tX) / 2).ToInvariantString()} {tY.ToInvariantString()}," + $" {tX.ToInvariantString()} {tY.ToInvariantString()}"); }