BBC Basic, 300 ký tự ASCII, kích thước tệp được mã hóa 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
Trình giả lập tại http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Điều này rõ ràng đã được giải quyết trước đây, vì vậy điều đầu tiên tôi làm là xem những gì người khác đã làm.
Phương trình của một dây xích tập trung ở gốc tọa độ đơn giản y=a*cosh(x/a)
. Nó trở nên phức tạp hơn một chút nếu nó không tập trung ở điểm gốc.
Nhiều nguồn khác nhau nói rằng nếu biết chiều dài và điểm cuối thì giá trị a
phải được xác định bằng số. Có một tham số không xác định h
trong bài viết trên wikipedia. Vì vậy, tôi đã tìm thấy một trang web khác và về cơ bản theo phương pháp ở đây: http://www.math.niu.edu/~rusin/ Unknown-math / 99_income / catenary
BBC Basic không có sinh
và cosh
được tích hợp sẵn, vì vậy tôi đã xác định hai hàm ở cuối chương trình để tính toán chúng bằng cách sử dụngEXP
tọa độ cho điểm bên trái phải được cung cấp trước điểm bên phải, OP xác nhận điều này là OK. Chiều dài được đưa ra cuối cùng. Các giá trị có thể được phân tách bằng dấu phẩy hoặc dòng mới.
Mã bị đánh cắp
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