[AXE] Problème précision (cos et sin)
4 participants
Page 1 sur 1
[AXE] Problème précision (cos et sin)
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 ?
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
- Sexe :
Age : 27
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [AXE] Problème précision (cos et sin)
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)
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
- Sexe :
Age : 30
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+
- - TI-82 Stats.fr
- - TI-84 Pocket.fr
Re: [AXE] Problème précision (cos et sin)
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 ?
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
- Sexe :
Age : 27
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [AXE] Problème précision (cos et sin)
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.
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
- Sexe :
Age : 30
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+
- - TI-82 Stats.fr
- - TI-84 Pocket.fr
Re: [AXE] Problème précision (cos et sin)
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 :
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}
matrefeytontias- Platinum 1
- Sexe :
Age : 26
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
- - TI-83+.fr
- - TI-Nspire CAS
Re: [AXE] Problème précision (cos et sin)
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 ?
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
- Sexe :
Age : 27
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [AXE] Problème précision (cos et sin)
Montre-moi le calcul des coordonnées pour voir ?
matrefeytontias- Platinum 1
- Sexe :
Age : 26
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
- - TI-83+.fr
- - TI-Nspire CAS
Re: [AXE] Problème précision (cos et sin)
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 :/
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
- Sexe :
Age : 27
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [AXE] Problème précision (cos et sin)
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).
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).
matrefeytontias- Platinum 1
- Sexe :
Age : 26
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
- - TI-83+.fr
- - TI-Nspire CAS
Re: [AXE] Problème précision (cos et sin)
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 ) une fois ces étapes passées
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 ) une fois ces étapes passées
maxence- Or 4
- Sexe :
Age : 27
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [AXE] Problème précision (cos et sin)
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)
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
- Sexe :
Age : 30
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+
- - TI-82 Stats.fr
- - TI-84 Pocket.fr
Re: [AXE] Problème précision (cos et sin)
Parce que ce sont les valeurs binaires. Je te rappelle qu'on a pas de nombres à virgule en Axe.
matrefeytontias- Platinum 1
- Sexe :
Age : 26
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
- - TI-83+.fr
- - TI-Nspire CAS
Re: [AXE] Problème précision (cos et sin)
Le code de axecube maxence n'utilise pas du tout les 3D juste des hyperbole...
nikitouzz- Platinum 1
- Sexe :
Age : 28
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
- - TI-73
- - TI-76.fr
- - TI-82 Stats.fr
- - TI-83+
- - TI-84+
- - TI-92
- - TI-Nspire
- - TI-Nspire CX
Sujets similaires
» Ti 83+.fr probleme
» probleme tilemaping
» Problème de transfert TI doc
» Gros problème...
» [AXE] Problème Pxl-Test
» probleme tilemaping
» Problème de transfert TI doc
» Gros problème...
» [AXE] Problème Pxl-Test
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|