[TUTO][AXE] la façon la plus rapide de dessiner des pixels
Posted: 22 Oct 2012, 23:03
Vous vous êtes souvent demandé comment dessiner des pixels d'une façon particulièrement rapide Voici la solution :
On sait que l’écran est composé de 96x64 pixels c'est-à-dire qu'il est partagé en 64 lignes de 12 octets chacun ( car un octet est égal à 8 bits et 8x12=96 )
Nous allons donc nous en servir
Pour cette technique, nous allons récupérer le numéro de l'octet en fonction des coordonnées (X,Y) du pixel que l'on veut dessiner.
On sait que l’écran est composé de 96x64 pixels c'est-à-dire qu'il est partagé en 64 lignes de 12 octets chacun ( car un octet est égal à 8 bits et 8x12=96 )
Nous allons donc nous en servir
Pour cette technique, nous allons récupérer le numéro de l'octet en fonction des coordonnées (X,Y) du pixel que l'on veut dessiner.
- On sait qu'une ligne fait 12 octets de long donc Yx12 donnera le premier octet de la ligne Y. Si on y ajoute ensuite X/8, on obtient l'octet codant le point de coordonnées (X,Y).
On a donc le code :- Code: Select all
:(Yx12)+(X/8)+L6->P
(on stocke le résultat obtenu dans la variable P. ) - Il faut maintenant trouver le numéro du bit à allumer parmi les 8 bits de cet octet, et là, rien de plus simple : il suffit d'écrire :
- Code: Select all
{X^8+GDB0}
mais d'où vient ce GDB0 ??? .
C'est en faite le numéro du bit à dessiner contenu dans une chaîne hexadécimale qui est celle-ci :- Code: Select all
:[80402010080040201]->GDB0
Cette chaîne s'explique facilement car en binaire elle donne :- Code: Select all
-10000000
-01000000
-00100000
-00010000
-00001000
-00000100
-00000010
-00000001
- Maintenant, il suffit d’allumer le pixel correspondant en ajoutant ( fonction "or" ) la place de l'octet (stockée dans P) et le numéro du bit à allumer dans l'octet correspondant et de faire un petit "Dispgraph" :
- Code: Select all
:.TEST
:[8040201008040201]->GDB0
:Clrdraw
:0->A
:0->B
:B*12+(A/8)+L6->P
:{A^8+GDB0} or {P}->{P}
:Repeat Getkey
:Dispgraph
:End
Et en version optimisée :Show/Hide spoilerAfficher/Masquer le spoiler
- Code: Select all
:.TEST
:[8040201008040201]->GDB0
:Clrdraw
:0->A->B
:{A^8+GDB0} or {B*2*2*3+(A/2/2/2)+L6->r2}->{r2}
:While 1
:Dispgraph
:EndIf Getkey