ProblemA 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 basicsFor 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
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:
Next we apply the rules:
One extra step by applying this rule:
and finally we arrive at:
In this equition a has to be solved numerically.
Calculation of b=x1Knowing a, b=x1 may be calculated.
We apply the rule:
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.
Calculation of c
Knowing a,b and y1 directly calculates c:
Delphi programIn 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; begin a1 := 1; a2 := 100; dy := y1-y2; QLV := 0.5*sqrt(sqr(linelength)-sqr(dy)); repeat 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); end;a is solved numerically by clamping between a1 and a2.
Note: the uses clause must include "math".
An example to end this article: