[AXE] Problème précision (cos et sin)

Voir le sujet précédent Voir le sujet suivant Aller en bas

[AXE] Problème précision (cos et sin)

Message par maxence le Dim 20 Oct - 9:57

J'aimerais réaliser un programme permettant d'effectuer des rotation d'un point en 3D autour de l'origine, pour cela j'ai besoin de calculer la nouvelle position du point en fonction de son ancienne, et de l'angle noté P.

Pour l'instant, j'utilise les formules :

x' = cos(P) * x - sin(P) * y
y' = sin(P) * x + cos(P) * y

Avec x et y les anciennes coordonnées et x' et y' les nouvelles coordonnées.

Ces formules marchent, mais en AXE, en raison de la précision trop faible, le résultat attendu n'est pas bon, en particulier à cause des cos et sin.

Comment remedier à cela ?

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par linkakro le Lun 21 Oct - 13:22

Soit tu créés un nouveau noyau de calcul des sinusoïdes (probablement approche par développement limité grâce à un noyau linéaire) soit tu crées une Look Up Table (table de valeurs précalculée) de plus de 256 valeurs et à valeurs de plus de 2 Bytes.
Je ne vois pas d'autre solution, sauf peut-être utiliser le noyau de TI, ou encore décomposer les sinusoïdes avec la forme sin(a+b)=sinacosb+sinbcosa et une table partielle.

Cependant l'emplacement du signe négatif ne respecte pas l'orientation directe de la physique trigonométrique, donc j'espère que tu compenses avec le reste des conventions. (probablement le sens horaire)
mémo:
J'illustre avec la méthode "ENS Cachan" montré par le prof de la Prépa Vaucanson (qui a justement étudié à Cachan) :
x___x'
y___y'
z>P>z
Les horizontales ont toujours +cosinus.
Les diagonales ont +-sin.
En reliant y et x', on dessine un Z comme Zorro, et Zorro gagne toujours donc c'est positif : +sin.
L'autre diagonale -sin.

linkakro
Or 4
Or 4

Sexe : Masculin
Age : 22
Messages : 768
Date d'inscription : 01/07/2010
Etudes : dut geii (elec/info)
Points Forum : 51
Points Concours : 8
Langages :
  • - TI-Basic Z80
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
Calculatrices :
  • - TI-82 Stats.fr
  • - TI-84 Pocket.fr

TI-84+ SE


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par maxence le Lun 21 Oct - 15:40

En fait, l'avantage des formules que j'utilise, c'est qu'elle calculent la nouvelle position du point en fonction d'un angle et de son ancienne position, pas par rapport à la position initiale, je m'explique :

J'ai x = 10 et y = 0
J'applique la formule pour un angle de 45°
j'obtient x' = sqrt(2)/2 et y' = x'
Je rapplique pour un angle de 45°
j'obtient x'' = 0 et y'' = 10

Donc la table pré calculée ne marche pas (je pense), mais je vais quand même tester. Pour ce qui est de recréer un pseudo-fonction cos et sin, je ne connais pas les calculs à effectuer mais ça a l'air pas mal, peux-tu m'en dire d'avantage ?

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par linkakro le Lun 21 Oct - 22:13

Il me semble que les programmes d'espace de matrefeytontias et autres experts sont assez précis...

Je ne sous-entendais pas de précalculer les coordonnées, mais de précalculer les cosinus et sinus.

Rappelle moi la capacité d'Axe. Je crois 1 octet d'entrée angle et deux octets de sortie sinus.
Si c'est bien ça tu peux déjà chercher à utiliser deux octets d'entrée.

Les tables sont quand même intéressantes...
EDIT: je veux dire que c'est facile et rapide

