REM nm1bbc.bas - jackord@kw.igs.net - revised 26 Dec 07 - BBC Basic v5.50b REM string of length L, clamped at both ends REM Pluck and Pulse initial displacements REM motion generated by superposition of waves of wavelength 2L REM travelling in opposite directions REM y(L/4) is plotted versus time *FLOAT64 INSTALL @lib$+"WINLIB5" REM Initialize Window b1% = FN_button("Pulse", 162, 5, 60, 20, FN_setproc(PROCp1), 0) b2% = FN_button("Pluck", 232, 5, 60, 20, FN_setproc(PROCp2), 0) b3% = FN_button("Motion", 302, 5, 60, 20, FN_setproc(PROCp3), 0) WindowWidth=524 WindowHeight=230 VDU 23,22,WindowWidth;WindowHeight;8,15,16,128 SYS "SetWindowText", @hwnd%, "Travelling Wave Superposition" DIM y%(768), yy%(768), yp%(768) kk=0: plt=0: jt=0: n=384 OFF: VDU 5 REPEAT WAIT 1 UNTIL FALSE QUIT DEF PROCp1: kk=1: jt=0 DEF PROCp2: kk=2: jt=0 DEF PROCp3: IF kk>0 THEN plt=1 ELSE ENDPROC IF jt=0 THEN IF kk=1 THEN FOR i=0 TO n/2 : REM Init pluck y%(i)=2*i: y%(n-i)=y%(i) NEXT i ELSE FOR i=0 TO n: y%(i)=0: NEXT i : REM Init pulse FOR i=3*n/8 TO n/2 y%(i)=8*(i-3*n/8): y%(n-i)=y%(i) NEXT i ENDIF FOR i=0 TO n : REM Extend wave to 2L y%(n+i)=-y%(i) NEXT i ENDIF IF plt=1 THEN * REFRESH OFF WHILE jt=0 OR plt=1 : REM Main loop CLS: GCOL 0: MOVE 8, 160: DRAW 8, 240: MOVE 776, 160: DRAW 776, 240 MOVE 784, 200: DRAW 1040, 200 GCOL 12: MOVE 8, 200 FOR i=1 TO n : REM Draw string ia=i+jt: WHILE ia>2*n: ia=ia-2*n: ENDWHILE : REM Wave moving left ib=i-jt: WHILE ib<0: ib=ib+2*n: ENDWHILE : REM Wave moving right yy%(i)=200+(y%(ia)+y%(ib))/4 : REM Superposition DRAW 8+2*i, yy%(i) NEXT i yp%(jt)=yy%(n/4) GCOL 9: CIRCLE FILL 202, yp%(jt)-2, 12 MOVE 784, yp%(0) FOR j=0 TO jt : REM Plot y(L/4) vs time DRAW 784+INT(4*j/12), yp%(j) NEXT j IF plt=1 THEN * REFRESH jt=jt+1 IF jt=2*n+1 THEN plt=0: kk=0: * REFRESH ON ENDWHILE ENDPROC