L'informatique, au fond, c'est des maths. Le fait est cependant que, bien que l'informatique de haut niveau puisse utiliser des maths à vous faire sortir le cerveau par les oreilles sous haute pression, la plupart du temps, un niveau O Level en maths suffira pour s'en sortir sans blessure personnelle. Si vous avez l'intention d'inclure beaucoup de maths dans vos programmes, je me sens obligé de vous encourager à vous procurer un livre sur les bases des mathématiques. Vous y trouverez toutes les connaissances essentielles pour inclure des formules mathématiques dans vos programmes si, comme moi, vous ne faisiez pas attention à l'école.
Il est utile de savoir, par exemple, comment calculer l'aire d'un cercle, bien que, cela dit, AMOS peut vous soulager d'une grande partie de cette tâche en vous fournissant une bonne partie de la puissance de calcul sous la forme de ses fonctions mathématiques intégrées.
Je plongerai dans les fonctions intégrées un peu plus loin dans ce chapitre. Mais pour l'instant...
Quand vous mentionnez les maths dans une conversation polie, dans la plupart des cercles, les gens décrochent. Les gens réagissent comme si vous aviez dit quelque chose de vraiment offensant, et cela devient encore plus offensant, semble-t-il, à l'écrit.
Stephen Hawking dit dans son livre A Brief History Of Time qu'il existe un dicton selon lequel chaque formule incluse dans votre livre divise par deux le nombre de lecteurs dudit livre. Ce n'est pas forcément le cas, surtout si le but de votre livre est la programmation, auquel cas un certain degré de langage mathématique est inévitable. Le principal obstacle pour les gens est de réaliser que les maths peuvent être amusantes tant que vous ne vous aventurez pas trop loin, un peu comme la natation. Faites des pas simples et bientôt chaque session deviendra un plaisir plutôt qu'une source de peur ou d'appréhension.
Le secret avec les mathématiques, c'est de se procurer les bons livres de référence et de les lire très attentivement. Il y en a deux qui me viennent à l'esprit comme des livres inspirants sur les maths, qui les rendent amusantes. Le premier est Mathematics For Everyman par Laurie Buxton (Dent 1984), un livre très lisible et sympathique sur le plaisir des maths. Il vous guide à travers beaucoup de choses très simples et, plus encore, explique pourquoi les maths peuvent être amusantes. Le second livre est plus verbeux et un peu plus savant, Mathematician's Delight par WW Sawyer (Penguin 1943), qui a été réédité plusieurs fois en format poche. (Vous devrez peut-être l'acheter via un service de livres épuisés comme celui de Waterstones, ou le commander à la bibliothèque !) Achetez ces deux livres et lisez-les jusqu'à l'usure, alors vous serez prêt à affronter n'importe quel pavé de formules sans même transpirer.
AMOS contient beaucoup de fonctions mathématiques, et bien qu'une petite connaissance mathématique soit bénéfique pour un programmeur, il s'agit plutôt de savoir ce que vous avez besoin de savoir, et s'arrêter là. Vous n'avez pas besoin de connaître par c?ur l'équation pour calculer le nombre de trous noirs dans l'univers, vous devez juste savoir où la trouver et comprendre suffisamment pour reconnaître une équation quand vous en voyez une. Bien qu'il ne vous vienne jamais à l'esprit d'utiliser des fonctions mathématiques dans vos programmes, elles peuvent en fait être incroyablement utiles, et voici pourquoi. Vous pouvez enfoncer des clous à la main, surtout si vous êtes un expert en karaté. Mais une solution plus élégante et moins douloureuse est d'utiliser un marteau, un outil conçu pour cela. C'est pourquoi les fonctions mathématiques sont utiles, et c'est précisément pourquoi vous devriez les utiliser. Le bon outil pour le bon travail.
Les fonctions mathématiques dans AMOS utilisent la bibliothèque mathématique standard de l'Amiga présente sur la plupart des disquettes Amiga, du moins celles contenant la plupart des fichiers Workbench. Donc, pour utiliser les fonctions mathématiques dans un programme AMOS, vous devez vous assurer que le fichier MATHTRANS.LIBRARY est présent dans le dossier libs:
de la disquette depuis laquelle le programme est lancé. Cela inclut tous les programmes compilés.
Évidemment, tout programme exécuté depuis RAMOS est concerné. La plupart du temps, cela est géré automatiquement en amorçant depuis votre disquette AMOS, mais si vous rencontrez des problèmes, c'est un point qu'il peut être utile de vérifier.
Évidemment, vous devez utiliser les bons types de nombres AMOS pour effectuer toute opération, donc essayer d'utiliser des nombres entiers avec une fonction qui attend un nombre à virgule flottante posera des problèmes dans vos résultats. Consultez les différents types de variables mentionnés au Chapitre 3.
Alors, de quel type de maths parle-t-on ? Eh bien, dans la plupart des cas, vous utiliserez les maths si vous voulez dessiner des formes complexes comme de la 3D, à moins que vous ne déboursiez pour AMOS 3D bien sûr. On appelle cela des vecteurs, et fondamentalement ce sont des points dans l'espace. Il vous faudra lire des choses sur les angles et les vecteurs en mouvement (on appelle ça des transformations) avant de vous lancer dans un projet. Mais fondamentalement, ce que vous devez savoir à propos des angles dans AMOS, c'est qu'ils sont exprimés en radians.
Pour le traitement des angles (comme la création et le déplacement de points dans l'espace par exemple), AMOS utilisera les radians par défaut, au lieu des degrés. Pourquoi ? Je n'en sais rien, car je n'ai jamais étudié les radians et je n'y connais rien. François Lionet connaît visiblement bien les radians, ou bien ils sont plus simples à coder, je ne sais pas. Mais ce que je sais, c'est que si vous voulez qu'AMOS reconnaisse les degrés, tout ce que vous avez à faire est de taper :
Degrees
et tout ira bien. Cela affecte toutes les fonctions trigonométriques et toute leur entrée et sortie sera traduite en conséquence. Évidemment, pour revenir des degrés aux radians, il vous suffit de taper :
Radians
Ce qui, en plus de ressembler à une nouvelle lessive, est en fait la commande pour revenir à la méthode par défaut.
Une autre branche des mathématiques qui intéressera le futur programmeur avancé, c'est la géométrie et la trigonométrie. Cela concerne également les angles, mais la géométrie est un terrain plus familier pour ceux d'entre nous qui pensaient ne jamais avoir besoin de savoir combien d'hommes il faut pour remplir à moitié une baignoire. Diamètres de cercles, aires de triangles, espace et volume. C'est le domaine de la trigonométrie.
Comme vous vous en souviendrez sans doute de vos cours de maths, PI est une constante très utilisée en trigonométrie pour calculer des angles, par exemple, la circonférence d'un cercle se calcule par 2 fois PI fois le rayon, soit 2PIr. La version AMOS de PI est PI#
, avec une version spéciale du symbole #
pour la distinguer de toute autre variable. Donc pour calculer la circonférence d'un cercle, nous pourrions faire ceci :
Rem * Circumference.AMOS * Rem Screen Open 0,640,256,16,Hires Paper 0 : Pen 2 Cls 0 Input "Quel est le rayon du cercle ?";R# Print "La circonférence est ";2*Pi#*R# Wait Key
Le mot trigonométrie vient du grec et signifie la mesure des triangles, donc connaître un peu les angles est une bonne chose. Tous ces calculs ne sont pas simplement théoriques. Avoir quelques bases en maths est très utile si vous voulez créer un jeu vraiment original, par exemple, car vous pouvez aller beaucoup plus vite en sachant comment diviser la mémoire et l'espace écran, en utilisant des formules plutôt que la bonne vieille méthode par force brute et ignorance.
Les triangles et un certain Pythagore sont liés par le théorème que nous apprenons tous à l'école : « le carré de l'hypoténuse d'un triangle rectangle est égal à la somme des carrés des deux autres côtés », et la blague des squaws sur des peaux d'hippopotames, etc. Les angles des coins d'un triangle font en tout 180 degrés, il existe donc plusieurs façons de calculer l'aire d'un triangle. Une de mes préférées, par une curieuse coïncidence, emploie une autre des fonctions trigonométriques d'AMOS, SIN
ou sinus. L'aire d'un triangle est égale à la moitié du produit de la longueur de deux côtés (disons les côtés b et c pour l'exemple) et du sinus de l'angle entre eux.
Évidemment, si vous connaissez la longueur des côtés et un des angles, il est facile de déduire les angles restants.
Mais les sinus sont peut-être encore plus connus pour générer des ondes sinusoïdales comme celle-ci :
Rem * Sine Wave.AMOS * Screen Open 1,640,256,16,Hires Degree For X=0 To 640 Y#=Sin(X) Plot X,Y#*50+100 Next X
En tant qu'onde sonore, la sinusoïde a une tonalité pure et douce, comme une flûte ou des tuyaux, mais nous en reparlerons plus en détail lorsque nous aborderons le son (voir chapitre 16).
Pour apprécier pleinement le type d'effets que vous pouvez obtenir en utilisant des maths plutôt que de simples graphismes, jetez un œil à l'effet de ce programme qui utilise une gamme des différentes fonctions trigonométriques disponibles dans AMOS :
Rem * Triginomitry Fountain.AMOS * Rem Screen Open 1,320,256,32,Lowres Curs Off : Cls 0 : Flash Off NM#=81 P1#=4*Atan(1) DE#=0.05 SX#=160/Sqr(3) : SY#=230 For N=1 To NM# A#=P1#*(-1+2*N/NM#) Gr Locate 160,100 For T#=0 To 3 Step DE# X#=T#*Cos(A#) : Y#=T#*(Sin(A#)-T#/2) If Y#>-0.4 Z=Rnd(15) Ink Z Draw To SX#*X#+160,100-SY#*Y# Else T#=3 End If Next T# Next N
C'est un programme récursif, ce qui signifie qu'il reprend le principe de base d'une ligne courbe descendant l'écran et le répète plusieurs fois via la boucle FOR NEXT. Le mot récursif nous amène à un autre type de géométrie beaucoup utilisé dans les ordinateurs ces dix dernières années, à savoir la géométrie fractale.
Le mot fractale a été inventé pour la première fois à la fin des années 70 par un scientifique d'IBM appelé Benoît B. Mandelbrot, et est depuis passé dans le langage courant. Les gens savent aujourd'hui à quoi cela ressemble (ce qui était loin d'être le cas lorsque j'en parlais il y a des années), et ils peuvent en général marmonner quelques mots sur leur origine et leur utilité. Mais peu de gens en savent vraiment beaucoup.
Les fractales font partie d'un domaine plus vaste appelé la théorie du chaos, qui repose sur une série d'expériences et de théories peu comprises produisant des résultats imprévisibles sans raison apparente. On envoie des données aléatoires à un objet ou un programme et le résultat est un motif étrangement ordonné, ce qui est surprenant compte tenu de l'entrée aléatoire. La théorie a été inventée il y a des années avant les ordinateurs, mais ce n'est que depuis leur apparition que l'on a pu visualiser ces courbes. Les ordinateurs utilisent les fractales pour produire des imitations de phénomènes naturels, et AMOS le peut aussi.
Nous avons abordé les fractales et les mandlebrots, mais comment les génère-t-on concrètement ? C'est complexe, mais comme pour notre exemple précédent, la réponse repose sur une approche récursive, où une formule est alimentée de manière répétée avec des données aléatoires, et la distribution de la sortie est affichée à l'écran. Vous pouvez le faire de deux manières. Soit en traçant chaque point sur l'écran, ce qui prend une éternité et ne donne pas un affichage très bon. Soit en dessinant le tout ligne par ligne, ce qui est la méthode employée par la quasi-totalité des programmes Mandelbrot. Voici un exemple simple de ce processus :
Rem * Simple Mandelbrot.AMOS * Rem Screen Open 0,320,220,32,Lowres Flash Off : Hide On : Curs Off : Cls 0 Pen 2 : Paper 0 Do X=320 Y=200 Z=32 Cls 0 FRAC[X,Y,Z] Wait Key Loop Procedure FRAC[X,Y,Z] CY=Y : CX=X : K=Z XN#=-2.25 : XX=0.75 : YN#=-1.5 : YX#=1.5 H#=(XX#-XN#)/CX : V#=(YX#-YN#)/CY For A=0 To CY-1 For B=0 To CX-1 M#=XN#+B*H# : N#=YN#+A*V# : D=0 : X#=0 : Y#=0 L: W#=X#*X# : Z#=Y#*Y# : R#=W#+Z# : Y#=2*X#*Y#+N# X#=W#-Z#+M# : Inc If R#<4 and D<K Then Goto L If O=Z Then O=O Plot B,A,D Next B Next A End Proc
Tout le travail est effectué dans la procédure FRAC
, qui commence par définir les variables entiers de base CY
, CX
et K
ainsi que quelques variables à virgule flottante. Il s'agit des valeurs minimales et maximales de X et Y. La boucle prend les valeurs initiales et les injecte de manière répétée dans la fonction, puis une ligne est tracée à l'écran à une certaine distance et dans une certaine couleur. Une courbe de Mandelbrot basique complète est imprimée ligne par ligne sur l'écran.
Évidemment, vous pouvez ajouter des routines de zoom qui redessinent une partie spécifique de la formule et une fois que l'écran est affiché, vous pouvez effectuer un zoom sur une région donnée et redessiner l'écran en plus de détail. Si vous décidez de vous y essayer, je vous conseille de vous assurer que le niveau de grossissement est compensé par un niveau de précision suffisant dans vos calculs.
Figure 8.1. Un Mandelbrot généré par le programme.
La beauté des fonctions mathématiques intégrées est que, comme une calculatrice scientifique, le programme AMOS peut accepter des données directement issues d'une formule trouvée dans un livre. Ainsi, à partir de n'importe lequel des livres de mathématiques que j'ai mentionnés précédemment, vous pouvez extraire une formule et construire un programme autour de celle-ci. La formule constitue la routine de base de votre programme.
Figure 8.2. Une jolie formule mathématique.
Par exemple, la formule de la figure 6.2 se traduit par le code suivant :
XF=XB+(XR/3)+(SIN(X)/TAN(XR))
Cette formule ne sert à rien en particulier, donc l'exécuter ne répondra à aucune grande question cosmique, mais elle démontre comment traduire une formule mathématique en code AMOS.
Enfin, un autre domaine où les maths peuvent vous être utiles est celui des vecteurs, comme ceux que j'ai mentionnés plus tôt. Les vecteurs sont essentiellement un changement de direction d'un objet ou d'un point dans l'espace. D'où leur utilisation dans les transports, en particulier les avions et les véhicules spatiaux comme la navette spatiale. En AMOS, les vecteurs sont intéressants pour la construction de jeux et de graphismes, comme le montrent les jeux Brickout et Ping d'Aaron Fothergill.
L'idée est la suivante : vous devez utiliser deux variables pour contenir les coordonnées x et y de la position du sprite. Vous utilisez ces deux variables pour contenir les mouvements x et y du Sprite à chaque image de l'animation. Comme ceci :
Rem * Vectors1.AMOS * Rem Curs Off : Hide : Flash Off : Cls O : Ink 4,4 : Paper O Input "X Vector ";DX# Input "Y Vector ";DY# Cls 0 : Bar 0,0 To 3,3 Get Bob 1,0,0 To 4,4 Cls 0 X#=160 : Y#=100 While X#>O and X#<32O and Y#>O and Y#<20O Bob 1,X#,Y#,1 Wait Vbl X#=X#+DX# Y#=Y#+DY# Wend End
Cela vous montre le principe. Vous commencez par saisir les vecteurs x et y de direction, ce qui a un effet sur la direction que le Sprite prendra. Il est préférable d'essayer une plage de nombres entre -8 et 8 pour chacun des vecteurs. Les vecteurs requis sont d'abord saisis via la commande Input
et stockés dans deux variables appelées DX et DY. Le Bob utilisé dans le programme est prélevé de l'écran à l'aide de Get Bob
, après avoir été placé via une commande Bar
.
Ensuite, la position de départ du Bob est définie à x=160 et y=100, soit le centre de l'écran. Une boucle While Wend
est ensuite activée pour déplacer le Sprite dans la direction indiquée par les vecteurs. (Une fois que vous aurez appris un peu sur les vecteurs, vous serez capable de prédire précisément direction ! Le Bob est déplacé jusqu'à ce qu'il atteigne le bord de l'écran, soit en dessous de la position 0 de l'écran (en haut ou à gauche), soit jusqu'à la position 320 ou 200 (droite ou bas).
à chaque passage dans la boucle While Wend
, les vecteurs DX et DY sont ajoutés aux coordonnées actuelles, influant ainsi sur la direction du Sprite. C'est une méthode très cool et efficace pour déplacer des objets, et cela devient encore plus fluide lorsque les objets se déplacent dans deux directions. Bien sûr, vous disposez dans AMOS 3D des outils pour translater des objets en trois dimensions, mais un peu de vectorisation peut parfois faire des merveilles pour des effets vraiment spéciaux.
Voici un autre exemple à méditer. Dans ce cas, le vecteur est inversé, c'est-à-dire qu'il se déplace dans une direction jusqu'au bord de l'écran, puis rebondit pour repartir dans la direction opposée. Voici le listing :
Rem * Flip Flop.AMOS * Rem X=1 : DX=1 Curs Off : Flash Off : Cls O Ink 4,4 Bar 0,0 To 15,15 Get Bob 1,0,0 To 16,16 Cls 0 Double Buffer Do Bob 1,x,1oo,1 Wait Vbl X=X+DX If X<=O or X>=319 DX=-DX End If Loop
Le Bob est créé comme précédemment, mais cette fois un peu plus grand. Le Bob est uniquement déplacé, pour des raisons de simplicité, sur l'axe X, de gauche à droite. Une fois qu'il atteint l'autre côté de l'écran, il fait demi-tour et repart dans l'autre sens. Le vecteur DX est changé en un nombre négatif, ce qui, bien entendu, inverse le mouvement et transforme un déplacement de gauche à droite en un déplacement de droite à gauche. Simple et très efficace. Une variation plus subtile et bien plus dynamique consisterait à faire en sorte que les vecteurs X et Y s'inversent lors de l'impact, de façon à faire rebondir le Bob sur tout l'écran. Une autre variante serait d'altérer le vecteur du rebond lorsqu'il touche un mur, pour qu'il rebondisse de manière plus aléatoire.
Un grand merci à Aaron Fothergill pour ses programmes de vecteurs.
L'une des meilleures sources d'astuces mathématiques pour AMOS, d'algorithmes et autres conseils est le AMOS Club (voir le chapitre 23 pour plus de détails).