!0.......^.........^.........^.. !B \H11\H07\H10\H01 EVERY PICTURE \H11\H07\H10\H01 TELLS A STORY !2.......^.........^.........^.........^.........^.........^.... Anyone can be an artist on the Spectrum - it's just a matter of co-ordination. Let Chris Somerville tell you where to draw the line. !1.......^.........^.........^.........^........ Everyone must remember using a pantograph at one time or another ... but for those who don't, it's a mechanical instrument used to translate a copy of a drawing to any scale. It may be cheating to use a pantograph but if, like me, you don't have the artistic flair of Rembrandt then it's a worthwhile principle to keep in mind. !0.......^.........^.........^.. ALTERNATIVE ART !1.......^.........^.........^.........^........ Now there are many excellent programs that allow you to create screen graphics by manipulating the cursor on-screen. Unfortunately, not everyone's endowed with the necessary artistic talent that's needed to draw directly to the screen - whether you're using a keyboard, joystick or light pen to control the cursor. There's another method of transferring an original drawing to the screen, and that's to trace the picture on to a piece of transparent plastic material and tape it on the screen as a drawing guide. Trouble is, the original drawing can't be bigger than your TV screen, and the distortion caused by the thickness of the screen precludes accurate work. There are, of course, mechanical/ electronic graph pads and digi-tracers, ranging in price from \H6050 to over \H60100. These, however, cannot cope with large sized drawings; certainly, a pop poster or large scale map would be way beyond them. !0.......^.........^.........^.. !B SQUARING UP !1.......^.........^.........^.........^........ The program included in this article allows you to transfer any drawing - a map, a book illustration, or whatever - in scaled outline, regardless of size. The only restriction on size is that the graphic you wish to enter must lie in the same proportions as the computer screen; this means that any picture, or part of the same, that you intend transferring must be roughly in the proportions three units wide to two units high. Having chosen your subject, you now need to overlay it with a grid of squares; on something like a map these are already there - providing the necessary grid references. In most cases, though, you'll need to draw a pattern of squares in pencil over the original illustration. A more flexible system, and one that'll save your drawings from being covered with squares, is to draw the grid on an acetate sheet (obtained from any good stationer or art shop - just ask for a few pieces of overhead projector film). This can then be placed over the drawing; you should use a fine line marker pen to square up the acetate sheet - I'd suggest the Staedtler Lumocolour 313 Permanent. The grid should be numbered from the bottom left-hand corner, both vertically (Y-axis) and horizontally (X-axis). Normally, it's best to number the co-ordinates of the bottom left-hand corner as X=0, Y=0 (or simply 0,0); if you have a grid numbered in some other fashion - a map for example - or if you're using only a portion of a larger grid, it doesn't matter as the program adjusts the co-ordinates and scales the square to match the screen. !0.......^.........^.........^.. !B YOU GET THE PICTURE !1.......^.........^.........^.........^........ Once you've run the program you'll be asked whether you require a printout of the final plot and draw positions of your creation; you may need these for inclusion in another program. (It's worth noting that these are not the co-ordinates as you enter them, but rather their positions after translation.) If you answer 'Yes' to this option, you'll need to have your printer (ZX Printer, Alphacom 32, or any other printer that recognises LPRINT) connected. You'll then be asked to enter the X and Y co-ordinates of the bottom left and bottom right of the X-axis. The program will then work out the scale, and tell you how many squares high it can allow the picture to be (so that the whole of the picture can be fitted to scale on the TV's screen). If the maximum height of the picture area fits in with your scaled drawing, then you can continue; if it doesn't, you'll have to start again, juggling the X-axis to suit (increasing the number of squares in the X-axis proportionally increases the number of squares in the Y-axis). Now you've decided on the correct scale, you'll be given a number to remember - this acts as an escape number bringing you back to the menu at any time. Normally, the number allocated to this will be '999' (just like the police emergency number), but if '999' is a number that you could tap in as a co-ordinate, the program will assign you a different escape number. If you have trouble with numbers, write it down so you won't forget it at a vital moment in your artistic creation. !0.......^.........^.........^.. !B THE FINAL TOUCHES !1.......^.........^.........^.........^........ I'd suggest that once you've scaled your picture, you save it to tape. You could then re-load it into one of the many graphics packages (Melbourne Draw, for instance) and play around with colour, fill in the outlines, and so on. This program is not intended to compete with other graphics programs, but it's hoped that it will prove a useful addition to the facilities they offer. The program will operate with both the 16K and 48K Spectrum; 48K owners may like to elaborate their version with a 'Paint Fill' option, or even a cursor controlled 'touch-up' routine for correcting minor errors. Any additional routines would need to be entered as subroutines and called from lines 290 to 294. The menu, k$, would also have to he altered (see lines 8000 to 8070) to incorporate additional command letters. Geographical maps prove eminently suitable for display on-screen, but any artwork that can he seen as a series of outlines (rather than tones) can be treated effectively. Book covers, pop posters and comic book illustrations all offer possible material. Even photographs can be tackled after a fashion - just make sure you choose only those prints that have strong contrast, that is ones that have bold areas of black and white. The best way to approach a photo is to trace around the bold areas of contrast - reducing the photo to a sort of contour map showing the light and dark areas - and then square up and enter it as an ordinary outline drawing. The outlines can later be filled in, using one of the commercial graphics packages, to give an 'impressionist' interpretation of the original photograph. But by far the best way to tackle the program is to just wade in and start drawing. I'm no artist, but I'm well proud of some of my creations ... !0.......^.........^.........^.. \H11\H07\H10\H00SPECTRUM PANTOGRAPH !2.......^.........^.........^.........^.........^.........^.... Once you've typed in the listing and RUN it, have a look through the menu options available with the package; the various options are tabulated on the last page of this article. !0.......^.........^.........^.. 5 CLEAR 30548 10 RESTORE : FOR i=USR "A" TO USR "A"+11: READ a: POKE i,a: NE XT i 20 DATA 17,0,72,33,86,119,1,0, 8,237,176,201 !2.......^.........^.........^.........^.........^.........^.... Lines 5-20 Clear memory for the program and POKE the data required for the user-defined graphic. !0.......^.........^.........^.. 25 GO SUB 8000 30 LET code=USR "A" 50 GO TO 100 !2.......^.........^.........^.........^.........^.........^.... Lines 25-50 Set the variable 'code' and jump to the 'start' routine. !0.......^.........^.........^.. 60 POKE code+1,0: POKE code+2, 72: POKE code+4,86: POKE code+5, 119: RANDOMIZE USR code: RETURN : REM reprint 70 POKE code+1,86: POKE code+2 ,119: POKE code+4,0: POKE code+5 ,72: RANDOMIZE USR code: RETURN : REM copy middle block 80 IF print=1 THEN LPRINT "PL OT ";x;",";y 85 RETURN 90 IF print=1 THEN LPRINT "DR AW ";x;",";y 95 RETURN 97 IF print=1 THEN LPRINT "CO RRECTION": LPRINT "PLOT ";cx;"," ;cy 98 RETURN !2.......^.........^.........^.........^.........^.........^.... Lines 60-98 Set up the printer routines. !0.......^.........^.........^.. 100 PAPER 6: INK 0: BORDER 7: C LS 101 LET print=0: LET cflag=0: L ET xcor=0: LET ycor=0 102 PRINT AT 10,0;" DO YOU REQU IRE A PRINTOUT OF THE CO-ORDI NATES ?": PRINT " ENTER Y(Yes) o r N (No)": PRINT '" NB: PRINTER MUST BE ATTACHED.": INPUT i$: IF i$="Y" THEN LET print=1 !2.......^.........^.........^.........^.........^.........^.... Lines 100-102 Set up the start variables and 'printer toggle' variable. !0.......^.........^.........^.. 103 CLS 105 PRINT '" YOUR DRAWING CAN B E OVERLAID WITH A GRID OF SQU ARES OF ANY CONVENIENT SIZE. T HESE SHOULD BE NUMBERED UP AND ACROSS FROM THE BOTTOM LEFT CO RNER." 106 PRINT '" THE NUMBERS ACROSS ARE THE ""X"" CO-ORDIN ATES": PRINT " THE NUMBERS UPWAR DS ARE THE ""Y"" CO-ORDI NATES": PRINT '" ""X"" CO-ORDINA TES (ACROSS) ARE": PRINT " ALWAY S ENTERED FIRST." !2.......^.........^.........^.........^.........^.........^.... Lines 103-106 Print up some brief instructions on-screen. !0.......^.........^.........^.. 107 PRINT '' PAPER 7;" PLEASE E NTER THE X AND Y CO-ORDIN ATES OF THE BOTTOM LEFT HAN D CORNER. ": PLOT 2 ,2: DRAW 0,171: DRAW 251,0: DRAW 0,-171: DRAW -251,0 108 INPUT "X = ";xcor;" Y = ";y cor 109 CLS !2.......^.........^.........^.........^.........^.........^.... Lines 107-109 Request the first set of X and Y coordinates. !0.......^.........^.........^.. 110 LET ux=0: LET uy=0 150 PRINT '" NOW ENTER THE X CO -ORDINATE OF THE BOTTOM RIGHT H AND CORNER." 160 INPUT "X = ";tux: LET tux=t ux-xcor: IF tux<=ux THEN BEEP . 1,60: GO TO 160 !2.......^.........^.........^.........^.........^.........^.... Lines 110-160 Request the second set of X and Y coordinates. !0.......^.........^.........^.. 170 LET tuy=(tux-ux)*175/(255-u y) 175 LET ttuy=tuy+ycor: LET ttux =tux+xcor 176 CLS 180 PRINT ''''''" TOP RIGHT CORNER WILL BE ";t tux;" ACROSS": PRINT " ";ttuy;" UP" 190 PRINT ' PAPER 7;" IS T HAT SATISFACTORY? PRESS Y (Yes) or N (No) " 200 IF INKEY$<>"" THEN GO TO 2 00 210 LET i$=INKEY$: IF i$="" THE N GO TO 210 220 IF i$="n" OR i$="N" THEN G O TO 1 !2.......^.........^.........^.........^.........^.........^.... Lines 170-220 Print the grid size, and ask if the size is suitable for the illustration you wish to copy on-screen. !0.......^.........^.........^.. 225 LET prop=175/tuy 230 LET escape=0: IF ux<=0 OR u y<=0 THEN LET escape=999 235 IF tux>=escape THEN LET es cape=INT (tux+10) 240 PRINT '" PLEASE REMEMB ER THIS NUMBER " ; BRIGHT 1;escape 250 PRINT " WHICH WILL RET URN YOU TO THE MENU" 255 LET escape=escape+xcor 260 PRINT AT 21,0;" PRESS ANY LETTER TO START" 265 IF INKEY$<>"" THEN GO TO 2 65 270 LET i$=INKEY$: IF i$="" THE N GO TO 270 280 CLS !2.......^.........^.........^.........^.........^.........^.... Lines 225-280 Evaluate and print the escape number. !0.......^.........^.........^.. 290 POKE 23658,8: GO SUB 70: PR INT AT 8,0;k$: INPUT "MENU INSTR UCTION LETTER? " 291 IF INKEY$<>"" THEN GO TO 2 91 293 LET m$=INKEY$: IF m$="" THE N GO TO 293 !2.......^.........^.........^.........^.........^.........^.... Lines 290-293 This routine marks the beginning of the main program. !0.......^.........^.........^.. 294 IF m$<>"W" AND m$<>"J" AND m$<>"R" AND m$<>"K" AND m$<>"D" AND m$<>"C" AND m$<>"S" AND m$<> "L" AND m$<>"P" AND m$<>"F" THEN GO TO 291 !2.......^.........^.........^.........^.........^.........^.... Line 294 Checks to see if the menu input is valid. !0.......^.........^.........^.. 296 GO SUB 60 297 IF m$="R" THEN GO TO 460 298 IF m$="J" THEN LET print=1 : GO TO 1010 300 IF m$="C" OR m$="c" THEN L ET cflag=1: PLOT OVER 1;cx,cy: LET x=cex: GO TO 1070 310 IF m$="D" THEN GO TO 1000 315 IF m$="K" THEN LET print=0 : GO TO 1010 320 IF m$="P" THEN COPY : GO T O 290 330 GO TO (CODE m$*10)+9000 !2.......^.........^.........^.........^.........^.........^.... Lines 296-330 Send the program to the relevant subroutine depending on which key you pressed. !0.......^.........^.........^.. 400 FOR i=1 TO LEN x$: IF CODE x$(i)<>46 AND CODE x$(i)<48 OR CODE x$>57 THEN LET x=ux-1: RET URN 405 NEXT i 410 LET x=VAL x$: RETURN 420 FOR i=1 TO LEN y$: IF CODE y$(i)<>46 AND CODE y$(i)<48 OR CODE y$>57 THEN LET y=uy-1: RET URN 425 NEXT i 430 LET y=VAL y$: RETURN 455 STOP 460 INPUT "ARE YOU SURE? Y or N ";i$: IF i$="Y" THEN RUN 470 GO TO 290 1000 REM PLOT ROUTINE 1010 INPUT "START POINT ACROSS=" ;x$: GO SUB 400: LET x=x-xcor: I F xtux AND x<>escape-xc or-xcor THEN BEEP 1,55: GO TO 1 010 1011 IF x=escape-xcor-xcor THEN GO TO 290 1012 INPUT "START POINT UPWARDS= ";y$: GO SUB 420: LET y=y-ycor: IF ytuy THEN BEEP 1,55 : GO TO 1011 1015 LET x=x*prop 1020 LET y=y*prop 1030 PLOT x,y: LET oldx=x: LET o ldy=y: GO SUB 80 1040 INPUT "NEXT POINT ACROSS "; x$: GO SUB 400: LET x=x-xcor: IF xtux AND x<>escape-xco r-xcor THEN BEEP 1,55: GO TO 10 40 1045 IF x=escape-xcor-xcor THEN GO TO 290 1046 INPUT "NEXT POINT UPWARDS " ;y$: GO SUB 420: LET y=y-ycor: I F ytuy THEN BEEP 1,55: GO TO 1046 1050 LET x=x*prop: LET x=x-oldx 1060 LET y=y*prop: LET y=y-oldy 1065 LET cx=oldx: LET cy=oldy 1066 LET cex=x 1070 DRAW OVER 1;x,y: LET oldx= PEEK 23677: LET oldy=PEEK 23678: IF cflag=1 THEN PLOT cx,cy: LE T oldx=cx: LET oldy=cy: LET cfla g=0: GO SUB 97: GO TO 1080 1071 GO SUB 90 1080 GO TO 1040 !2.......^.........^.........^.........^.........^.........^.... Lines 400-1080 Contain the subroutines for all the menu options. !0.......^.........^.........^.. 8000 LET k$="\H8b\H83\H83\H83\H83\H83\H83\H83\H83\H83\H83\H83\H83\H83\H83\H83\H83\H83\H83 \H83\H83\H83\H83\H83\H83\H83\H83\H83\H83\H83\H83\H87" 8010 LET k$=k$+"\H8a R = RESTART J = START LPRINT\H85" 8020 LET k$=k$+"\H8a P = COPY K = CANCEL LPRINT \H85" 8040 LET k$=k$+"\H8a C = CANCEL LAS T LINE DRAWN \H85" 8050 LET k$=k$+"\H8a S = SAVE THE P ICTURE TO TAPE \H85" 8060 LET k$=k$+"\H8a L = LOAD A PIC TURE FROM TAPE \H85" 8065 LET k$=k$+"\H8a D=DRAW W=WO RDS F=FINISH \H85" 8070 LET k$=k$+"\H8e\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c \H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8c\H8d" 8080 RETURN 9494 STOP 9495 INPUT i$: IF i$<>"KAMTIN" T HEN RUN 9496 STOP 9700 CLS : PRINT AT 10,0; PAPER 7; INK 2;" \H7f 1984 CHRIS SOMER VILLE ": PRINT AT 20,0;" PRESS R TO RESTART": PRINT " PRESS C TO CLEAR" 9710 IF INKEY$<>"" THEN GO TO 9 710 9720 LET i$=INKEY$: IF i$="" THE N GO TO 9720 9730 IF i$="C" THEN RANDOMIZE U SR 0 9740 RUN !2.......^.........^.........^.........^.........^.........^.... Lines 8000-9740 Print up the menu table on-screen requesting the option you want to use. !0.......^.........^.........^.. 9760 INPUT "PICTURE NAME ?";i$: IF LEN i$>10 THEN GO TO 9760 9770 LOAD i$SCREEN$ : GO TO 290 9830 INPUT "PICTURE NAME =";i$: IF LEN i$>10 THEN GO TO 9830 9840 SAVE i$SCREEN$ : GO TO 290 !2.......^.........^.........^.........^.........^.........^.... Lines 9760-9840 Contain the 'load' and 'save' routines. !0.......^.........^.........^.. 9870 INPUT "LINE(0-21)=";l$;"ROW (0-31)=";r$: FOR i=1 TO LEN r$: IF CODE r$(i)<48 OR CODE r$(i)>5 7 THEN BEEP .5,55: GO TO 9870 9871 NEXT i 9872 FOR i=1 TO LEN l$: IF CODE l$(i)<48 OR CODE l$(i)>57 THEN BEEP .5,55: GO TO 9870 9873 NEXT i 9874 LET r=VAL r$: LET l=VAL l$: IF l<0 OR l>21 OR r<0 OR r>31 T HEN BEEP 1,55: GO TO 9870 9875 INPUT "TEXT=";t$: PRINT OV ER 1;AT l,r;t$: INPUT "IS THAT O K Y? N?";i$: IF i$="N" THEN PRI NT OVER 1;AT l,r;t$: GO TO 9870 9878 GO TO 290 !2.......^.........^.........^.........^.........^.........^.... Lines 9870-9878 Provide the 'test printing' subroutine. !0.......^.........^.........^.. 9980 SAVE "D" LINE 1 9982 SAVE "D" LINE 1 9983 STOP !2.......^.........^.........^.........^.........^.........^.... Lines 9980-9983 Save two copies of the program. !0.......^.........^.........^.. !B \H11\H07\H10\H00 MENU OPTIONS !2.......^.........^.........^.........^.........^.........^.... KEY COMMENT C Pressing 'C' (the 'CORRECTION' key) simply deletes the previous drawing position. Thus, if you make a mistake, you can return to the menu, press 'C' and continue where you left off. D Once you press 'D' (the 'DRAW' key) you'll be asked to provide the coordinates of the starting position, and of each subsequent position you want to draw a line to. It's rather like those 'join the dots' mystery pictures in childrens' books, only in this case you're specifying where each dot is to go and the Spectrum's connecting them together. It's unlikely that all the points you'll want to draw to will fall conveniently on your grid lines, but the program will happily accept positions like X=1222.5, Y=16.8. At this point, it's worth making a note that when you're planning the initial grid of squares, the finer your grid the more detail you can introduce to the final on-screen drawing. On the other hand, if all you're after is a broad outline, then a relatively small number of large squares should suffice. Once you reach the end of a line and want to move on to a new starting position, simply type in the escape number and return to the menu to start over. (Unlike the normal Spectrum DRAW procedure, there's no calculation involved - you read off the coordinates for each point that's connected on the original drawing and it'll be reproduced to the scale you want.) F Press this key when you want to stop using the program. J/K These two keys are used to activate ('J') or cancel ('K') the instruction to print out coordinates to the printer. L This command loads back a previously saved picture. If you're planning to load back a partially finished picture, you'll have to enter the original coordinates applicable before you can continue drawing. P The 'P' key allows you to print the picture on-screen to the ZX Printer (or any other printer that accepts the COPY command). R This key is used to restart the program once you've finished with one drawing and want to start on another. S Making use of the SAVE SCREEN$ function, the 'S' key saves the screen picture to cassette. W The 'W' key allows you to print a text label at any speci- fied position on the screen. This function uses the screen PRINT AT positions for line (0 to 21) and row (0 to 31). !1.......^.........^.........^.........^........ !B -- from Your Spectrum #11 (Feb.1985) -- !$