Appendix: Drawing Faces REM **************************************** REM ** BBC BASIC procedure to draw a face ** REM **************************************** DEF PROCdraw_face(Draw%,x%,y%,r%,Fill_colour%,Line_colour%,Line_width%,cheeks,eyes,nose,mouth,RETURN face_boundary%()) LOCAL Word%, Movepath%, Bezierpath%, Closepath% LOCAL Line_style%, Points%, block% Word% = 4 Movepath% = 2 Bezierpath% = 6 Closepath% = 5 Points% = 97*Word% Line_style% = FNdraw_line_style(1,1,1,1,0,0) REM *Simple function describing a basic line* r% = r%/2.5 DIM block% Points% block%!0 = Movepath% block%!Word% = x%-r%*2 block%!(Word%*2) = y%+r%*2 block%!(Word%*3) = Bezierpath% block%!(Word%*4) = x%-r%*1.3 block%!(Word%*5) = y%+r%*3.13 block%!(Word%*6) = x%+r%*1.3 block%!(Word%*7) = y%+r%*3.13 block%!(Word%*8) = x%+r%*2 block%!(Word%*9) = y%+r%*2 block%!(Word%*10) = Bezierpath% block%!(Word%*11) = x%+r%*(2.78+cheeks*2) block%!(Word%*12) = y%+r%*0.73 block%!(Word%*13) = x%+r%*1.49 block%!(Word%*14) = y%-r%*2 block%!(Word%*15) = x% block%!(Word%*16) = y%-r%*2 block%!(Word%*17) = Bezierpath% block%!(Word%*18) = x%-r%*1.49 block%!(Word%*19) = y%-r%*2 block%!(Word%*20) = x%-r%*(2.78+cheeks*2) block%!(Word%*21) = y%+r%*0.73 block%!(Word%*22) = x%-r%*2 block%!(Word%*23) = y%+r%*2 block%!(Word%*24) = Closepath% REM left eye block%!(Word%*25) = Movepath% block%!(Word%*26) = x%-r%*(7+3*eyes)/8 block%!(Word%*27) = y%+r%*(10-3*eyes)/8 block%!(Word%*28) = Bezierpath% block%!(Word%*29) = x%-r%*(7+3*eyes)/8 block%!(Word%*30) = y%+r%*(10-3*eyes)/8 block%!(Word%*31) = x%-r%*(5+eyes)/8 block%!(Word%*32) = y%+r%*(9-4*eyes)/8 block%!(Word%*33) = x%-r%/2 block%!(Word%*34) = y%+r%*(10-3*eyes)/8 block%!(Word%*35) = Bezierpath% block%!(Word%*36) = x%+r%*(2+2*eyes)/8 block%!(Word%*37) = y%+r%*(16-eyes)/8 block%!(Word%*38) = x%-r%*(13+5*eyes)/8 block%!(Word%*39) = y%+r%*(16-eyes)/8 block%!(Word%*40) = x%-r%*(7+3*eyes)/8 block%!(Word%*41) = y%+r%*(10-3*eyes)/8 block%!(Word%*42) = Closepath% REM right eye block%!(Word%*43) = Movepath% block%!(Word%*44) = x%+r%*(7+3*eyes)/8 block%!(Word%*45) = y%+r%*(10-3*eyes)/8 block%!(Word%*46) = Bezierpath% block%!(Word%*47) = x%+r%*(7+3*eyes)/8 block%!(Word%*48) = y%+r%*(10-3*eyes)/8 block%!(Word%*49) = x%+r%*(5+eyes)/8 block%!(Word%*50) = y%+r%*(9-4*eyes)/8 block%!(Word%*51) = x%+r%/2 block%!(Word%*52) = y%+r%*(10-3*eyes)/8 block%!(Word%*53) = Bezierpath% block%!(Word%*54) = x%-r%*(2+2*eyes)/8 block%!(Word%*55) = y%+r%*(16-eyes)/8 block%!(Word%*56) = x%+r%*(13+5*eyes)/8 block%!(Word%*57) = y%+r%*(16-eyes)/8 block%!(Word%*58) = x%+r%*(7+3*eyes)/8 block%!(Word%*59) = y%+r%*(10-3*eyes)/8 block%!(Word%*60) = Closepath% REM nose block%!(Word%*61) = Movepath% block%!(Word%*62) = x% block%!(Word%*63) = y%+r% block%!(Word%*64) = Bezierpath% block%!(Word%*65) = x% block%!(Word%*66) = y%+r% block%!(Word%*67) = x%-r%*(1.1+nose*2/3) block%!(Word%*68) = y% block%!(Word%*69) = x% block%!(Word%*70) = y% block%!(Word%*71) = Bezierpath% block%!(Word%*72) = x%+r%*(1.1+nose*2/3) block%!(Word%*73) = y% block%!(Word%*74) = x% block%!(Word%*75) = y%+r% block%!(Word%*76) = x% block%!(Word%*77) = y%+r% block%!(Word%*78) = Closepath% REM mouth block%!(Word%*79) = Movepath% block%!(Word%*80) = x%-r%*0.8 block%!(Word%*81) = y%+r%*(mouth/4-0.75) block%!(Word%*82) = Bezierpath% block%!(Word%*83) = x%-r%*0.8 block%!(Word%*84) = y%+r%*(mouth/4-0.75) block%!(Word%*85) = x% block%!(Word%*86) = y%-r%*(8+mouth*6)/8 block%!(Word%*87) = x%+r%*0.8 block%!(Word%*88) = y%+r%*(mouth/4-0.75) block%!(Word%*89) = Bezierpath% block%!(Word%*90) = x%+r%*0.8*(5-mouth)/8 block%!(Word%*91) = y%-r%*(9+mouth*7)/8 block%!(Word%*92) = x%-r%*0.8/2 block%!(Word%*93) = y%-r%*(8+mouth*8)/8 block%!(Word%*94) = x%-r%*0.8 block%!(Word%*95) = y%+r%*(mouth/4-0.75) block%!(Word%*96) = Closepath% PROCdraw_path_object(Draw%,Fill_colour%,Line_colour%,Line_width%,Line_style |%,block%,Points%,face_boundary%()) ENDPROC REM ***************************************** DEF PROCdraw_path_object(Draw%,Fill_colour%,Line_colour%,Line_width%,Line_s |tyle%,Pointer%,Points%,RETURN parent_boundary%()) LOCAL pointer%, Path%, Endpath%, tag%, Word%, boundary%(), point% Path% = 2 Endpath% = 0 Word% = 4 DIM boundary%(4) boundary%()=0,2^30,2^30,-(2^30),-(2^30) pointer% = FNdraw_start_object(Path%) PROCdraw_word(Fill_colour%) PROCdraw_word(Line_colour%) PROCdraw_word(Line_width%) PROCdraw_word(Line_style%) point%=0 REPEAT tag%=Pointer%!point% PROCdraw_word(tag%) point% += Word% CASE tag% OF WHEN 2,8 PROCdraw_coords(Pointer%!point%,Pointer%!(point%+Word%),boundary%()) point% += 2*Word% WHEN 6 PROCdraw_coords(Pointer%!point%,Pointer%!(point%+Word%),boundary%()) point% += 2*Word% PROCdraw_coords(Pointer%!point%,Pointer%!(point%+Word%),boundary%()) point% += 2*Word% PROCdraw_coords(Pointer%!point%,Pointer%!(point%+Word%),boundary%()) point% += 2*Word% ENDCASE UNTIL point% = Points% PROCdraw_word(Endpath%) PROCdraw_end_object(pointer%, boundary%()) PROCdraw_extend_boundary(parent_boundary%(), boundary%()) ENDPROC