Les calculs ne sont pas évidents. C'est même souvent casse-tête. (EDIT: et c'est lent)
Je sais que des calculatrices utilisent des dévellopement limités cependant, et c'est probablement la meilleure piste excepté les tables.
par développement limité:
Le développement limité (d'ordre n) est un polynôme (de degré n maximum) équivalent à la fonction en un voisinage.

Quand on développe à un ordre n, on a en fait négligé tous les termes d'ordre suppérieur. Le tronc du polynôme est toujours le même.
Si des coefficients nuls sont à la fin, alors le degré peut être inférieur à l'ordre.
J'ommet l'écriture des o(x^(n+1)) négligeables devant le terme d'ordre n, et qui expliquent normalement ce qui se passe.

Le théorème de Taylor Young prouve que toutes les fonctions continues et dérivables n fois à dérivées successives continues, au voisinage de zéro, admettent un développement limité dont les coefficients sont donnés par ce même théorême à partir des dérivées. Par décalage des fonction on écrit les développements en d'autres voisinages.

Ainsi cosinus et sinus admettent des développements limités. Dans leur cas cela marche vraiment très bien, on peut approcher une période avec relativement peu d'ordre.

J'essaie de les écrire, il faut vérifier :
cos(x)~au voisinage de a~cos(a)-(x-a)^2/2+(x-a)^4/4!
sin(x)~au voisinage de a~sin(a)-(x-a)+(x-a)^3/3!-(x-a)^5/5!
Ici à l'ordre 5. On a globalement alternance de signe et des exposant impairs ou pairs.

EDIT : test
sin marche bien avec a=pi et ordre 7
cos marche bien avec a=0 et ordre 8
par décomposition des sinosoïdes de sommes:
cos(a+b)=cos(a)*cos(b)-sin(a)*sin(b)
cos(a-b)=cos(a)*cos(b)+sin(a)*sin(b)
sin(a+b)=sin(a)*cos(b)+sin(b)*cos(a)
sin(a-b)=sin(a)*cos(b)-sin(b)*cos(a)
(mémo : le cosinus est raciste et contrariant)

Toujours beaucoup de termes après imbrication. Je préfère le cosinus, le rangement est plus joli et cela permet la duplication cos(2*b)

====
J'envisage d'utiliser la duplication (cos(2*x) et sin(2*x)).
Pour le cosinus c'est relativement facile.
Et on peut tomber dessus avec la base 2.
cos(2b)=1-2sin(b)^2=2cos(b)^2-1
sin(2b)=2sin(b)cos(b)

Je retiens surtout la relation en tant que récurrence.
cos(b*2^(n+1))=2*cos(b*2^n)^2-1
sin(b*2^(n+1))=2sin(b*2^n)cos(b*2^(n+1))

x=somme(n=a,N ; bn*2^n)=somme(n=a+1,N ; bn*2^n) + ba*2^a
Avec b les 0 ou 1 des bits et 2^n les poids.

Poser l'expression littérale avec réduction à cos(1)/cos(0)/sin(1)/sin(0) est innextricable.

====

Si une table partielle contient les cos(b*2^n) et sin(b*2^n) alors on n'ira pas jusqu'au bout des décompositions.
Dans ce cas on doit avoir un bon comprommis entre la taille de la table et la complexité et la durée des calculs.


Dernière édition par linkakro le Mar 22 Oct - 16:42, édité 1 fois

linkakro
Or 4
Or 4

Sexe : Masculin
Age : 22
Messages : 768
Date d'inscription : 01/07/2010
Etudes : dut geii (elec/info)
Points Forum : 51
Points Concours : 8
Langages :
  • - TI-Basic Z80
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
Calculatrices :
  • - TI-82 Stats.fr
  • - TI-84 Pocket.fr

TI-84+ SE


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par matrefeytontias le Mar 22 Oct - 9:39

Vous vous embêtez vraiment pour pas grand-chose. Pas question de refaire les fonctions trigo, la vitesse prendrait bien trop cher. La méthode que j'utilise systématiquement est celle de la LUT.
Le truc dont il faut se rappeler est que les cos et sin de l'Axe sont mappés sur [-128,127], et qu'il faut diviser par 128 le résultat de tout calcul impliquant la trigo. Le code le plus optimisé que j'ai pu écrire qui corrige l'imprécision cos(0) = 127 au lieu de 128 est :
Code:
:E90D3->°CosLUT
:Return!If GetCalc("appvTrig",256)
:->CosLUT
:~1
:For(256)
:Select(+1,cos(->r1)->{r1+CosLUT})
:End

...

:Lbl Sin
:-64
:Lbl Cos
:^256??128,sign{+CosLUT}
Avec ça, appelle les fonctions Cos() et Sin() au lieu des tokens cos() et sin(), en prenant en compte le fait que r1 soit détruit. Encore une fois, oublie pas de tout diviser par 128 après tous les calculs.

_________________
[Axe] [Vous devez être inscrit et connecté pour voir ce lien], aussi compatible 82 stats !

[Vous devez être inscrit et connecté pour voir ce lien]
[Vous devez être inscrit et connecté pour voir ce lien]

Spoiler:

matrefeytontias
Platinum 1
Platinum 1

Sexe : Masculin
Age : 19
Messages : 1383
Date d'inscription : 28/09/2011
Etudes : 1ère S SI
Points Forum : 90
Points Concours : 7
Langages :
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
  • - Axe Parser
  • - Lua Nspire
  • - Ndless Nspire
Calculatrices :
  • - TI-83+.fr
  • - TI-Nspire CAS

TI-83+.fr


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par maxence le Mar 22 Oct - 9:57

Merci pour vos réponses, je vais essayer de faire avec.

Le problème pour l'instant, c'est que lorsque j'augmente l'angle, le cos réduit bien la largeur initiale alors que le sin n'augmente pas la hauteur, car le résultat divisé par 128 vaut 0 (D * sin(angle) // 128 = 0), donc ça me donne juste un trait qui rétréci de plus en plus.

Sinon, c'est possible de récupérer le code source du programme AXECUBE qui est donné de base avec l'axe ?

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par matrefeytontias le Mar 22 Oct - 10:58

Montre-moi le calcul des coordonnées pour voir ?

_________________
[Axe] [Vous devez être inscrit et connecté pour voir ce lien], aussi compatible 82 stats !

[Vous devez être inscrit et connecté pour voir ce lien]
[Vous devez être inscrit et connecté pour voir ce lien]

Spoiler:

matrefeytontias
Platinum 1
Platinum 1

Sexe : Masculin
Age : 19
Messages : 1383
Date d'inscription : 28/09/2011
Etudes : 1ère S SI
Points Forum : 90
Points Concours : 7
Langages :
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
  • - Axe Parser
  • - Lua Nspire
  • - Ndless Nspire
Calculatrices :
  • - TI-83+.fr
  • - TI-Nspire CAS

TI-83+.fr


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par maxence le Mar 22 Oct - 12:08

Le calcul que j'utilisais était :

x' = cos(angle) * x - (sin(angle) * y) // 128
y' = sin(angle) * x + (cos(angle) * y) // 128

C'était pour faire tourner le point autour de l'axe central.
En fait ce que je voulais faire, c'était utiliser les flèches gauche et droite pour modifier les valeurs x et z du point, et les flèches haut et bas pour modifier les valeurs y et z du point. (en utilisant la formule ci dessus, mais en remplaçant x et y par x et z et par y et z en fonction du mouvement voulu)

Ensuite on convertis les coordonnées 3D vers les coordonnées 2D et on les affiches, sauf que par manque de précision, en utilisant ce calcul comme test pour faire tourner un trait à la manière d'une aiguille, la valeur y ne changeait pas tandis que la valeur x elle était modifiée correctement.

J'ai commencé à lire le tuto "3D tutorial" sur Ti-cacl, je pense que je vais utiliser ces méthodes finalement, mais je me demande si il n'y a pas quelques erreurs quand même :

ScreenPt.x = screen_mid.x + (const * pt.x) / pt.z

Déjà, si pt.z = 0, on se retrouve avec un résultat improbable :/
et c'est tout à fait possible que le point se trouve à une profondeur de 0.
Ensuite, ça signifie que un point situé à x = -10 et z = -10 se trouve sur l'écran au même endroit qu'un point situé à x = 10 et z = 10.

Ou alors j'ai mal compris, mais je ne vois pas trop comment cela peut marcher :/

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par matrefeytontias le Mar 22 Oct - 12:17

Moi je te demande comment tu l'as implémenté. Le calcul je le connais, merci.

Et oui, la formule est la bonne. Ça s'appelle la projection orthogonale, soit qui est influencée par la profondeur. Il faut remplacer pt.z par 1 s'il est nul (mais la division de l'Axe fait que ça marche quand même) et je te rappelle qu'un point avec un Z négatif est derrière toi, donc invisible. De plus, si ton point est centré sur l'origine, il faut ajouter un offset de distance à Z (par exemple 150) pour avoir du recul par rapport à la scène et effectivement voir le point autour de l'origine (sinon l'origine c'est toi, et il y a un risque que le point passe derrière toi).

_________________
[Axe] [Vous devez être inscrit et connecté pour voir ce lien], aussi compatible 82 stats !

[Vous devez être inscrit et connecté pour voir ce lien]
[Vous devez être inscrit et connecté pour voir ce lien]

Spoiler:

matrefeytontias
Platinum 1
Platinum 1

Sexe : Masculin
Age : 19
Messages : 1383
Date d'inscription : 28/09/2011
Etudes : 1ère S SI
Points Forum : 90
Points Concours : 7
Langages :
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
  • - Axe Parser
  • - Lua Nspire
  • - Ndless Nspire
Calculatrices :
  • - TI-83+.fr
  • - TI-Nspire CAS

TI-83+.fr


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par maxence le Mar 22 Oct - 14:23

Tampis pour le calcul, de toute façon ça ne marche pas.

Un Z négatif signifie normalement que le point se trouve devant moi, puisque si on a X qui part du milieu vers la droite et Y qui part du milieu vers le haut, alors Z part du milieu vers nous dans les positifs, et vers le fond dans les négatifs...

Je vais finir de lire le tuto, tester, et donner mes problèmes (si j'en ai, je n'espère pas Content) une fois ces étapes passées Clin Oeil

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par linkakro le Mar 22 Oct - 16:53

Va pour la table, moi je cherchais juste à donner des pistes.
Je suis d'accord avec la considération de rapidité et simplicité.

Pourquoi traiter des valeurs qu'on doit diviser ensuite ? Et idem pour le signe ? Je pense plus simple de définir le repère qui correspond aux valeurs binaires...
(là c'est moi qui ai besoin d'un cours d'Axe, goto tuto)

linkakro
Or 4
Or 4

Sexe : Masculin
Age : 22
Messages : 768
Date d'inscription : 01/07/2010
Etudes : dut geii (elec/info)
Points Forum : 51
Points Concours : 8
Langages :
  • - TI-Basic Z80
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
Calculatrices :
  • - TI-82 Stats.fr
  • - TI-84 Pocket.fr

TI-84+ SE


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par matrefeytontias le Mar 22 Oct - 17:32

Parce que ce sont les valeurs binaires. Je te rappelle qu'on a pas de nombres à virgule en Axe.

_________________
[Axe] [Vous devez être inscrit et connecté pour voir ce lien], aussi compatible 82 stats !

[Vous devez être inscrit et connecté pour voir ce lien]
[Vous devez être inscrit et connecté pour voir ce lien]

Spoiler:

matrefeytontias
Platinum 1
Platinum 1

Sexe : Masculin
Age : 19
Messages : 1383
Date d'inscription : 28/09/2011
Etudes : 1ère S SI
Points Forum : 90
Points Concours : 7
Langages :
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
  • - Axe Parser
  • - Lua Nspire
  • - Ndless Nspire
Calculatrices :
  • - TI-83+.fr
  • - TI-Nspire CAS

TI-83+.fr


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par nikitouzz le Jeu 31 Oct - 21:38

Le code de axecube maxence n'utilise pas du tout les 3D juste des hyperbole...

_________________
[Vous devez être inscrit et connecté pour voir cette image]
Invité née le 0 a aujord'huis 0 ans et a posté 11 messages... je suis derrière vous

2x2x2 : 2.18 secondes / 2x2x2 une main : 21.15 secondes / 2x2x2 yeux bandés : 47.59
3x3x3 : 5.97 secondes / 3x3x3 une main : 49.86 secondes
4x4x4 : 1.49 minutes / 4x4x4 une main : 6.50 minutes
5x5x5 : 4.10 minutes / 5x5x5 une main : 18.02 minutes
6x6x6 : 8.10 minutes
7x7x7 : 16.03 minutes
9x9x9 : 58.26 minutes

3x3x1 : 0.73secondes / 3x3x2 : 30.55secondes / 3x3x3 : 5.97secondes / 3x3x4 : 1.09minutes / 3x3x5 : 1.46minutes / 3x3x6 : 2.06minutes

megaminx : 5.59 minutes / pyraminx : 7.91 secondes / square-one : 1.07

nikitouzz
Platinum 1
Platinum 1

Sexe : Masculin
Age : 21
Messages : 1834
Date d'inscription : 16/01/2011
Points Forum : 7
Points Concours : 6
Langages :
  • - TI-Basic Z80
  • - ASM TI-83+ / TI-84+
  • - Axe Parser
  • - TI-Basic 68K
  • - TI-Basic Nspire
Calculatrices :
  • - TI-73
  • - TI-76.fr
  • - TI-82 Stats.fr
  • - TI-83+
  • - TI-84+
  • - TI-92
  • - TI-Nspire
  • - TI-Nspire CX

TI-84+ SE


Revenir en haut Aller en bas

Re: [AXE] Problème précision (cos et sin)

Message par Contenu sponsorisé Aujourd'hui à 4:54


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum