BBC Basic、300 ASCII文字、トークン化されたファイルサイズ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
エミュレーター(http://www.bbcbasic.co.uk/bbcwin/bbcwin.html)
これは明らかに以前に解決されたので、私が最初に行ったのは、他の人が行ったことを確認することでした。
原点を中心とするカテナリーの方程式は単純y=a*cosh(x/a)
です。原点を中心にしないと、少し複雑になります。
さまざまな情報源によると、長さと端点がわかっている場合、の値はa
数値で決定する必要があります。h
ウィキペディアの記事に未指定のパラメーターがあります。だから私は別のサイトを見つけて、基本的にここの方法に従いました:http : //www.math.niu.edu/~rusin/known-math/99_incoming/catenary
BBC Basicには組み込みsinh
とcosh
組み込みがないため、プログラムの最後に2つの関数を定義して、EXP
左側の点の座標を右側の点の前に指定する必要があります。OPはこれが問題ないことを確認しました。長さは最後に与えられます。値はコンマまたは改行で区切ることができます。
ゴルフではないコード
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
