| |||||
| 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 |
| Aperçu |
|---|
| 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 |
|
| Mara's dad |
|
| 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 |
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 | 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 :
|
| 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 :
|
| 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 |
|
| 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 !
|
| 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. :) |




