Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2113 connectés 

  FORUM HardWare.fr
  Programmation

  Pour les forts en maths

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pour les forts en maths

n°44647
Alload
Posté le 05-07-2001 à 00:04:35  profilanswer
 

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.
:)

mood
Publicité
Posté le 05-07-2001 à 00:04:35  profilanswer
 

n°44649
Arlo13
Posté le 05-07-2001 à 00:19:18  profilanswer
 

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 !!!! "
n°44651
Alload
Posté le 05-07-2001 à 00:39:20  profilanswer
 

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

n°44680
altac
Posté le 05-07-2001 à 09:14:47  profilanswer
 

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 ;)

n°44693
akanico
Captain Slow
Posté le 05-07-2001 à 09:37:10  profilanswer
 

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 -  INSTA - FB
n°44696
Mara's dad
Yes I can !
Posté le 05-07-2001 à 09:42:12  profilanswer
 

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é.
n°44705
Alload
Posté le 05-07-2001 à 09:55:01  profilanswer
 

Oki je vais essayer.
Merci :)

n°44720
mareek
Et de 3 \o/
Posté le 05-07-2001 à 10:33:36  profilanswer
 

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
n°44721
Alload
Posté le 05-07-2001 à 10:39:20  profilanswer
 

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 ;)

n°44736
darkoli
Le Petit Dinosaure Bleu
Posté le 05-07-2001 à 10:58:37  profilanswer
 

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).

mood
Publicité
Posté le 05-07-2001 à 10:58:37  profilanswer
 

n°44738
altac
Posté le 05-07-2001 à 10:58:53  profilanswer
 

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).

n°44739
altac
Posté le 05-07-2001 à 11:01:17  profilanswer
 

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.

n°44777
Mara's dad
Yes I can !
Posté le 05-07-2001 à 12:56:48  profilanswer
 

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é.
n°44778
Alload
Posté le 05-07-2001 à 13:04:25  profilanswer
 

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

n°44783
Mara's dad
Yes I can !
Posté le 05-07-2001 à 13:15:39  profilanswer
 

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é.
n°44784
Mara's dad
Yes I can !
Posté le 05-07-2001 à 13:18:53  profilanswer
 

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é.
n°44810
sanglier04
Posté le 05-07-2001 à 14:03:16  profilanswer
 

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 :) )

n°44833
instantdha​rma
Ailleurs c'est ici
Posté le 05-07-2001 à 14:37:54  profilanswer
 

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
n°44839
darkoli
Le Petit Dinosaure Bleu
Posté le 05-07-2001 à 14:53:24  profilanswer
 

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

n°44843
darkoli
Le Petit Dinosaure Bleu
Posté le 05-07-2001 à 15:08:24  profilanswer
 

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.

n°44849
Mara's dad
Yes I can !
Posté le 05-07-2001 à 15:44:32  profilanswer
 

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é.
n°44852
altac
Posté le 05-07-2001 à 15:46:39  profilanswer
 

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 ...

n°44855
altac
Posté le 05-07-2001 à 15:49:29  profilanswer
 

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

n°44857
altac
Posté le 05-07-2001 à 15:52:53  profilanswer
 

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

n°44860
Mara's dad
Yes I can !
Posté le 05-07-2001 à 16:02:32  profilanswer
 

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é.
n°44864
Mara's dad
Yes I can !
Posté le 05-07-2001 à 16:03:25  profilanswer
 

Bon, bein, sorry aussi alors ;)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°44867
Mara's dad
Yes I can !
Posté le 05-07-2001 à 16:07:01  profilanswer
 

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é.
n°44896
Alload
Posté le 05-07-2001 à 19:33:55  profilanswer
 

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 ]

n°44902
Arlo13
Posté le 05-07-2001 à 21:04:04  profilanswer
 

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 !!!! "
n°44914
youdontcar​e
Posté le 05-07-2001 à 22:41:10  profilanswer
 

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.

n°44920
Arlo13
Posté le 05-07-2001 à 23:10:24  profilanswer
 

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 !!!! "
n°44922
altac
Posté le 06-07-2001 à 00:52:31  profilanswer
 

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.

n°44923
altac
Posté le 06-07-2001 à 00:57:17  profilanswer
 

"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.

n°44925
altac
Posté le 06-07-2001 à 01:01:17  profilanswer
 

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

n°44933
Mara's dad
Yes I can !
Posté le 06-07-2001 à 03:57:14  profilanswer
 

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é.
n°44965
darkoli
Le Petit Dinosaure Bleu
Posté le 06-07-2001 à 10:20:42  profilanswer
 

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.

n°44966
altac
Posté le 06-07-2001 à 10:23:19  profilanswer
 

exact

n°45105
Arlo13
Posté le 06-07-2001 à 18:14:01  profilanswer
 

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 !!!! "
n°45224
wouatouwou​atou
Posté le 08-07-2001 à 19:44:11  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  Pour les forts en maths

 

Sujets relatifs
[MATHS, Pascal], puissance x[Maths] Interpolation dans l'espace
[VB 6 / maths] Urgent : changement du log neperien en log 10Est-ce que vous connaissez l'adresse d'un bon forum de maths ?
Plus de sujets relatifs à : Pour les forts en maths


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)