Rotation 2d (coordonnés polaires) [Résolu]

Signaler
Messages postés
193
Date d'inscription
mercredi 7 septembre 2005
Statut
Membre
Dernière intervention
8 juillet 2010
-
Messages postés
112
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
5 novembre 2009
-
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

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Probablement un problème de précision. Utilise des double au lieu des float, et dis-nous si ça s'améliore.
Messages postés
112
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
5 novembre 2009

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
Messages postés
112
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
5 novembre 2009

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
Messages postés
193
Date d'inscription
mercredi 7 septembre 2005
Statut
Membre
Dernière intervention
8 juillet 2010

J'y avais pensé mais ce changement n'y a rien changé :s. Y'aurait il un auter moyen ??
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Oui, cela peut s'écrire directement :
x'=x*cos(z)-y*sin(z)
y'=x*sin(z)+y*cos(z)
Messages postés
193
Date d'inscription
mercredi 7 septembre 2005
Statut
Membre
Dernière intervention
8 juillet 2010

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 ?)
Messages postés
193
Date d'inscription
mercredi 7 septembre 2005
Statut
Membre
Dernière intervention
8 juillet 2010

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
Messages postés
193
Date d'inscription
mercredi 7 septembre 2005
Statut
Membre
Dernière intervention
8 juillet 2010

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)
Messages postés
112
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
5 novembre 2009

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]
Messages postés
112
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
5 novembre 2009

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
Messages postés
193
Date d'inscription
mercredi 7 septembre 2005
Statut
Membre
Dernière intervention
8 juillet 2010

Si j'ai bien compris une matrice c'est comme une fonction ? cependant, après son application elle reste ?
Messages postés
112
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
5 novembre 2009

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