Des motifs de toutes les couleurs
GW-Basic, utilisé par PC-Basic
Programme avec Graphique et Texte
L'instruction PAINT ne se
limite pas à remplir une forme fermée d'une couleur unie : on peut également
utiliser PAINT pour « paver » l'écran. Cependant, le pavage PAINT n'est ni
particulièrement intuitif ni facile à mettre en œuvre ; il faut penser et
dessiner en binaire.
Prenons une grille de huit cases sur huit et
imaginons que chacune de ses 64 cellules contienne un 0 ou un 1.
Par exemple :
Bien sûr, chaque cellule représente un bit. La grille comporte donc 64 bits. Il est également utile d'examiner chaque ligne séparément.
Chaque ligne contient huit bits, et huit bits équivalent à un octet. La grille a donc une largeur d'un octet.
Un masque de tuile, que l'instruction PAINT peut interpréter puis remplir à l'intérieur d'un objet fermé, est similaire à la grille ci-dessus : une largeur d'un octet et une longueur maximale de huit bits.
Mais voici le problème : chaque ligne du masque de tuile doit être convertie d'un nombre binaire en nombre décimal (ou, plus communément, hexadécimal), puis utilisée comme argument d'une fonction CHR$.
Plusieurs lignes (jusqu'à huit par masque de tuile) nécessitent l'enchaînement de plusieurs fonctions CHR$.
Par exemple, pour PAINT avec le motif de la grille ci-dessus, nous devons trouver le nombre décimal des chiffres binaires correspondants de chaque ligne.
Rappelons que, dans notre section sur le programme BASE.BAS (Convertisseur de base), la conversion de la base 2 en base 10 nécessite l'utilisation de puissances de deux.
Pour la ligne 0, qui est 111100002, nous obtenons :
1*27 + 1*26 + 1*25 + 1*24 + 0*23 + 0*22 + 0*21 + 0*20 = 240
Ainsi, pour utiliser l'instruction PAINT pour remplir un objet fermé uniquement avec la première ligne du masque de tuiles de la page précédente, nous devons taper ce qui suit :
PAINT(X,Y),CHR$(240),C
Où X et Y sont les coordonnées de départ du remplissage et C la couleur de la bordure de l'objet.
La deuxième ligne de notre masque de mosaïque, Ligne 1, est le nombre binaire 111111112 ; converti en décimal, Ligne 1 est 255.
Si nous voulions que notre instruction PAINT utilise les deux premières lignes du masque de mosaïque pour remplir un objet fermé, la syntaxe GW-BASIC serait :
PAINT(X,Y),CHR$(240)+CHR$(255),C
Chaque fonction CHR$ ajoutée à l'argument permet de reproduire à l'écran une ligne supplémentaire du masque de mosaïque grâce à PAINT ; l'ensemble des fonctions CHR$ est appelé chaîne de mosaïque.
Notez que les arguments de CHR$ peuvent également être exprimés en hexadécimal ; en fait, la convention pour le pavage de masques est l'hexadécimal, car il est relativement simple de convertir des octets en hexadécimal en transformant individuellement chaque octet en groupes de quatre bits : l'octet de poids faible et l'octet de poids fort.
Pour exprimer des nombres en hexadécimal en GW-BASIC, ils doivent commencer par &H.
La complexité de la génération d'un masque de mosaïque exige une certaine automatisation. PATTERN.BAS, présenté ci-dessous, répond parfaitement à ce besoin.
À l'aide du pavé numérique et de la barre d'espace, vous dessinez votre masque de mosaïque. Appuyez sur la touche Échap pour révéler la beauté, ou plutôt l'absence de beauté, de votre motif.
Ainsi, si vous avez exécuté le programme et expérimenté différents modèles, vous constaterez rapidement que les masques de mosaïque ne sont pas toujours ce qu'ils paraissent au premier abord ; ils sont particulièrement capricieux, changeant parfois de couleur sans raison apparente, tandis que d'autres fois, ils ne se reproduisent même pas correctement.
Cependant, il existe un certain nombre de règles et d'exceptions au pavage de peinture qui dépassent le cadre de cette section (et je manquerais de préciser que les masques de mosaïque peuvent également être utilisés par l'instruction LINE).
PATTERN.BAS
10 KEY OFF:SCREEN 7:COLOR
15,0:CLS
20 FOR A=80 TO 120 STEP 5
30 LINE (40,A)-(80,A),7
40 NEXT A
50 FOR B=40 TO 80 STEP 5
60 LINE (B,80)-(B,120),7
70 NEXT B
110
X=40:Y=80:C=15
115 XX=10:YY=10:DIM ROW(7)
150 LOCATE 7,6:PRINT"Press <SPACE>
to color cell"
170 LOCATE 9,6:PRINT"Press <ESC> to quit"
180 LOCATE
8,6:PRINT"Use numeric keypad to move cursor"
200 I$=INKEY$
210 LINE (X,Y)-(X+5,Y),C:LINE
(X+5,Y)-(X+5,Y+5),C:LINE (X+5,Y+5)-(X,Y+5),C:LINE (X,Y+5)-(X,Y),C
215 FOR
PAUSE=1 TO 200:NEXT PAUSE
220 LINE (X,Y)-(X+5,Y),7:LINE
(X+5,y)-(X+5,Y+5),7:LINE (X+5,Y+5)-(X,Y+5),7:LINE (X,Y+5)-(X,Y),7
370 IF
I$=" " THEN GOSUB 1000
400 IF I$="4" THEN X=X-5:XX=XX-1
410 IF I$="6"
THEN X=X+5:XX=XX+1
420 IF I$="8" THEN Y=Y-5:YY=YY-1
430 IF I$="2" THEN
Y=Y+5:YY=YY+1
440 IF Y<80 THEN Y=80:YY=YY+1
450 IF Y>115 THEN
Y=115:YY=YY-1
460 IF X<40 THEN X=40:XX=XX+1
470 IF X>75 THEN
X=75:XX=XX-1
990 IF I$=CHR$(27) THEN GOTO 1100
999 GOTO 200
1000 'Fill
in the cell
1010 LINE(X,Y)-(X+5,Y),C:LINE (X+5,Y)-(X+5,Y+5),C:LINE
(X+5,Y+5)-(X,Y+5),C:LINE (X,Y+5)-(X,Y),C :PAINT(X+1,Y+1),C,C
1020 PSET(XX,YY),C
1021 'Get CHR$ codes, row by row, by converting binary to decimal
1022
INDEX=0:POWER=0:FOR LOOP=0 TO 7:ROW(LOOP)=0:NEXT LOOP
1023 FOR B=10 TO 17
STEP 1
1024 FOR A=17 TO 10 STEP -1
1025 IF POINT(A,B)=15 THEN ROW(INDEX)=ROW(INDEX)+2^POWER
1026 POWER=POWER+1:NEXT A
1027 POWER=0:INDEX=INDEX+1
1028 NEXT B
1029
T$="":LOCATE 20,1:PRINT"Codes:";
1030 FOR LOOP=0 TO 7
1032 PRINT ROW(LOOP);
1034 NEXT LOOP
1040 RETURN
1100 CLS
1150 CIRCLE(100,100),100,15
1200 PAINT(100,100),CHR$(ROW(0))+CHR$(ROW(1))+CHR$(ROW(2))+CHR$(ROW(3))+CHR$(ROW(4))+CHR$(ROW(5))+CHR$(R0W(6))+CHR$(ROW(7)),15
1205 CIRCLE(100,100),100,15
1220 PRINT"Codes:";
1230 FOR LOOP=0 TO 7
1240 PRINT ROW(LOOP);
1250 NEXT LOOP
1260 FOR PAUSE=1 TO 25000:NEXT
PAUSE
1270 END