REM mw2.bbc.bas - jackord@kw.igs.net - revised 31 Dec 07 - BBC BASIC 5.50b REM wave striking an absorbing medium, n(left)=1 and n(right)=2-.2i *FLOAT64 INSTALL @lib$+"WINLIB5" REM Initialize Window button1% = FN_button("Component", 10, 5, 80, 20, FN_setproc(PROCp1), 0) button2% = FN_button("Resultant", 110, 5, 80, 20, FN_setproc(PROCp2), 0) WindowWidth=480 : REM Scale 0-480 WindowHeight=240 : REM Scale 0-240 VDU 23,22,WindowWidth;WindowHeight;8,15,16,128 SYS "SetWindowText", @hwnd%, "Absorbing Medium" OFF REPEAT WAIT 1 UNTIL FALSE DEF PROCp1 : kk=1 DEF PROCp2 : kk=2 ORIGIN 0, 240 b=PI/120: c=PI/60 n=2: k=.2: a=120 r=a*((1-n)*(1-n)+k*k)^.5/((1+n)*(1+n)+k*k)^.5 : REM Amplitudes ph1=ATN((2*k)/(1-n*n-k*k))+PI : REM and t=2*a/((1+n)*(1+n)+k*k)^.5 : REM phases ph2=ATN(k/(1+n)) tt=TIME: del=1.5 * REFRESH OFF FOR i=0 TO 960 CLS: GCOL 0 LINE 0, 0, 960, 0 : LINE 480, -240, 480, 240 IF kk=1 THEN GCOL 9: MOVE 0, INT(a*SIN(i*b)) : REM Plot components FOR j=1 TO 240 DRAW 2*j, INT(a*SIN(i*b-j*c)) NEXT j GCOL 6: MOVE 0, INT(r*SIN(i*b+ph1)) FOR j=1 TO 240 DRAW 2*j, INT(r*SIN(i*b+j*c+ph1)) NEXT j ELSE GCOL 12: MOVE 0, INT(a*SIN(i*b)+r*SIN(i*b+ph1)) FOR j=1 TO 240 : REM Plot resultant DRAW 2*j, INT(a*SIN(i*b-j*c)+r*SIN(i*b+j*c+ph1)) NEXT j ENDIF GCOL 12: MOVE 480, INT(t*SIN(i*b+ph2)) : REM Plot transmitted wave FOR j=1 TO 240 DRAW 480+2*j, INT(t*EXP(-j*k*c)*SIN(i*b-j*n*c+ph2)) NEXT j tt=tt+del: WHILE tt>TIME: ENDWHILE * REFRESH NEXT i * REFRESH ON ENDPROC