REM mw3bbc.bas - jackord@kw.igs.net - 31 Dec 07 - BBC BASIC 5.50b REM wave incident (n=1) on a film (n=2) on a substrate (n=1.5) REM the film thickness is 3/4 of the wavelength in the film *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%, "Film on a Dielectric" OFF REPEAT WAIT 1 UNTIL FALSE DEF PROCp1 : kk=1 DEF PROCp2 : kk=2 ORIGIN 0, 240 b=PI/120: c=PI/60: phi=PI/2 n1=1: n=2: n2=1.5: a1=120: jd=45 : REM Amplitudes r1=a1*(n1*n2-n*n)/(n1*n2+n*n): t=n/n2*(a1+r1) a2=t*(n+n2)/2/n: r2=t-a2 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 LINE 570, -240, 570, 240 IF kk=1 THEN GCOL 9: MOVE 0, INT(a1*SIN(i*b)) : REM Plot components FOR j=1 TO 240 DRAW 2*j, INT(a1*SIN(i*b-j*n1*c)) NEXT j GCOL 6: MOVE 0, INT(r1*SIN(i*b)) FOR j=1 TO 240 DRAW 2*j, INT(r1*SIN(i*b+j*n1*c)) NEXT j GCOL 13: MOVE 480, INT(a2*SIN(i*b+jd*n*c+phi)) FOR j=1 TO jd DRAW 480+2*j, INT(a2*SIN(i*b-(j-jd)*n*c+phi)) NEXT j GCOL 10: MOVE 480, INT(r2*SIN(i*b-jd*n*c+phi)) FOR j=1 TO jd DRAW 480+2*j, INT(r2*SIN(i*b+(j-jd)*n*c+phi)) NEXT j ELSE GCOL 12: MOVE 0, INT((a1+r1)*SIN(i*b)) : REM Plot resultant FOR j=1 TO 240 DRAW 2*j, INT(a1*SIN(i*b-j*n1*c)+r1*SIN(i*b+j*n1*c)) NEXT j FOR j=1 TO jd DRAW 480+2*j, INT(a2*SIN(i*b-(j-jd)*n*c+phi)+r2*SIN(i*b+(j-jd)*n*c+phi)) NEXT j ENDIF GCOL 12: MOVE 570, INT(t*SIN(i*b+phi)) : REM Plot transmitted wave FOR j=jd+1 TO 240 DRAW 480+2*j, INT(t*SIN(i*b-(j-jd)*n2*c+phi)) NEXT j tt=tt+del: WHILE tt>TIME: ENDWHILE * REFRESH NEXT i * REFRESH ON ENDPROC