CODINGAMSLIVE ★ AMSLIVE N°07 - SINUS SITE , LA SUITE (2/2) ★

AMSLIVE n°07 - SINUS SITE , LA SUITE (2/2)Coding Amslive
En 1 mois, votre mal de tête a du tomber. On reprend donc les considérations abstraites qui ont fait dire à quelqu'un : il est peut-être bête, ce Madram, mais il est pas con (à moins que ça ne soit l'inverse ?).

Quand je dis "fin", ce n'est que provisoire. Il y a tant de choses à dire sur le sujet. Cependant, une fois bien assimilé ce que je vous aurai raconté, vous pourrez créer ondulations, animations, déformations, voire sons les plus fous !

PRECALCUL

Je me permets une digression. A ne pouvoir profiter de la liberté de la paresse, je me rabats sur la liberté de la presse. Dans la plupart des cas, on construit les courbes en BASIC, puis on enregistre le résultat (une "table"). Compactée, elle utilisera sûrement moins de place et de temps que de la construire en language machine à l'initialisation du programme. Mais pour ceux qui veulent laisser le prog tout calculer, je donne quelques pistes. Les routines mathématiques font partie du système et non pas de l'interpréteur BASIC. On peut donc y accéder par des vecteurs. Attention ils ne sont pas aux mêmes adresses sur 464 & 664/6128 et celles données par LES CLEFS ne sont pas toutes exactes.

BDAC sur 6128 calcule le sinus d'un angle codé en réel (sur 5 octets, sujet d'un autre article si vous le désirez ardemment). HL doit pointer sur ces 5 octets. Ces routines ne sont pas très rapides, vous voudrez peut-être en concevoir de nouvelles. Pas compliqué, il faut vous dire que si x est exprimé en rad, sin(x) est la limite de la série :

sin(x) = x – x^3/3! + x^5/5! - x*7/7! ... +(-1)^n*x^(2n+1)/(2n+1)!

Quatre termes suffisent pour une approximation très correcte qui peut s'écrire x( 1 – x^2/6( 1 – x^2/20( 1 – x^2/42 ) ))

Les détails du calcul sont disponibles jusqu'au 15 novembre dans ma corbeille à papier.

BREF...

Revenons à une construction de table sous BASIC : la fonction SIN renvoie une valeur codée sur 5 octets, comprise entre -1 et 1. Or, un vaillant programmeur en assembleur préférerait une valeur codée sur 1 octet, variant donc entre 0 et 255 (ou -128 et 12 7 en binaire signé). Pas de problème, un POKE (sin(t)+1)*255/2 s'occupe de l'arrondi au plus proche.
On obtient une table d'amplitude 255 et de précision 1. On pourrait la considérer comme une table d'amplitude 1 et de précision 1/255 (ou 2 - 2/255, 3 -3/255, etc), mais ce serait moins pratique et moins logique car l'unité des valeurs de cette table correspond à l'unité de la variable concernée par la table (le décalage en pixels par exemple). Vous ne suivez pas ? Ce n'est pas grave, c'était une remarque sans importance du genre duquel j'aime agrémenter mes articles.

Ce qui importe, c'est ce manque de précision. Chaque valeur est définie à 1 unité près (autrement dit, à + ou - ½ unité). Et si on additionne deux de ces valeurs, le résultat n'est plus défini qu'à 2 unités près. Prenez l'exemple suivant (si,

si, prenez, c'est cadeau) : 5,5 et 3,5 ont été arrondis à 6 et 4 (différence de 0,5). 6 + 4 = 10, qui diffère de 1 avec 5,5 + 3,5. Comme quoi, les incertitudes s'additionnent.

TREMBLEZ, PAUVRES COURBES

La ligne suivante trace une sinusoïde de faible amplitude obtenue par addition de deux courbes.

DEG:FOR x = 0 TO 638 STEP 2:a=(SIN(t)+1)*100:b=(SIN(t+183)+l)*100: PLOT x,CINT(a+b):NEXT


Figure 1

L'arrondi se fait après l'addition. Maintenant, remplacez

CINT(a+b) par CINT(a)+CINT(b)


C'est exactement ce qu'il se passe quand on prend des valeurs, déjà arrondies, dans une table. Résultat, la courbe est parkinsonienne (figure 2).


Figure 2

La figure 3 fournit l'examen à la loupe de ce qui arrive dans ces cas-là.


Figure 3

LE REMEDE

Ahah. Gloups. Hum ? Quoi ? Le remède ? Ben y'en a pas. Le problème est que même une très grande précision n'empêche pas les erreurs. Entre les valeurs 0.499999 et 0.5 il n y a que 0.000001 de différence ; pourtant, après arrondissement, l'écart sera de 1.
Cependant, plus la précision sera grande, moins vous rencontrerez ce genre d'erreur. La précision offerte par le basic est très satisfaisante. Sans aller jusqu'à stocker 5 octets par valeur, plus vous aurez de bits, mieux ça sera ; même si c'est pour n'en utiliser que 8 au final.
Voici une solution possible : une table cyclique de 256 éléments 16 bits. Les 8 bits de poids forts sont placés &100 après les bits de poids faibles (choix arbitraire). DE et HL pointent sur la table, partie poids faibles.

LD A,(DE) ; on additionne les poids faibles
ADD A,(HL) ; seule la retenue nous intéresse
INC H ; Ouf! Inc et LD ne
INC E ; changent pas Carry
LD A,(DE)
ADC A,(HL) ; addition avec retenue
RRA ; on récupère le bit de poids fort


Pour économiser RRA, les valeurs pourront être codées sur 15 bits (7 bits de poids fort / 8 bits de poids faible).

CONCLUSION INTESTINALE

A vous de tester si la précision choisie convient ou pas. Pour les 2 démos citées en début d'article le mois dernier, ça n'allait pas ! Par contre, sur un beau plasma en MODE 2, les erreurs d'approximations n'altèrent pas la finesse de l'ondulation. Héhéhé.

AMSLIVE n°7

★ ANNÉE: ???
★ AUTEUR: MADRAM

Page précédente : AMSLIVE n°07 - HAPPY DRIVERS : LES RSX AMSDOS

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » AMSLIVE n°02 - Rasters
» Coding » AMSLIVE n°15 - la Vie en 16
» Coding » AMSLIVE n°12 - Vu Metre
» Coding » AMSLIVE n°20 - les Maître du Temps
» Coding » AMSLIVE n°04 - Asic - Scrollhard
» Coding » AMSLIVE n°06 - Sinus
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 184 millisecondes et consultée 2198 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.