Rotation 2d (coordonnés polaires)

Résolu
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010 - 24 juil. 2009 à 09:22
Kotomine Messages postés 112 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 5 novembre 2009 - 28 juil. 2009 à 14:53
Bonjour à tous,
Voila, je suis entrain d'écrire une classe graphique et je constate un petit problème concernant ma fonction rotation.

le fonctionnement en est simple, je convertis les coordonnés (x, y) d'un point en coordonnés polaires (r, teta). ensuite, j'augmente ou diminu l'angle, et finalement reconverti en coordonnees cartésiennes :

POINT rotation(POINT buf, float z)
{


float teta;
float r = sqrt(buf.x*buf.x + buf.y*buf.y);

if (buf.y>0) {teta = acos(buf.x/r);} //convertion vers coordonnés polaires
if (buf.y<0) {teta = -acos(buf.x/r);}

buf.x=r*cos(teta+z); // convertion vers coordonnees cartésiennes
buf.y=r*sin(teta+z);
return buf;
}

Le problème est que je constate au fur et a meusure de la rotation une diminution de taille. (Par exemple, un triangle (3 points) retréçit en même temps qu'il pivote)

Auriez vous un moyen pour pallier ce phénomène ?

12 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
24 juil. 2009 à 15:35
Probablement un problème de précision. Utilise des double au lieu des float, et dis-nous si ça s'améliore.
3
Kotomine Messages postés 112 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 5 novembre 2009
27 juil. 2009 à 14:28
Ton z il vaut combien en moyenne ?

Car j'ai l'impression que tu fais une succession de rotations de faible angle !

C'est pas joli, dans la mesure où d'énormes approximations seront faites à chaque micro degré de rotation.

Je te conseillerais d'enregistrer à la fois coordonnées polaires et cartésiennes dans ton objet, si la mémoire n'est pas un soucis dans ton application (Pense à toshop qui mémorise RVB,HSR, etc à la fois)


; I'm just keeping the hopeless cross to increase the meaninglessness
3
Kotomine Messages postés 112 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 5 novembre 2009
27 juil. 2009 à 15:42
toshop = photoshop :D

Alias, le gonfleur de swap ... Il mémorise plein de choses, et je sais que des opérations succéssives dans un "plan transformée" d'image s'effectuent toujours dans le même plan (autrement dit, aucune transformée n'est faite quand tu fais 2 opérations succéssives dans fourrier par exemple)

;I'm just keeping the hopeless cross to increase the meaninglessness
3
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010
24 juil. 2009 à 16:30
J'y avais pensé mais ce changement n'y a rien changé :s. Y'aurait il un auter moyen ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
24 juil. 2009 à 17:20
Oui, cela peut s'écrire directement :
x'=x*cos(z)-y*sin(z)
y'=x*sin(z)+y*cos(z)
0
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010
27 juil. 2009 à 09:33
Merci de ta réponse, cela ne change malheureusement rien :s. Y'aurais il une methode pour augmenter la taille de la figure en même temps que son retrécissement afin de la maintenir constante ? (augmenter r peut être ?)
0
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010
27 juil. 2009 à 14:50
Merci pour ton conseil, j'avais pas pensé à concerver les coordonnés polaires en effet :-)
J'utilise un angle petit afin de rendre la rotation fluide (telle une animation). (z=0.2 radians).
Cela m'interresse Comment s'utilise toshop ???(j'ai crée une classe utilisant la SDL, pourrais-je m'en servir ?)
Merci encore pour ta réponse
0
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010
27 juil. 2009 à 15:57
a ok, :p. Jme disait aussi :s
Sauf qu'un jeu (ou un auter univers graphique et dynamique, c'est beaucoup plus gourmand).
En faite, je pense sérieusement à preséent de conserver les deux types de coordonnées (polaires et carthésiennes, c'est le même principe dans la 3d je crois)
0
Kotomine Messages postés 112 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 5 novembre 2009
27 juil. 2009 à 16:07
En général, en 3D, tu stockes tout par ajout de matrices successives.
Ces matrices indiquent un changement de repère par translation ou rotation.

En gros-simplifié, t'as

[debut de scene] [matrice initiale] [dessin du mur] [matrice de rotation] [dessin de la porte] [matrice de rotation] [dessin de la poignée][fin de scene]
0
Kotomine Messages postés 112 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 5 novembre 2009
27 juil. 2009 à 16:12
J'ai oublié de préciser naturellement que c'est le job du GPU que de simplifier l'emplilement de matrices

du genre

[matrice A] [matrice de rotation d'axe (Oz), angle 30°] [translation de vecteur 3j]

en une [matrice B]

;I'm just keeping the hopeless cross to increase the meaninglessness
0
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010
27 juil. 2009 à 16:27
Si j'ai bien compris une matrice c'est comme une fonction ? cependant, après son application elle reste ?
0
Kotomine Messages postés 112 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 5 novembre 2009
28 juil. 2009 à 14:53
Une matrice à elle seule n'est pas une fonction ; mais la multiplication par une matrice, c'est une fonction !

L'idée est de dire que tu as des variables de départ (x,y,z), ça en fait un vecteur que je vais appeler X

Les rotations, et translations peuvent tous s'écrire dans une matrice M:
[ a0 a1 a2 ]
[ b0 b1 b2 ]
[ c0 c1 c2 ]
(les coefs a,b,c dépendent du point de rotation ou du vecteur de translation)

et tu obtiens ton vecteur Y (translaté, ou rotaté ) en fesant

Y = X * M

http://fr.wikipedia.org/wiki/Produit_matriciel pour plus d'infos


; I'm just keeping the hopeless cross to increase the meaninglessness
0
Rejoignez-nous