Wire Frame Graphics Plotter Enhanced – Amstrad CPC – Locomotive Basic

Publisher: Amstrad Computer User – Numero: 01 – Agosto/Settembre 1984 – Recupero codice: Francesco Fiorentini – Modifica del codice: Francesco Fiorentini

Come anticipato nell’articolo di Dicembre, ecco la versione modificata del programma ‘digitato’ dalla 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.

Il codice che trovate qua sotto é la mia personale modifica di un programma giá incredibile di suo. Ho pensato che, aggiungendo la visualizzazione delle coordinate, avrei reso piú semplice il disegno della sezione trasversale soprattutto per quanto riguarda la possibilitá di chiudere correttamente la figura tridimensionale senza lasciare ‘buchi’ al centro.
Ho proseguito la personalizzazione aggiungendo la possibilitá di esportare le coordinate della sezione iniziale (comando S per SAVE) e ricaricarle (comando L per LOAD) per poi tracciare il wireframe 3D. In questo modo é possibile salvare i lavori e condividerli con altri.
Le coordinate verranno salvate in formato testo (.ASC) sul disco; assicuratevi di aver inserito un dischetto nel computer o, come nel mio caso, nell’emulatore. 🙂

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.

Titolo: Wire Frame Graphics Plotter
Piattaforma: Amstrad CPC
Linguaggio: Locomotive Basic
Versione originale: David Robinson
Pubblicazione: Amstrad Computer User – 01 Agosto/Settembre 1984
Recupero codiceFrancesco Fiorentini
Modifica del codice: Francesco Fiorentini
Anno: 2023
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.
S per Salvare le ccoordinate di un disegno
L per caricare le coordinate di un disegno salvato e avviarne la rappresentazione 3D
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.

Attenzione – Ci siamo resi conto che nel listato i caratteri ‘>’ e ‘<‘ potrebbero venir sostituiti dai rispettivi encoding html ‘&gt’ e ‘&lt’. 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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
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: WINDOW#2,33,40,8,12: WINDOW#3,2,8,8,12
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."
181 PRINT "Press Q to exit Design Mode"
182 PRINT "Press S/L to Save/Load image data"
185 PRINT #2, " MENU "
186 PRINT #2, "------"
187 PRINT #2, "S-SAVE"
188 PRINT #2, "L-LOAD"
189 PRINT #2, "Q-QUIT"
200 PLOT dx%,dy%,1
205 LOCATE #3,2,2:PRINT #3,"x="+STR$(dx%)
206 LOCATE #3,2,3:PRINT #3, "y="+STR$(dy%)
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$)
231 IF z$="S" THEN z$=LOWER$(z$)
231 IF z$="L" 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)-7*(x%=115)-8*(x%=108)
250 ON z% GOTO 620,690,760,830,900,1020,1200,1400
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
1200 REM ******************************
1201 REM * SAVE IMAGE DATA
1202 REM ******************************
1205 INPUT "ENTER IMAGE NAME ";in$
1220 OPENOUT in$+".asc"
1230 FOR t%=1 TO Point%
1240 dt$=STR$(x%(t%,1)) + "," + STR$(y%(t%,1)) + "," + STR$(z%(t%,1))
1260 WRITE #9, dt$
1290 NEXT
1300 CLOSEOUT
1310 PRINT in$+" image saved to disk!"
1320 GOTO 200
1400 REM ******************************
1401 REM * LOAD IMAGE DATA
1402 REM ******************************
1405 INPUT "ENTER IMAGE NAME ";in$
1410 OPENIN in$+".asc"
1415 Point%=0
1420 WHILE NOT EOF
1425 Point%=Point%+1
1430 LINE INPUT#9,a$
1432 a$=MID$(a$, 2, len(a$)-2)
1440 p=INSTR(a$,",")
1445 x%(Point%,1)=VAL(LEFT$(a$,p-1))
1450 a$=mid$(a$,p+1)
1460 p=INSTR(a$,",")
1465 y%(Point%,1)=VAL(LEFT$(a$,p))
1470 a$=mid$(a$,p+1)
1475 z%(Point%,1)=VAL(a$)
1500 WEND
1510 CLOSEIN
1520 GOTO 1020

Share

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.