baby3378
Messages postés193Date d'inscriptionmercredi 7 septembre 2005StatutMembreDernière intervention 8 juillet 2010
-
24 juil. 2009 à 09:22
Kotomine
Messages postés112Date d'inscriptionlundi 29 juin 2009StatutMembreDerniè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)
Kotomine
Messages postés112Date d'inscriptionlundi 29 juin 2009StatutMembreDerniè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
Kotomine
Messages postés112Date d'inscriptionlundi 29 juin 2009StatutMembreDerniè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
baby3378
Messages postés193Date d'inscriptionmercredi 7 septembre 2005StatutMembreDerniè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 ?)
baby3378
Messages postés193Date d'inscriptionmercredi 7 septembre 2005StatutMembreDerniè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
baby3378
Messages postés193Date d'inscriptionmercredi 7 septembre 2005StatutMembreDerniè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)
Kotomine
Messages postés112Date d'inscriptionlundi 29 juin 2009StatutMembreDerniè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]
Kotomine
Messages postés112Date d'inscriptionlundi 29 juin 2009StatutMembreDerniè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