Rotation et mise à l'échelle à l'aide de DRAW
GW-Basic, utilisé par PC-Basic
Programme avec Graphique et Texte
Bien que les calculs trigonométriques en force brute puissent vous aider à faire pivoter des images à l'écran ainsi qu'à les redimensionner (à l'aide de matrices de rotation), GW-BASIC propose des commandes DRAW simples pour effectuer des rotations (utilisez TA ou une rotation à un angle ; par exemple, TA45 fait pivoter l'image de 45 degrés) et des redimensionnements (utilisez S ou définissez un facteur d'échelle ; par exemple, S10 définit un facteur d'échelle de 10. Ce facteur peut être compris entre 1 et 255).
Examinons quelques programmes.
Le premier programme ci-dessous, appelé SPIN.BAS, utilise la commande TA pour faire tourner une ligne jaune autour du centre de l'écran.
Ce programme présente cependant un inconvénient majeur : comme la commande DRAW est une chaîne (encadrée entre guillemets) et que TA doit y résider, il semble impossible d'intégrer une boucle FOR/NEXT et une variable autour de la commande de rotation pour l'automatiser.
Devez-vous vraiment taper une nouvelle instruction DRAW pour chaque rotation et, par extension, pour chaque modification du facteur d’échelle ?
Heureusement, ce n'est pas le cas.
Mais vous devrez utiliser la fonction VARPTR$.
Étudiez attentivement le code des programmes SE1.BAS et SE2.BAS.
SE1.BAS est une démonstration de rotation uniquement ; un logo SE BOOKS (l'éditeur de ce livre) est tourné et centré à l'écran.
SE2.BAS joue avec la rotation et la mise à l'échelle, tandis que les lettres S
et E disparaissent de votre écran pour réapparaître rapidement.
AIRPLANE.BAS
est exactement cela : une vue à la troisième personne de l'arrière d'un avion.
En appuyant sur 4 ou 6 sur le pavé numérique, vous faites « tourner » l'avion
(l'horizon tourne, donnant l'impression que l'avion s'incline).
Enfin,
exécutez SROB.BAS pour découvrir un programme qui exploite à la fois la mise à
l'échelle et la rotation. Une boîte rotative vole d'un bout à l'autre de
l'écran, augmentant légèrement de taille à chaque fois qu'elle rebondit sur les
côtés gauche et droit de l'écran.
Les commandes TA et S, associées à VARPTR$, simplifient et facilitent la rotation et la mise à l'échelle des images. Cependant, la création d'images en GW-BASIC est déjà très complexe ; tracer des graphiques sur du papier millimétré est au mieux fastidieux, au pire pénible. Vous avez peut-être déjà pensé à une meilleure solution ; sinon, restez connectés.
SPIN.BAS
10 KEY OFF:SCREEN 7
20 COLOR
14:CLS
30 DRAW"TA10 R40"
31 FOR H=1 TO 400:NEXT:CLS
40 DRAW"TA20 R40"
41 FOR H=1 TO 400:NEXT:CLS
50 DRAW"TA30 R40"
51 FOR H=1 TO 400:NEXT:CLS
60 DRAW"TA50 R40"
61 FOR H=1 TO 400:NEXT:CLS
70 DRAW"TA60 R40H
71 FOR
H=1 TO 400:NEXT:CLS
80 DRAW"TA70 R40"
81 FOR B=1 TO 400:NEXT:CLS
90
DRAW"TA90 R40":FOR V=1 TO 400:NEXT :CLS
91 DRAW"TA110 R40":FOR V=1 TO
400:NEXT:CLS
92 DRAW"TA140 R40":FOR V=1 TO 400: NEXT :CLS
93 DRAW"TA160
R40":FOR V=1 TO 400:NEXT :CLS
100 DRAW"TA180 R40"
105 FOR K=1 TO
400:NEXT:CLS
110 DRAW"TA200 R40"
115 FOR K=1 TO 400:NEXT:CLS
120
DRAW"TA210 R40"
125 FOR K=1 TO 400:NEXT:CLS
130 DRAW"TA230 R40"
135 FOR
K=1 TO 400:NEXT:CLS
140 DRAW"TA250 R40"
145 FOR K=1 TO 400:NEXT:CLS
150
DRAW"TA280 R40"
155 FOR K=1 TO 400:NEXT:CLS
160 DRAW"TA310 R40"
165 FOR
K=1 TO 400:NEXT:CLS
170 DRAW"TA330 R40"
175 FOR K=1 TO 400:NEXT:CLS
180
DRAW"TA350 R40"
185 FOR K=1 TO 400:NEXT:CLS
190 DRAW"TA360 R40"
195 FOR
K=1 TO 400:NEXT:CLS
200 GOTO 20
SE1.BAS
10 KEY OFF:SCREEN 7:COLOR
15,1:015:FOR V=1 TO 14000:NEXT
20 PSET(150,96)
30 FOR HI=0 TO 350 STEP
10
40 DRAW"TA="+VARPTR$(HI)
41 DRAW"S02"
50 DRAW"L30 G10 R30 E10 G10
L30 D20 E10 U10 D10 R30 G10 L30 E10 R30 D20 G10 U20 E10 D20"
51 DRAW"G10 L30
E10 R20 D10"
52 FOR V=1 TO 400:NEXT V:CLS
53 NEXT HI
54 DRAW"TA360 S02
L30 G10 R30 E10 G10 L30 D20 E10 U10 D10 R30 G10 L30 E10 R30 D20 G10 U20 E10 D20"
55 DRAW"G10 L30 E10 R20 D10"
56 FOR H=1 TO 19000:NEXT H
61 FOR X=95 TO 45
STEP -1.5
62 PSET(160,X+5)
70 DRAW"TA360 S02 L30 G10 R30 E10 G10 L30 D20
E10 U10 D10 R30 G10 L30 E10 R30 D20 G10 U20 E10 D20"
80 DRAW"G10 L30 E10 R20
D10"
81 FOR J=1 TO 400:NEXT J:CLS
85 NEXT X
90 PSET(160,X+5):DRAW"TA360
S02 L30 G10 R30 E10 G10 L30 D20 E10 U10 D10 R30 G10 L30 E10 R30 D20 G10 U20 E10
D20"
95 DRAW"G10 L30 E10 R20 D10"
100 FOR B=1 TO 10000:NEXT B
110 FOR
YI=2 TO 9 STEP 1
120 DRAW"S="+VARPTR$(YI)
130 PSET(160,X+5)
140
DRAW"TA360 L30 G10 R30 E10 G10 L30 D20 E19 U10 D10 R30 G10 L30 E10 R30 D20 G16
U20 E10 D20"
150 DRAW"G10 L30 E10 R20 D10"
160 FOR H=1 TO 1000:NEXT
H:CLS:NEXT YI
165 PSET(160,X+5)
170 DRAW"S10 TA360 L30 G10 R30 E10 G10
L30 D20 E10 U10 D10 R30 G10 L30 E10 R30 D20 G10 U20 E10 D20"
180 DRAW"G10 L30
E10 R20 D10"
190 FOR B=1 TO 10000:NEXT B
200 PSET(170,76):DRAW"R10 L10 D5
R5 L5 D5 R10
210 FOR H=9 TO 1 STEP -1:COLOR ,H:NEXT H
250 FOR A=1 TO
23000:NEXT A:CLS
SE2.BAS
10 T=0:KEY OFF:SCREEN 7:COLOR
15,4:CLS:FOR L=1 TO 16000:NEXT
15 FOR GI=60 TO 1 STEP -1:T=T+4
16 DRAW"S="+VARPTR$(GI)
17 DRAW"TA="+VARPTR$(T)
20 DRAW"U10 R10 L10 D10 R10 D10 L10
25 FOR H=1 TO
200:NEXT H:CLS
30 NEXT GI:T=0:FOR Y=1 TO 5000:NEXT Y
40 FOR UI=60 TO 1
STEP -1:T=T+4
50 DRAW"S="+VARPTR$(UI)
68 DRAW"TA="+VARPTR$(T)
70
DRAW"U10 R10 L10 D10 R5 L5 D10 R10
80 FOR H=1 TO 200:NEXT H:CLS
90 NEXT
UI:FOR H=1 TO 5000:NEXT H
100 FOR FI=1 TO 60 STEP 4
110 DRAW"S="+VARPTR$(FI)
120 DRAW"U10 R10 L10 D10 R10 D10 L10
130 FOR H=1 TO 200:NEXT H:CLS
140
NEXT FI
150 CLS:FOR H=1 TO 5000:NEXT H
160 FOR DI=1 TO 60 STEP 4
170
DRAW"S="+VARPTR$(DI)
180 DRAW"U10 R10 L10 D10 R5 L5 D10 R10
190 FOR H=1 TO
200:NEXT H:CLS
200 NEXT DI
240 FOR X=1 TO 16000:NEXT X:CLS
AIRPLANE.BAS
10 KEY OFF:SCREEN 7:COLOR
2,2:CLS:COLOR 14
11 INPUT"Airplane Color:";COL
12 INPUT"Stripe Color:";STCOL:COLOR
1,1:CLS:COLOR 14
13 INPUT"Size of plane(l-10)";SI:CLS
14 DRAW"S="+VARPTR$(SI)
20 CIRCLE(150,100),3.5,COL
30 PAINT(150,100),7,COL
40
PSET(150,97),COL:DRAW"U15
50 PSET(149,96),STCOL:DRAW"U10
60
PSET(151,96),STCOL:DRAW"U10
70 PSET(154,102),COL:DRAW"R20 D1
80
PSET(152,103),7:DRAW"R21
90 PSET(146,102),COL:DRAW"L20 D1
100
PSET(148,103),J:DRAW"L21
110 PSET(154,99),COL:DRAW"R30 D1
120
PSET(155,100),7:DRAW"R28
130 PSET(146,9),COL:DRAW"L30 D1
140
PSET(145,100),7:DRAW"L28
170 COLOR 3:CIRCLE(80,30),30,,,, .2
180
PAINT(80,30),15,3
190 CIRCLE(160,40),20,,,,.2:PAINT(160,40),15,3
200
CIRCLE(250,30),40,,,,.1:PAINT(250,30),15,3:X=0
210 I$=INKEY$
220
PSET(150,150),2:DRAW"TA="+VARPTR$(X):DRAW"S3 R320 L640
236 IF I$="" THEN 210
237 PSET(150,150),2:DRAW"S3 R320 L640
238 PSET(150,150),1:DRAW"S3 R320 L640
240 IF I$="4" THEN X=X+4
250 IF I$="6" THEN X=X-4
260 IF X>25 THEN
X=X-4
261 IF ASC(I$)=27 THEN END
270 IF X<-25 THEN X=X+4
280 GOTO 210
SROB.BAS
10 T=1:SCREEN 7:KEY OFF:COLOR
15,1
20 CLS
30 T=T+1:FOR GI=290 TO 0 STEP -5
35 PSET(GI,100)
40
DRAW"TA="+VARPTR$(GI)
45 DRAW"S="+VARPTR$(T)
50 DRAW"U10 R10 D10 L10
60
FOR L=1 TO 400:NEXT L:CLS
70 NEXT GI:SOUND 100,1:T=T+1
80 FOR CI=8 TO 290
STEP 5
90 PSET(CI,100)
100 DRAW"TA="+VARPTR$(CI)
105 DRAW"S="+VARPTR$(T)
110 DRAW"U10 R10 D10 L10
120 FOR K=1 TO 400:NEXT K:CLS
130 NEXT CI:SOUND
180,1:T=T+1
140 GOTO 20