Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : AMOS - Tourneur d'images
(Article écrit par Denis Bernard et extrait d'Amiga News - juin 1994)
|
|
Tourneur d'images
Quelle idée j'ai eue le mois dernier
de vous parler de reproduire le mouvement d'une voiture ! En effet, en vue de
dessus, pour obtenir quelque chose qui tienne la route, il faut avoir le dessin de
ladite voiture dans 32 positions en rotation... Qui va s'amuser à faire tous ces dessins,
juste pour voir comment faire bouger une voiture ?
Pour les nostalgiques du début de la micro, les vétérans des pages entières de données,
j'aurais effectivement pu remplir une pleine page de données pour le dessin de la voiture,
mais il faut penser aux autres ! Et puis après tout, n'est-ce pas le rôle de l'ordinateur
de faire le boulot à notre place ? Laissez-le faire et il vous tracera bien gentiment
votre dessin dans toutes les positions.
Allez, prenez donc votre plus bel éditeur de sprites et contentez-vous de dessiner votre
bolide vu de dessus, le capot vers le haut. Ne vous compliquez pas la vie : un vague rectangle
pour la carrosserie, flanqué de quatre petits rectangles gris (ou noirs) pour les roues feront
largement l'affaire. Vous pouvez même pousser le réalisme en y ajoutant deux phares jaunes à
l'avant et deux pixels rouges à l'arrière. Surtout, ne faites pas un dessin qui fasse plus
de 32x32, il n'y aurait plus de place pour le décor.
Une fois votre oeuvre achevée, placez-la en image n°1 de la banque de sprites puis sauvez
la banque. Il vous suffira ensuite de taper le programme, de le lancer en appuyant sur
la touche F1, et enfin de lui indiquer sous quel nom vous avez sauvé votre banque de sprites,
dont l'image n°1 est votre charrette dans sa position initiale.
Après un dur labeur, il vous demandera sous quel nom vous voulez sauver votre nouvelle
banque de 32 images (soit 32 positions en rotation)... ne saurai trop conseiller de compiler
le programme, car si vous l'utilisez en mode interprété, vous risquez de trouver le
temps long (une minute pour une image de 32x32 en 16 couleurs).
Passons maintenant aux informations techniques
Les matheux pourront facilement recalculer les formules de rotation à l'aide des nombres
complexes. Sachez simplement qu'au lieu de calculer une rotation d'angle A, on calcule
une rotation d'angle -A, ceci étant dû à l'inversion de l'axe (yy') par rapport au
modèle standard.
Si vous souhaitez réutiliser ces formules, il vous faudra choisir un point qui sera le
centre de la rotation et un angle. Supposons que vous ayez choisi CX et CY comme coordonnées de
ce point, et A pour angle rotation (sens inverse des aiguilles d'une montre), les
formules à utiliser seront les suivantes ;
- NX = ((X-CX) * Cos(A) - (Y-CY) * Sin(A)) + CX
- NY = ((X-CX) * Sin(A) + (Y-CY) * Cos(A)) + CY
(NX et NY sont bien entendu les coordonnées du nouveau point)
Par souci de rapidité, je n'ai pas utilisé de nombres en virgule flottante et j'ai utilisé
deux tableaux "_SIN()" et "_COS()" pour y stocker les sinus et cosinus des angles de 0 à 359 degrés,
le tout multiplié par 256. Le fait de multiplier par 256 permet justement de se passer des
nombres en virgule flottante et au lieu d'obtenir des valeurs dans l'intervalle ]-1;1[,
on obtient des valeurs dans l'intervalle ]-256;256[.
Il suffit par la suite de diviser par 256 le résultat d'une multiplication ou division par "_SIN()"
ou "_COS()" pour retomber sur nos pieds, avec une précision de calcul de l'ordre de 1/256.
Mais, me direz-vous, cette multiplication par 256 suivie d'une division par 256 doit rendre
les calculs plus lents qu'en utilisant les nombres en virgule flottante ! Eh bien non,
cette multiplication par 256 est faite uniquement pendant la création des tables "_SIN()"
et "_COS()", et la division est faite sur des nombres entiers. De plus, si vous compilez le programme
avec AMOS Pro Compiler, la division par 256 sera directement remplacée par un décalage à
droite de 8 bits (extrêmement rapide !). Exemple : 1024/256 = 4.
Regardons maintenant la même opération par décalage de bits : 1024 (décimal) = %10000000000 (binaire).
En décalant les bits de 8 (2^8 = 256) positions à droite on obtient : %100 (binaire) = 4 (décimal).
Et voilà, le tour est joué ! Si vous êtes perspicace, vous aurez remarqué que cette astuce ne
fonctionne que si on utilise une puissance de deux (2, 4, 8, 16, 32).
Le calcul de l'image
tournée se fait en trois passages. Si on se contente de calculer la rotation pour chaque
point, on se retrouve avec des trous dans l'image, c'est-à-dire que certains points ne
sont jamais affectés, et c'est très embêtant. Ceci est dû aux approximations. Par exemple,
un point image dont les coordonnées théoriques sont (1,27;2,84) se retrouve en fait
affiché aux coordonnées (1,2) alors qu'il faudrait qu'il soit affiché aux coordonnées (1:3).
On fait donc un premier passage en coloriant simplement tous les points, et un second qui
recherche tous les points laissés vides, calcule leur point d'origine théorique et leur
affecte la bonne couleur.
Le dernier passage refait le calcul et affiche définitive. Ce n'est pas encore parfait et
on se retrouve avec des points parasites qu'il suffit de supprimer avec l'éditeur de sprites.
J'ai essayé diverses autres méthodes pour remplir ces fameux points laissés en blanc, et
c'est celle-ci qui a donné les meilleurs résultats et qui demande le moins de retouches des
images par la suite.
Allez, pendant que vous faites tout tourner (le programme et les images),
je vous prépare le programme qui va enfin la faire vrombir cette fichue voiture, atchao !
|