Pour les forts en maths

Pour les forts en maths - Programmation

Marsh Posté le 05-07-2001 à 00:04:35    

C'est pas spécialement de la programmation, j'ai besoin d'aide avec des maths pour réaliser un programme.
 
Voilà, j'aimerais faire subir une rotation de centre (x, y) de alpha degrés à un point de coordonnées (x', y'). Et alors j'aimerais connaitre une formule pour déterminer les nouvelles coordonnées du point après la rotation.
 
Si quelqu'un pouvait m'aider.
:)

Reply

Marsh Posté le 05-07-2001 à 00:04:35   

Reply

Marsh Posté le 05-07-2001 à 00:19:18    

Salut,
 
Je te conseille de chercher du côté des matrices et de leur utilisation, notamment les matrices 4x4, tu trouveras facilement les formules pour les rotations autour des axes x,y,z.
 
Voila si tu as besoin d'aide n'hésite pas.


---------------
"Software is like sex it's better when it's free !!!! "
Reply

Marsh Posté le 05-07-2001 à 00:39:20    

Oui j'ai besoin d'aide. C'est quoi une matrice? :)
 
Avec mon petit niveau de 1ère c'est hard.
hehe

Reply

Marsh Posté le 05-07-2001 à 09:14:47    

bien que l'utilisation des matrices dans un cas plus complexe soit conseille, tu peux toujours t'en sortir simplement avec un peu de trigo (du niveau de 1er je pense... tu sais ce qu'est un sinus/cosinus non?). Prend un cercle trigo et imagine que le centre c'est ton point x,y et place ton point x',y' sur le cercle. Apres essaye de reflechir a ce qu'il se passe pour les coordonnes de ton point lorsqu'il tourne d'un angle alpha ... tu devrais trouver tout seul ;)

Reply

Marsh Posté le 05-07-2001 à 09:37:10    

Il faut que t'utilises les transformations du plan (et de l'espace) par les nombres complexes (rotations, translations, ...). Il y a les formules toutes faites dans le programme de terminale S spé math. (c'est trop loin pour moi, je m'en souviens plus...)
 
Bon courage.


---------------
Visites de cimetières -  Cimetière de Velennes - Facebook
Reply

Marsh Posté le 05-07-2001 à 09:42:12    

C'est sympa de parler de matrices, et autres nombres complexes, mais çà fait pas beaucoup avancer...
 
Je suis du même avis qu'altac, avec un beau dessin et de la trigo, on s'en sort toujours, et en plus en comprenant ce qu'on fait !
 
Alload, si t'y arrive pas, on te ferra un dessin.
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-07-2001 à 09:55:01    

Oki je vais essayer.
Merci :)

Reply

Marsh Posté le 05-07-2001 à 10:33:36    

l'inconvénient des fonctions trigonométriques pour faire une rotation, c'est que tu utilise des nombres flotants, donc tu ne travaille pas sur des valeurs exactes et si tu fais une rotation de 360°, tu risque de ne pas te retrouver à ton point de départ...
Et puis au niveau des temps de calculs, c'est pas vraiment la panacée si tu fais pleins de rotation dans tous les sens, mais c'est vrai que c'est beaucoup plus simple à implémenter.


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 05-07-2001 à 10:39:20    

Bon j'ai trouvé quelque chose, j'exprime les coordonnées du nouveau point avec une rotation d'angle ALPHA:
 
( (-1 + cos ALPHA) * distance ancien point->centre de la rotation ; sin APLHA * distance ancien point->centre de la rotation)
 
Est-ce que c'est juste? Chez moi ça a l'air.
:)
 
Mais si vous avez des techniques qui vont plus vite pour le PC, donnez les moi SVP ;)

Reply

Marsh Posté le 05-07-2001 à 10:58:37    

oui je crois qu'il y a plus rapide. En fait l'ideal c'est les matrcies mais comme tant ton cas assz simple tu n'a pas besoin de matrice 4x4 (rotation en 3d et aussi plein d'autres choses), tu peut utiliser une matrice 3x3 (rotation en 2d et ausi plein d'autres choses) mais tu peux ensuite simplifié ton problème car tu ne veux faire que des rotations.
 
En fait il fait au départ initialiser une matrice de rotation ou tu lui demande de faire une rotation d'angle alpha de centre O (0,0) l'origine du repere.
Il faut aussi une matrice de translation du point P (x,y) le vrai centre de rotation, vers l'origine et son inverse.
 
Ensuite il faut faire le produit de ses trois matrice dans un ordre tres precis et voila tu a ta mtrice de transformation !!
 
Bon c'est un peu compliqué pour ton niveau mais je vais le faire pour toi (eh oui je glande au boulot alors il faut que je m'occupe).

Reply

Marsh Posté le 05-07-2001 à 10:58:37   

Reply

Marsh Posté le 05-07-2001 à 10:58:53    

hum hum ... essaye encore ;)
tu as besoin des formules sin(a+b) et cos(a+b) pour t'en sortir en 2 lignes de calcul.
 
mareek> avec des matrices tu vas aussi utiliser des nombres flottants... je vois pas ce que tu veux dire :??:
et meme pour faire des transformations avec des matrices, il faut passer un peu par la trigo (il va y avoir les meme sinus et cosinus dans ta matrice que dans la formule originale, y'a rien de magique dans le calcul matriciel).

Reply

Marsh Posté le 05-07-2001 à 11:01:17    

arretez de lui parler de matrices :) il est en 1ere, il a bien le temps avant d'y toucher ! et avant de faire des transformations matricielles, il faut au moins comprendre les bases de la trigo, sinon c'est pas gagne pour la suite.

Reply

Marsh Posté le 05-07-2001 à 12:56:48    

D'ac avec altac! Je vois vraiement pas comment les matrices sont plus rapides pour un problème aussi simple.
 
En plus, Initialisation de la matrice, calcul de rotation, calcul de translation, récupération des résultats ! Ouf, tu trouve çà simple comme algo ?
Alors qu'ont peut tout faire en 4 lignes de code pour le calcul !

Code :
  1. <?php
  2. $alpha = 30; // Par exemple en degré
  3. $xP = 10;    // Abscisse du point
  4. $yP = 5;     // Ordonnée du point
  5. $xO = 1;     // Abscisse de l'origine
  6. $yO = 1;     // Ordonnée de l'origine
  7. // Calcul du rayon du cercle
  8. $R = sqrt( ( $xP - $xO )*( $xP - $xO ) + ( $yP - $yO )*( $yP - $yO ) );
  9. // Calcule de l'angle initial
  10. $beta = ( aTan( ( $yP-$yO ) / ( $xP - $yO ) ) );
  11. // Calcul de l'abscisse du nouveau point
  12. $xPP = $xO + $R * cos( deg2rad( $alpha ) + $beta );
  13. // Calcul de l'ordonnée du nouveau point
  14. $yPP = $yO + $R * sin( deg2rad( $alpha ) + $beta );
  15. echo( "x = $xPP<br>" );
  16. echo( "y = $yPP<br>" );
  17. ?>


 
Sauf erreur de ma part, bien sûr ;)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-07-2001 à 13:04:25    

Oups, je sais pas lire le PHP moi :D
 
Je connais que le C++ :)

Reply

Marsh Posté le 05-07-2001 à 13:15:39    

En plus, j'ai l'impression qu'il y a une erreur dans le calcul de $beta !
 
Je regarde, et j'envoie la correction en PHP !
Je connais pas le C++ moi ;)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-07-2001 à 13:18:53    

C'est bon, j'ai trouvé, encore une erreur de copier/coller :
// Calcule de l'angle initial
$beta = ( aTan( ( $yP - $yO ) / ( $xP - $xO ) ) );


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-07-2001 à 14:03:16    

darkoli a écrit a écrit :

oui je crois qu'il y a plus rapide. En fait l'ideal c'est les matrcies mais comme tant ton cas assz simple tu n'a pas besoin de matrice 4x4 (rotation en 3d et aussi plein d'autres choses), tu peut utiliser une matrice 3x3 (rotation en 2d et ausi plein d'autres choses) mais tu peux ensuite simplifié ton problème car tu ne veux faire que des rotations.
 
En fait il fait au départ initialiser une matrice de rotation ou tu lui demande de faire une rotation d'angle alpha de centre O (0,0) l'origine du repere.
Il faut aussi une matrice de translation du point P (x,y) le vrai centre de rotation, vers l'origine et son inverse.
 
Ensuite il faut faire le produit de ses trois matrice dans un ordre tres precis et voila tu a ta mtrice de transformation !!
 
Bon c'est un peu compliqué pour ton niveau mais je vais le faire pour toi (eh oui je glande au boulot alors il faut que je m'occupe).  




 
hmm tu pourrai expliquer plus precisement ou me filer une url ? (note: je suis en iut :) )

Reply

Marsh Posté le 05-07-2001 à 14:37:54    

Une url trouvée sur www.thot.cursus.edu pour la trigo :
http://thot.cursus.edu/rubrique.asp?no=6866 (chercher trigonométrie avec l'accent ds les archives) de thot.
Vaut mieux prendre l'habitude de raisonner en radians +tôt qu'en degrés, ça aide, d'autant qu'en général, les langages de programmation utilisent cette unité.


---------------
di. / www.diredaredare.org - Ailes de la ville
Reply

Marsh Posté le 05-07-2001 à 14:53:24    

bon ben j'explique. Tu veux faire une rotation 2d autour d'une point P(x,y) d'angle alpha.
 
Pour faire des rotations tu peux utiliser les matrices projectives mais c'est un peu complexe à expliqué alors je simplifie :

Code :
  1. [r r t]
  2. [r r t]
  3. [p p h]


 
Le groupe r representent l'endroit ou tu dois dire que tu veux faire une rotation (je sais c'est super mal expliqué). Le groupe t c'est pour une translation. LEs autres ne sont pas utiles. Exemple :

Code :
  1. [1 0 0]
  2. [0 1 0]
  3. [0 0 1]


c'est la matrice identité donc c'est l'operation 'on fait rien'

Code :
  1. [1 0 1]
  2. [0 1 0]
  3. [0 0 1]


Ca c'est pour faire une translation de de 1 en x.
 
Pour representer les points on utilise une matrice colonne :

Code :
  1. [x]
  2. [y]
  3. [w] // ignoré


Si il y a trois coordonnées c'est par ce que c'est des coordonnées projective, donc dans notre cas en s'en fout du w, mais il faut quand meme le mettre.
 
Pour faire subir à un point une transformation, il faut mulitplier la matrice de transformation avec celle du point :
 
T*P (et uniquement comme ca pas dans l'autre ordre)
 
Pour la suite attendez un peu il faut que je me concentre

Reply

Marsh Posté le 05-07-2001 à 15:08:24    

voici la matrice de rotation 2d :

Code :
  1. [c -s  0]
  2. [s  c  0]
  3. [0  0  1]


Avec c=cos(alpha) et s=sin(alpha), alpha en radian.
On multiplie avec le point :
Ce qui donne :

Code :
  1. [c -s  0]   [x]   [cx - sy + 0]
  2. [s  c  0] * [y] = [sx + cy + 0]
  3. [0  0  1]   [1]   [...        ] On s'en fou


 
donc on a :
  nouveau_x = cx - sy
  nouveau_y = sx + cy
 
Donc si on précalcule c et s avant, le calcul est tres rapide et il n'est utile d'avoir à retrouvé l'angle initiale du point pour y ajouter l'angle de rotation. C'est donc 15 000 000 fois plus rapide.

Reply

Marsh Posté le 05-07-2001 à 15:44:32    

Donc ta matrice de rotation en 2d, elle fait une rotation autour du point d'origine, donc y'a 2 translations à ajouter, une avant rotation et une après.
Ce qui, en une seule opération, me donne :  
 
$xPP = $xO + ( ( $xP - $xO ) * cos( $alpha ) - ( $yP - $yO ) * sin( $alpha ) );
$yPP = $yO + ( ( $xP - $xO ) * sin( $alpha ) + ( $yP - $yO ) * cos( $alpha ) );
 
Ok, je suis convaincu, c'est plus simple !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-07-2001 à 15:46:39    

Mara's dad> ton calcul est bien trop complique :D ...
 
en fait ca se resume a :
 
soit a l'angle entre l'axe des x et le point initial A(x,y)
soit b l'angle de rotation desire
 
alors en placant l'origine sur le centre de rotation on a, pour le nouveau point A'(x',y') :
 
x' = cos(a+b)*R
y' = sin(a+b)*R
 
(R etant la distance entre le centre de rotation et le point A)
 
d'ou
 
x' = R*[ cos(a)*cos(b) - sin(a)*sin(b) ] = x*cos(b) - y*sin(b)
y' = R*[ cos(a)*sin(b) + sin(a)*cos(b) ] = x*sin(b) + y*cos(b)
 
en effet :  
 
x = R*cos(a)
y = R*sin(a)
 
je crois pas me tromper ...

Reply

Marsh Posté le 05-07-2001 à 15:49:29    

Apres, bien sur, vous pouvez mettre ca sous forme matricielle comme darkoli (et ajouter la translation du centre de rotation).

Reply

Marsh Posté le 05-07-2001 à 15:52:53    

sorry Mara's dad, j'avais pas vu ta correction ...

Reply

Marsh Posté le 05-07-2001 à 16:02:32    

Ben c'est ce que j'ai fait !
 
Rotation simple :
x' = x*cos(b) - y*sin(b)  
y' = x*sin(b) + y*cos(b)  
 
si O(xO, yO) est l'origine, la translation c'est bien :
 
x' = x - xO
y' = y - yO
 
En combinant Rotation avec translation avant et après :
x' = xO + ( x - xO )*cos(b) - ( y - yO )*sin(b)
y' = YO + ( x - xO )*sin(b) + ( y - yO )*cos(b)
 
C'est bien ce que j'ai écrit non ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-07-2001 à 16:03:25    

Bon, bein, sorry aussi alors ;)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-07-2001 à 16:07:01    

Une belle illustration du SIN(A+B), SIN(A-B)...
 
http://www.ies.co.jp/math/products [...] ahote.html


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-07-2001 à 19:33:55    

Ma formule marche ou pas?
 
ALPHA  = angle de la rotation
D = distance entre le point et le centre de la rotation
 
x' = x - [ (-1 + cos ALPHA) * D ]
y' = y + [ sin APLHA * D ]

Reply

Marsh Posté le 05-07-2001 à 21:04:04    

Alload a écrit a écrit :

Ma formule marche ou pas?
 
ALPHA  = angle de la rotation
D = distance entre le point et le centre de la rotation
 
x' = x - [ (-1 + cos ALPHA) * D ]
y' = y + [ sin APLHA * D ]  




 
Essaie plutot ca a mon avis mais je suis pas sur :
 
  x' := x - sin(alpha) * D
  y' := y - cos(alpha) * D
 
Si tu veux faire un truc encore plus propre tu fais un tableau et les valeurs de cos et sin pré-calculés, je te dit surtout si veux faire de la 3D ca évite de recalculer plein de truc... :crazy:


---------------
"Software is like sex it's better when it's free !!!! "
Reply

Marsh Posté le 05-07-2001 à 22:41:10    

Arlo13 a écrit a écrit :

Si tu veux faire un truc encore plus propre tu fais un tableau et les valeurs de cos et sin pré-calculés, je te dit surtout si veux faire de la 3D ca évite de recalculer plein de truc... :crazy:  



surtout pas ! ça c'était bon sur les pentium & co ... ça bouffe de la ram, précision pas top, ça alourdit le code, et surtout ça fait des cache miss à gogo. au final, c'est plus pénalisant qu'un bon fcos ou fsin.

