BBC Basic, 300 ASCII-Zeichen, Token-Dateigröße 260
INPUTr,s,u,v,l:r*=8s*=8u*=8v*=8l*=8z=0REPEATz+=1E-3UNTILFNs(z)/z>=SQR(l^2-(v-s)^2)/(u-r)a=(u-r)/2/z
p=(r+u-a*LN((l+v-s)/(l-v+s)))/2q=(v+s-l*FNc(z)/FNs(z))/2MOVE800,0DRAW0,0DRAW0,800CIRCLEu,v,8CIRCLEr,s,8FORx=r TOu
DRAW x,a*FNc((x-p)/a)+q
NEXT
DEFFNs(t)=(EXP(t)-EXP(-t))/2
DEFFNc(t)=(EXP(t)+EXP(-t))/2
Emulator unter http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Dies wurde offensichtlich schon früher gelöst, also habe ich als erstes nachgesehen, was andere getan haben.
Die Gleichung einer am Ursprung zentrierten Oberleitung ist einfach y=a*cosh(x/a)
. Es wird etwas komplizierter, wenn es nicht am Ursprung zentriert ist.
Verschiedene Quellen sagen, dass, wenn die Länge und die Endpunkte bekannt sind, der Wert für a
numerisch bestimmt werden muss. h
Der Wikipedia-Artikel enthält einen nicht angegebenen Parameter . Also fand ich eine andere Site und folgte im Grunde der Methode hier: http://www.math.niu.edu/~rusin/known-math/99_incoming/catenary
BBC Grund hat nicht sinh
und cosh
integriert, so dass ich am Ende des Programms zwei Funktionen definiert , sie berechnen mitEXP
Die Koordinaten für den linken Punkt müssen vor dem rechten Punkt angegeben werden. OP hat bestätigt, dass dies in Ordnung ist. Länge wird zuletzt angegeben. Werte können durch Kommas oder Zeilenumbrüche getrennt werden.
Ungolfed Code
INPUT r,s,u,v,l
REM convert input in range 0-100 to graphic coordinates in range 0-800
r*=8 s*=8 u*=8 v*=8 l*=8
REM solve for z numerically
z=0
REPEAT
z+=1E-3
UNTIL FNs(z)/z>=SQR(l^2-(v-s)^2)/(u-r)
REM calculate the curve parameters
a=(u-r)/2/z
p=(r+u-a*LN((l+v-s)/(l-v+s)))/2
q=(v+s-l*FNc(z)/FNs(z))/2
REM draw axes, 800 graphics units long = 400 pixels long (2 graphics units per pixel)
MOVE 800,0
DRAW 0,0
DRAW 0,800
REM draw markers at end and beginning of curve (beginning last, so that cursor is in right place for next step)
CIRCLE u,v,8
CIRCLE r,s,8
REM draw curve from beginning to end
FORx=r TOu
DRAW x,a*FNc((x-p)/a)+q
NEXT
REM definitions of sinh and cosh
DEF FNs(t)=(EXP(t)-EXP(-t))/2
DEF FNc(t)=(EXP(t)+EXP(-t))/2