Publisher: Amstrad Computer User – Numero: 01 – Agosto/Settembre 1984 – Recupero codice: Francesco Fiorentini
Come anticipato nell’articolo precedente ecco un altro programma ‘digitato’ dalla fantastica rivista Amstrad Computer User Numero 01 di Agosto/Settembre 1984.
David Robinson ci propone un interessante CAD per principianti scritto direttamente in Locomotive Basic. Sono sicuro che, come me, rimarrete a bocca aperta per la facilitá con cui il Basic dell’Amstrad sia in grado di generare le complesse immagini 3D a partire da una sezione bidimensionale.
Questo programma di disegno 3D traduce una sezione trasversale bidimensionale in una forma 3D completa. Per avere un’idea di come funziona, guardate la Figura 1a che mostra la metà destra della sezione trasversale di un bicchiere di vino. La metà sinistra è, ovviamente, una semplice immagine speculare, quindi il programma non richiede di disegnare entrambe le metà. La Figura 1b mostra la proiezione 3D disegnata dal computer a partire dalla sezione trasversale.
Il codice che trovate qua sotto é il listato originale come pubblicato nella rivista, ma questo programma aveva destato tutto il mio interesse ed ho voluto apportare delle modifiche per aggiungere alcune funzionalitá. Pubblicheró la versione ‘enhanced’ al piú presto, ma nel frattempo volevo pubblicare la versione originale per metterla a disposizione di tutti.
Restate sintonizzati su questi canali!
Titolo: Wire Frame Graphics Plotter
Piattaforma: Amstrad CPC
Linguaggio: Locomotive Basic
Versione originale: David Robinson
Pubblicazione: Amstrad Computer User – 01 Agosto/Settembre 1984
Recupero codice: Francesco Fiorentini
Anno: 2023
Download: cad_original.dsk
Note: Emulatore suggerito, WinAPE.
Istruzioni
Disegnate la sezione bidimensionale nell’editor 2D. Premete Q per uscire dall’editor 2D. dopodiché indicate il numero di facce che volete ripetere nell’asse Z ed attendete che il programma disegni il grafico 3D.
Tasti:
Tasti cursore o joystick per muovere il cursore nella fase di editing.
Fuoco o Enter per settare un punto.
Q per uscire dall’editor 2D.
Qui di seguito trovate il codice da copiare sul vostro Amstrad CPC.
Potete copiare il listato ed incollarlo su un emulatore come WinAPE.
Se volete provare subito Wire Frame Graphics Plotter, scaricate il file cad_original.dsk dal nostro sito che puó essere aperto con WinAPE. Dentro al file cad_original.dsk é presente il programma cad.bas.
Attenzione – Ci siamo resi conto che nel listato i caratteri ‘>’ e ‘<‘ potrebbero venir sostituiti dai rispettivi encoding html ‘>’ e ‘<’. Nel caso, sostituite questi valori nel listato prima di copiarlo sull’emulatore.
Listato: Wire Frame Graphics Plotter – Amstrad CPC – Locomotive Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 10 REM *********************************
20 REM *********************************
30 REM ** WIRE FRAME GRAPHICS PLOTTER **
40 REM *********************************
50 REM *********************************
60 MODE 1
70 LOCATE 10,12: PRINT " Press SPACE B A R to start"
80 IF INKEY$<>" " THEN 80
90 WINDOW#0,1,40,1,4: WINDOW#1,1,40,24,24
100 RAD
110 maxi%=20 : DIM x%(maxi%,50) : DIM y%(maxi%,50) : DIM z%(maxi%,50)
120 dx%=320: dy%=0: i0%=26: i1%=0: i2%=13: i3%=6 :Point%=0
130 REM ********************************
140 REM * GET PICTURE DATA
150 REM ********************************
160 CLS: CLS#1: CLG: BORDER i2%: INK 0,i0% : PAPER 0 : INK 1,i1% : PEN 1
170 PLOT 156,0 : DRAW 156,304 : DRAW 494,304 : DRAW 494,0
180 PRINT "USE CURSOR KEYS OR JOYSTICK TO MOVE DOT" : PRINT "PRESS ENTER OR FIRE TO SET A POINT."
190 PRINT "Press Q to QUIT entering mode."
200 PLOT dx%,dy%,1
210 z%=-1*(JOY(0)=1)-2*(JOY(0)=2)-3*(JOY(0)=4)-4*(JOY(0)=8)-5*(JOY(0)=16): IF z%>0 THEN 250
220 z$=INKEY$ : IF z$="" THEN 210
230 IF z$="Q" THEN z$=LOWER$(z$)
240 x%=ASC(z$): z%=-1*(x%=240)-2*(x%=241)-3*(x%=242)-4*(x%=243)-5*(x%=13)-6*(x%=113)
250 ON z% GOTO 620,690,760,830,900,1020
260 GOTO 210
270 REM ********************************
280 REM * DRAW PICTURE
290 REM ********************************
300 CLG
310 FOR l%=1 TO f%-1
320 FOR k%=1 TO Point%-1
330 PLOT 320+x%(k%,l%),80+y%(k%,l%)-0.5*z%(k%,l%)
340 xc%=(x%(k%,l%+1))-(x%(k%,l%)) : yc%=(y%(k%,l%+1)-0.5*z%(k%,l%+1))-(y%(k%,l%)-0.5*z%(k%,l%)): DRAWR xc%,yc%
350 xc=(x%(k%+1,l%+1))-(x%(k%,l%+1)): yc=(y%(k%+1,l%+1)-0.5*z%(k%+1,l%+1))-(y%(k%,l%+1)-0.5*z%(k%,l%+1)): DRAWR xc,yc
360 NEXT : NEXT
370 FOR l%= 1 TO Point%-1
380 MOVE 320+x%(l%,f%),80+y%(l%,f%)-0.5*z%(l%,f%)
390 xc%=x%(l%,1)-x%(l%,f%): yc%=(y%(l%,1)-0.5*z%(l%,1))-(y%(l%,f%)-0.5*z%(l%,f%))
400 DRAWR xc%,yc%
410 xc%=x%(l%+1,1)-x%(l%,1): yc%=y%(l%+1,1)-0.5*z%(l%+1,1)-y%(l%,1)-0.5*z%(l%,1)
420 DRAWR xc%,yc%
430 NEXT
440 REM ********************************
450 REM * DRAW ANOTHER ?
460 REM ********************************
470 CLS#1
480 PRINT#1, "DO YOU WANT TO DRAW ANOTHER PICTURE?"
490 IF INKEY(43)=0 THEN 120
500 IF INKEY(46)=0 THEN 520
510 GOTO 490
520 MODE 1
530 END
540 REM ******************************
550 REM ******************************
560 REM ** END OF MAIN PROGRAM **
570 REM ******************************
580 REM ******************************
590 REM
600 REM
610 REM
620 REM ******************************
630 REM * MOVE UP
640 REM ******************************
650 yp%=dy%: dy%=dy%+2
660 IF dy%>300 THEN dy%=300
670 PLOT dx%,yp%,0
680 GOTO 200
690 REM *****************************1
700 REM * MOVE DOWN
710 REM ******************************
720 yp%=dy%: dy%=dy%-2
730 IF dy%<0 THEN dy%=0
740 PLOT dx%,yp%,0
750 GOTO 200
760 REM ******************************
770 REM * MOVE LEFT
780 REM ******************************
790 px%=dx%: dx%=dx%-2
800 IF dx%<160 THEN dx%=160
810 PLOT px%,dy%,0
820 GOTO 200
830 REM ******************************
840 REM * MOVE RIGHT
850 REM ******************************
860 px%=dx%: dx%=dx%+2
870 IF dx%>490 THEN dx%=490
880 PLOT px%,dy%,0
890 GOTO 200
900 REM ******************************
910 REM * SET POINT
920 REM ******************************
930 Point%=Point%+1
940 x%(Point%,1)=dx%-320
950 y%(Point%,1)=dy%
960 z%(Point%,1)=0
970 IF Point%>1 THEN PLOT x%(Point%-1,1)+320, y%(Point%-1,1): DRAW x%(Point%,1)+320,y%(Point%, 1),1
980 IF Point%=maxi% THEN 1020
990 IF JOY(0)<>0 THEN 990
1000 IF INKEY$<>"" THEN 1000
1010 GOTO 200
1020 REM ******************************
1030 REM * END INPUT
1040 REM ******************************
1050 CLS
1060 INPUT "ENTER NUMBER OF FACES ";f%
1070 IF f%>50 OR f%<4 THEN 1050
1080 CLS: PRINT "PLEASE WAIT - COMPUTING POINTS MATRIX"
1090 sn=SIN(PI/(f%/2)) :cs=COS(PI/(f%/2))
1100 FOR l%=2 TO f%
1110 FOR k%=1 TO Point%
1120 x%(k%,l%)=x%(k%,l%-1)*cs-z%(k%,l%-1)*sn
1130 y%(k%,l%)=y%(k%,l%-1)
1140 z%(k%,l%)=z%(k%,l%-1)*cs+x%(k%,l%-1)*sn
1150 NEXT
1160 NEXT
1170 GOTO 270