Rotation et mise à l'échelle à l'aide de DRAW

GW-Basic, utilisé par PC-Basic

Programme avec Graphique et Texte

PC-BASIC

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