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

 


Dernière réponse
Sujet : Pour les forts en maths
wouatouwouatou 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

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
wouatouwouatou 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
Arlo13 okay je connaissais pas, merci de partager vos connaissances :)
Je vais donc abandonner mon tableau de cos et sin ;)
 
@+
altac exact
darkoli

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.

Mara's dad

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 )

altac Alload> Non, ta formule ne marche pas, il n'y a qu'une solution au probleme et elle a deja etait donnee :)
altac "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.
altac 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.
Arlo13

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.

youdontcare

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.

Arlo13

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:

Alload 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 ]
Mara's dad Une belle illustration du SIN(A+B), SIN(A-B)...
 
http://www.ies.co.jp/math/products [...] ahote.html
Mara's dad Bon, bein, sorry aussi alors ;)
Mara's dad 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 ?
altac sorry Mara's dad, j'avais pas vu ta correction ...
altac Apres, bien sur, vous pouvez mettre ca sous forme matricielle comme darkoli (et ajouter la translation du centre de rotation).
altac 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 ...
Mara's dad 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 !
darkoli 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.

darkoli 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

instantdharma 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é.
sanglier04

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

Mara's dad C'est bon, j'ai trouvé, encore une erreur de copier/coller :
// Calcule de l'angle initial
$beta = ( aTan( ( $yP - $yO ) / ( $xP - $xO ) ) );
Mara's dad 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 ;)
Alload Oups, je sais pas lire le PHP moi :D
 
Je connais que le C++ :)
Mara's dad 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 ;)

altac 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.
altac 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).
darkoli 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).
Alload 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 ;)
mareek 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.
Alload Oki je vais essayer.
Merci :)
Mara's dad 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+
akanico 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.
altac 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 ;)
Alload Oui j'ai besoin d'aide. C'est quoi une matrice? :)
 
Avec mon petit niveau de 1ère c'est hard.
hehe
Arlo13 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.
Alload 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.
:)

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