« Programmation objet et géométrie/Les lignes droites de canvas » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 218 :
==Calculs sur les fractions==
 
Comme on ne fait pas assezbeaucoup de calculs sur les fractions, il n'est pas absolument nécessaire de créer un objet ''fraction'' en JavaScript. On se contentera ici de représenter la fraction <math>\frac{p}{q}</math> par le tableau ''[p,q]''. De même, la fraction continue (une suite d'entiers naturels) sera représentée par un tableau JavaScript.
 
===Conversion en fraction continue===
 
L'algorithme de conversion de fraction vers fraction continue (noté ci-dessous ''frac2cont'' en anglais: ''fraction to continued fraction'') est assez simple à décrire: Répéter la suite d'opérations
 
# inverser la fraction
# soustraire au résultat, sa partie entière (qui se retrouve stockée dans la liste de la fraction continue).
 
Quelques astuces javascriptiennes ont été utilisées ci-dessous, pour raccourcir le code:
 
:*Tout d'abord, la condition de sortie de la boucle ne porte pas comme d'habitude sur l'indice ''n'' de la boucle mais sur la fraction elle-même (on n'arrête pas lorsque ''n'' atteint une valeur prédéfinie, mais lorsque le dénominateur de la fraction est devenu égal à 1).
:*Ensuite, le fait d'utiliser un tableau pour stocker une fraction, permet de l'inverser assez facilement (en plaçant simultanément son dénominateur ''f[1]'' comme numérateur, et son numératereur ''f[0]'' comme dénominateur).
:*Enfin, la liste des réduites est construite au fur et à mesure: Initialisée comme tableau à une seule entrée avec ''var cont'', chaque tentative d'écriture sur l'indice ''n+1'' qui ne contient encore rien, allonge le tableau:
 
<source lang="javascript">
function frac2cont(f){
var cont=[Math.floor(f[1]/f[0])];
for(var n=0;f[1]>1;n++){
f=[f[1],f[0]];
f[0]-=cont[n]*f[1];
cont[n+1]=Math.floor(f[1]/f[0]);
}
cont.pop();
return cont;
}
</source>
 
L'instruction ''pop'' vers la fin est dûe à ce que la boucle est parcourue une fois de trop, et donc le dernier élément du tableau contient &infin; à cause d'une division par zéro. JavaScript possède une sorte d'esprit d'initiative, préférant anticiper sur ce que voulait le programmeur, plutôt que tout bloquer avec un message d'erreur (ce qui n'est pas surprenant, on souhaite rarement que l'internaute voie une page bloquée parce que le webmestre a fait n'importe quoi).
 
===Conversion en fraction===
 
On peut obtenir
 
===Fils d'une fraction===