Reply

Marsh Posté le 05-07-2001 à 23:10:24    

youdontcare a écrit a écrit :

 surtout pas ! ça c'était bon sur les pentium & co ... ça bouffe de la ram, précision pas top, ça alourdit le code, et surtout ça fait des cache miss à gogo. au final, c'est plus pénalisant qu'un bon fcos ou fsin.  




 
Humm pas d'accord, un tableau de 360 single ca pèse vraiment pas lourd tu sais. Lorsque tu dois faire environ 200 fcos et 200 fsin par seconde, c'est beaucoup plus lent que de lire une variable dans un tableau.
Enfin chacun sa méthode, mais j'ai tiré cette méthode d'un moteur 3D très performant.


---------------
"Software is like sex it's better when it's free !!!! "
Reply

Marsh Posté le 06-07-2001 à 00:52:31    

Arlo13> ca date un peu ce genre d'optimisation ... c'est ce qu'on faisait y'a plus de 6 ans car les instructions flottantes etaient lentes (on faisait aussi des calculs en virgule fixe...etc). Aujourd'hui tout a change et heureusement !! Pourquoi les proc AMD marchent tres bien dans les jeux 3D ? Parce qu'ils ont une FPU performante et que tous les moteurs 3D actuels utilisent directement la FPU. Regarde les docs sur DirectX ou OpenGL si tu veux.

Reply

Marsh Posté le 06-07-2001 à 00:57:17    

"Lorsque tu dois faire environ 200 fcos et 200 fsin par seconde,"
 
en plus tu ne fais pas beaucoup de calculs trigo par seconde car dans un moteur 3D tu precalcules tes matrices de transformation/projection une fois et tu peux les appliquer a autant de points que necessaire sans recalculer de sinus/cosinus.

Reply

Marsh Posté le 06-07-2001 à 01:01:17    

Alload> Non, ta formule ne marche pas, il n'y a qu'une solution au probleme et elle a deja etait donnee :)

Reply

Marsh Posté le 06-07-2001 à 03:57:14    

Alload a écrit a écrit :

Ma formule marche ou pas?
 
ALPHA  = angle de la rotation
D = distance entre le point et le centre de la rotation
 
x' = x - [ (-1 + cos ALPHA) * D ]
y' = y + [ sin APLHA * D ]



 
Centre de rotation (xO, yO)
Point à déplacer (x,y)
Angle (Alpha)
Point calculé (x',y')
 
x' = xO + ( x - xO ) * cos( Alpha ) - ( y - yO ) * sin( Alpha )
y' = YO + ( x - xO ) * sin( Alpha ) + ( y - yO ) * cos( Alpha )


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 06-07-2001 à 10:20:42    

altac a écrit a écrit :

"Lorsque tu dois faire environ 200 fcos et 200 fsin par seconde,"
 
en plus tu ne fais pas beaucoup de calculs trigo par seconde car dans un moteur 3D tu precalcules tes matrices de transformation/projection une fois et tu peux les appliquer a autant de points que necessaire sans recalculer de sinus/cosinus.  




 
De plus il existe une instruction magique qui est fsincos qui calcul simltaneement le sinus et le cosinus d'un anlge donné. En gros au lieu de faire un cos + un sin ou fait un sincos et on a les deux reponses en meme temps.

Reply

Marsh Posté le 06-07-2001 à 10:23:19    

exact

Reply

Marsh Posté le 06-07-2001 à 18:14:01    

okay je connaissais pas, merci de partager vos connaissances :)
Je vais donc abandonner mon tableau de cos et sin ;)
 
@+


---------------
"Software is like sex it's better when it's free !!!! "
Reply

Marsh Posté le 08-07-2001 à 19:44:11    

Putain... ce ke c bo une matrice ... J'en ai les larme aux yeux :D
Meme si jai toujours pas compris pkoi tu fous cos et sin la où ils sont dans la matrice, et ke tout ca, ca te fais une rotation :D:D:D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed