Day.png);">
Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker


Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Jeux: puie z / Jeux: Citymaime - Chapitre 1 / Jeux: Mer, îles et fous / News: Du neuf dans le making / News: Muma|Rope est disponible en (...) / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

429 connectés actuellement

30732398 visiteurs
depuis l'ouverture

2377 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

Le Comptoir Du clickeur

Level Up!

New RPG Maker

Tous nos partenaires

Devenir
partenaire



Cosinus et Sinus, avec */+

Approximer les fonctions cos et sin en utilisant uniquement additions et des multiplications.

Ecrit par Tassle le 30/09/2020


❤ 1


################
## INTRODUCTION ##
################


Quand on crée des jeux vidéos avec des outils tels que les anciens RM (sans scripts), on aimerait parfois bien pouvoir utiliser certaines fonctions mathématiques qui ne sont pas disponibles, comme les fonctions cosinus et sinus.

Un exemple d’utilisation est quand on veut qu’un objet se déplace de manière circulaire sur l’écran. Calculer les coordonnées sur une telle trajectoire requiert l’utilisation des fonctions cos et sin, par les formules (j'utilise le point central · pour noter une multiplication):

x(t) = x_c +r·cos(2π·f·t),
y(t) = y_c +r·sin(2π·f·t),

où t est le temps, (x_c, y_c) sont les coordonnées du centre du cercle, r est le rayon du cercle et f est la fréquence de rotation (combien de tours de cercle par unité de temps).

Problème : Il n'y a pas les fonctions cos et sin dans [insérez votre logiciel de prédilection ici] ! Comment je fais faire des jolis cercles à mes bonzhommes ?

Et bien je vais partir du principe que vous pouvez faire des additions, soustractions, multiplications et divisions dans votre logiciel favori. A partir de là je vais vous montrer comment bien approximer les fonctions cos et sin (une approximation assez bonne pour la plupart des utilisations que vous pourriez en faire).

Dans un prochain tuto je compte vous montrer une autre méthode, qu’il vous sera plus facile d'adapter pour approximer tout un tas d’autres fonctions que cos et sin.

NOTE IMPORTANTE : Parce qu’on est pas des sauvages, je parle ici du sinus et cosinus avec des angles en radians. Si l’angle dont vous voulez calculer le cosinus ou sinus est en degrés, il vous faudra d’abord faire la conversion :
(angle en radians) = (pi/180)*(angle en degrés).


###############
## LES RECETTES ##
###############


Je commence par la méthode pour ceux que les maths n’intéressent pas. Pour les curieux il y aura quelques ébauches d’explications mathématiques plus loin.

Recette magique pour approximer cos(x) :

Le livre de recettes a dit:

1) Si x > π, retrancher 2π autant de fois que nécessaire pour que x ≤ π
2) Si x < -π, ajouter 2π autant de fois que nécessaire pour que x ≥ -π
(donc à ce stade on a -π ≤ x ≤ π)
3) Diviser x par 4.
4) Poser c = 1 - x²/2 + x⁴/24
5) Faire l’opération suivante deux fois de suite : remplacer c par 2c² – 1.
6) La valeur recherchée (ou plus précisément un approximation de celle-ci) est maintenant contenue dans c.



Regardons un exemple, pour calculer cos(13.5) :

1) On a x = 13.5 > π. Donc on retranche 2π et on obtient environ x = 7.2168147. On retranche encore une fois 2π et on obtient x = 0.9336294. Comme x ≤ π on s’arrête là.

2) On a x ≥ -π donc il n’y a rien à faire à cette étape.

3) On divise x par 4 et on obtient x = 0.2334073

4) On pose c = 1 - x²/2 + x⁴/24 = 0.9728842

5) On remplace c par 2c²-1 et on obtient c = 0.8930073. Une seconde fois donne c = 0.5949241.

6) Donc cos(13.5) ≈ 0.5949241

Cette valeur est extrêmement proche de la véritable valeur de cos(13.5), qui est environ 0.5949206.

(Si on arrondit pas trop entre chaque étape, la différence entre la valeur donnée par cette méthode et la véritable valeur du cosinus est toujours plus petite que 0.00036)

Recette magique pour calculer sin(x) :

Le livre de recettes a dit:

1) Retirer π/2 à x.
2) Suivre la recette précédente pour calculer cos(x).



Par exemple, pour calculer, sin(8.5), on retire π/2 à x=8.5 ce qui donne environ x = 6.9292036. En suivant la recette précédente à partir de là on obtiendra environ 0.798487.


#########################
## LE POURQUOI DU COMMENT ##
#########################


Je vais pas prétendre vous donner une explication complète de pourquoi ces formules fonctionnent (pour être complet il faudrait expliquer la définition mathématique de cos et sin, la notion de limite, d’erreur d’approximation, les séries de Taylor et tout un tas de joyeusetés reliés). Mais j’espère satisfaire un peu les curieux des maths parmi vous.

On va partir d’une expression de la fonction cos(x) comme une somme infinie de puissances de x :
cos(x) = 1 - x²/2 + x⁴/24 - x⁶/720 + … + [(-1)^n]·[x^(2n)]/(n!) + …
C’est ce qu’on appelle la série de Taylor du cosinus en 0.

Plus on va loin dans les termes de la somme, plus la puissance de x augmente et plus on divise par un terme grand. Or, quand x est petit (proche de 0), x multiplié à lui même un grand nombre de fois est minuscule, d’autant plus si après on divise le tout par un grand nombre. Donc quand x est petit, la plupart des termes dans la somme ci-dessus sont minuscules et négligeables. On va donc faire un peu les foufous et les négliger, en écrivant

cos(x) ≈ 1 - x²/2 + x⁴/24, quand x est proche de 0.

Maintenant, on aimerait une approximation qui soit bonne partout, pas seulement autour de 0. Donc on commence par utiliser le fait que rajouter ou retrancher 2π à un angle ne change pas le cosinus, pour se ramener au cas où -π ≤ x ≤ π (étapes 1 et 2). Bon, 3.14 c’est encore un peu grand pour dire que c’est « proche de zéro ». Donc on va encore faire un truc de guedin et diviser x par 4. On est sûr que x/4 est à moins de 0.79 (environ) de distance de 0. On va dire que c’est assez proche de 0, donc on peut utiliser notre approximation pour calculer cos(x/4).

Sauf que nous on veut cos(x), pas cos(x/4) ! C’est là qu’intervient la jolie petite formule :

cos(2a) = 2·(cos(a)²)-1.

Si on applique la formule avec a = x/4 et a = x/2 on obtient :

cos(x/2) = 2·(cos(x/4)²)-1,
cos(x) = 2·(cos(x/2)²)-1.

Ce qui nous permet de retrouver cos(x/2) à partir de cos(x/4) puis cos(x) à partir de cos(x/2) ! C’est exactement ce que fait l’étape 5 de la recette magique.

Ensuite, pour calculer sin(x) on utilise simplement le fait que sin(x) = cos(x-π/2).


#########################
## AMÉLIORATIONS POSSIBLES ##
#########################


Il est possible d’améliorer la recette si nécessaire.

Tout d’abord, on pourrait remplacer les étapes 1 et 2 par des méthodes plus rapides qui évitent de faire trouzemille additions et soustractions dans le cas où x est très grand. En gros on veut calculer x modulo 2π (et soustraire encore 2π si le résultat de cette operation est supérieur à π). La méthode idéale dépend des opérations disponibles dans le logiciel.

Ensuite, si on veut vraiment une approximation de foufou encore plus précise on peut inclure plus de termes de la série de Taylor dans l’étape 4 ou diviser par une puissance de deux plus grande que 4 à l’étape 3 et répéter l’étape 5 un nombre de fois correspondant.


##########
## BISOUS ##
##########


Bisous.



Gari - posté le 30/09/2020 à 08:16:20 (5901 messages postés) - honor

❤ 0

Une autre méthode pour calculer sinus et cosinus : https://www.rpg-maker.fr/index.php?page=tutos&id=499

Aussi Tassle, tu m'arrêteras si je me trompe, mais j'ai l'impression que le tuto est plus théorique que pratique. Je suis pas sûr aussi qu'il soit valable pour RM2003, vu qu'il faut multipliplier par un montant avec des 0 et rediviser pour avoir un résultat plus précis ?


Tassle - posté le 30/09/2020 à 09:46:25 (5274 messages postés)

❤ 0

Disciple de Pythagolf

Ah bah zut, je me souvenais de quelqu'un posant cette question mais j'ai pas vu qu'il y avait déjà un tuto :V

Bah le but c'était qu'il soit pratique (je donne une recette directement applicable) avec une petite explication théorique.

Dans un logiciel où il n'y a pas de valeurs flottantes (de nombres à virgule) il faut effectivement renormaliser pour avoir des valeurs de cos et sin entre -1000 et 1000 par exemple. Je ferais un commentaire plus détaillé cet aprem pour expliquer comment faire ça.

~~


Nemau - posté le 05/10/2020 à 15:51:21 (53215 messages postés) - admin -

❤ 0

Narrer l'autocatégorème

Merci pour ce tuto !

Quel RPG Maker choisir ?Ocarina of Time PCPolaris 03


Tassle - posté le 06/10/2020 à 15:30:55 (5274 messages postés)

❤ 0

Disciple de Pythagolf

Pas de souc' !

Après avoir fait quelques tests, il est clair que la méthode empirique de Anton (dans le lien posté par Gari) est meilleure pour RM2K3. Là où lui atteint 0.2% d'erreur, ma méthode donne 1.5% si je mesure comme je pense qu'il a mesuré.

C'est pas très étonnant étant donné qu'à chaque étape de ma méthode adaptée pour RM2K3, les arrondis dus aux divisions entières s'accumulent, et que Anton a bien choisi ses constantes pour que ça fonctionne empiriquement.

Considérez ça comme un tuto théorique alors :)
(Mais l'algorithme que je donne est tout de même utilisable dans un logiciel avec des flottants, qui offrent plus de précision pour les petits nombres).

~~

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts/Plugins | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers