BBC Basic, 300 caracteres ASCII, tamaño de archivo tokenizado 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
Emulador en http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Obviamente, esto ya se ha resuelto antes, así que lo primero que hice fue mirar lo que otros han hecho.
La ecuación de una catenaria centrada en el origen es sencilla y=a*cosh(x/a)
. Se vuelve un poco más complicado si no está centrado en el origen.
Varias fuentes dicen que si se conocen la longitud y los puntos finales, el valor a
debe determinarse numéricamente. Hay un parámetro no especificado h
en el artículo de wikipedia. Así que encontré otro sitio y básicamente seguí el método aquí: http://www.math.niu.edu/~rusin/known-math/99_incoming/catenary
BBC Basic no tiene sinh
e cosh
incorporado, así que definí dos funciones al final del programa para calcularlas usandoEXP
las coordenadas para el punto izquierdo se deben proporcionar antes del punto derecho, OP confirmó que esto está bien. La longitud se da al final. Los valores pueden estar separados por comas o nuevas líneas.
Código sin golf
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