Hanging cables


A non-elastic but flexible cable of a fixed length is attached at two points.
Which function describes the points on such an arc?
This article explains.

Given are the length L of the cable and the coordinates of the two ends: (x1,y1) and (x2,y2)

The basics

For a proof of the next functions please refer to Wikipedia, using "catenary" or "hanging cables" as keywords.
The general function describing the hanging cable arc is
    y = a.cosh(x/a).....................where cosh(x) = (ex+e-x)/2
The length L1 of an arc from x=0 to x = x1 is
    L1=a.sinh(x1/a).....................where sinh(x)=(ex-e-x)/2
The next pictures presents some arcs for different values of a:

We notice that the vertex is positioned on the Y-axis, which also is a line of symmetry.
A is the scaling factor, both horizontally and vertically.

For a start, our problem is this:

Known values are the coordinates of points P1 and P2 and h = x1+x2
In this graph the minimum is y=a, but by adding a value C the function is shifted vertically without a change of L.

So what matters right now is the cable length L=L1+L2,
the difference dy = y2-y1 and the horizontal distance h=x1+x2.

This is what we know:

First we want to know a.
We need to eliminate x1, x2, y1, y2 replacing them by the known values L, h and dy.

The calculation of a

Now we apply the rule:

and continue:

Next we apply the rules:

and continue:

One extra step by applying this rule:

and finally we arrive at:

In this equition a has to be solved numerically.

Calculation of b=x1

Knowing a, b=x1 may be calculated.

We apply the rule:

and continue:

In the final formula we want P1 on the Y-axis, so b = x1 is the horizontal shift required.
Note: this is done by replacing x by (x-b).
After this shift x1 = 0, x2 = h.
So far we have only used dy, not y1 and y2.
The minimum of the curve is a above the X-axis.

To make the curve hit points P1 and P2 a vertical shift is required.
Final formula:

Calculation of c

Knowing a,b and y1 directly calculates c:

Delphi program

In this program h (horizontal distance of points) = 20.
procedure calculateArc(var A,B,C : double; y1,y2: double);
//given: linelength, (0,y1) , (20,y2)
//calculate formula y = A*cosh((x-B)/A) + C
var a1,a2,QLV,V,dy : double;
 a1 := 1;
 a2 := 100;
 dy := y1-y2;
 QLV := 0.5*sqrt(sqr(linelength)-sqr(dy));
  A := 0.5*(a1+a2);
  V := A*sinh(10/A);
  if V > QLV then a1 := A;
  if V < QLV then a2 := A;
 until abs(QLV - V) < 0.0001;
 B := A*arcsinh(dy/(2*A*sinh(10/A))) + 10;
 C := y1 - A*cosh(B/A);
a is solved numerically by clamping between a1 and a2.
Note: the uses clause must include "math".

An example to end this article: