/// Convert a parameter t ranging from 0..1 to the x-coordinate along the curve /// </summary> /// <param name="span">The span</param> /// <param name="center">The center of the catenary</param> /// <param name="w">The unit weight</param> /// <param name="H">The horizontal tension</param> /// <param name="t">A parameter from 0 to 1</param> /// <returns>The x-coordinate value</returns> public static double ParameterToX(Vector2 span, Vector2 center, double w, double H, double t) { double a = H / w; double L = TotalLength(span, center, w, H); return(center.X + a * DoubleEx.Asinh(t * L / a - Math.Sinh(center.X / a))); }
/// <summary> /// Calculate the maximum separation from the diagonal (sag point) /// </summary> /// <param name="span">The span</param> /// <param name="center">The center of the catenary (lower point)</param> /// <param name="w">The unit weight</param> /// <param name="H">The horizontal tension</param> /// <returns>A sag value</returns> public static double MaximumSag(Vector2 span, Vector2 center, double w, double H) { double a = H / w; double x = center.X + a * DoubleEx.Asinh(span.Y / span.X); double y = center.Y + a * (Math.Cosh((x - center.X) / a) - 1); return(span.Y / span.X * x - y); }
/// <summary> /// Calculate the lower point on the catenary (center point) /// </summary> /// <param name="span">The span</param> /// <param name="w">The unit weight</param> /// <param name="H">The horizontal tension</param> /// <returns>A position vector in (x,y) coordinates</returns> public static Vector2 CenterPosition(Vector2 span, double w, double H) { double a = H / w; double η = span.X / (2 * a); double xc = span.X / 2 + a * DoubleEx.Asinh((span.Y * Math.Exp(η)) / (a * (1 - Math.Exp(2 * η)))); double yc = -a * (Math.Cosh(-xc / a) - 1); return(new Vector2(xc, yc)); }
/// <summary> /// Calculate the x-coordinate for the point with maximum separation from the diagonal (sag point) /// </summary> /// <param name="span">The span</param> /// <param name="center">The center of the catenary (lower point)</param> /// <param name="w">The unit weight</param> /// <param name="H">The horizontal tension</param> /// <returns>A x-coordinate value</returns> public static double MaximumSagX(Vector2 span, Vector2 center, double w, double H) { double a = H / w; return(center.X + a * DoubleEx.Asinh(span.Y / span.X)); }