Fonctions de rotation dans l'espace

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 177 fois - Téléchargée 34 fois

Contenu du snippet

Cet header contient des fonctions permettant de faire tourner un point dans l'espace selon les axes X,Y et Z
L'algorithme est inspiré de la geométrie avec les complexes.

Source / Exemple :


#ifndef Rotate
#define Rotate

#define precision 0.1    // c'est cette valeur qu'il faut changer pour modifier la precision 
                         // de cos et sin (multiple de 10 sinon ca créé des tableaux de taille 
                         //  non entiere
#define Pi 3.14159265358                                  //        A Y
                                                          //        |
#include <math.h>                                         //        |
                                                          //        |          X
/*Fonctions de rotation dans l'espace par Dletozeun       //        0-------->
                                                          //       /
  Utilisation:                                            //    Z /
                                                                 V
  _les 2 premiers arguments correspondent aux coordonnées dans le plan de rotation du point à faire
   tourner.
  _Les arguments Ax et Ay correspondent aux coordonnées du point représentant l'axe de rotation
   dans le plan de rotation
  _L'argument alpha représente l'angle de rotation en degrés
  
  /!\ NE PAS OUBLIER AVANT D'UTILSER CES FONCTIONS DE LANCER LA FONCTION : init_sin_cos() POUR 
      INITIALISER LES TABLEAUX SIN,COS SINON PLANTAGE GARANTI !!!
      
      ET LA FOCNTION : FreeRotate() POUR LIBERER LES TABLEAUX;         */
  

float* tabSin;
float* tabCos;
/*_________________________INITIALISATION DES TABLES COSINUS ET SINUS:__________________________*/
void init_sin_cos()
{
    tabSin=(float*)malloc((360/precision)*sizeof(float));
    tabCos=(float*)malloc((360/precision)*sizeof(float));

    
    for(float a=0;a<360;a+=precision)
    {
        int pas=(1/precision)*a;
        float Angle_rad=(a*Pi)/180;
        tabSin[pas]=sin(Angle_rad);
        tabCos[pas]=cos(Angle_rad);
    }
}
/*FIN DE L'INITIALISATION*/

float Tsin(float angle) //renvoie le sinus de angle
{
    int rang=((int)((1/precision)*angle));

    return tabSin[rang];
}

float Tcos(float angle) //renvoie le cosinus de angle
{
    int rang=((int)((1/precision)*angle));
    return tabCos[rang];
}

/*______________________________FONCTIONS DE ROTATION:________________________________________*/

void ExpRotateZ(float* x, float* y, float Ax, float Ay, float alpha)/*Rotation autour de
                                                                                l'axe Z*/
{
    float xt;
    float sinc=Tsin(alpha);
    float cosc=Tcos(alpha);
            xt=*x;

  • x=((*x)-Ax)*cosc+(Ay-(*y))*sinc+Ax; //Ces deux lignes sont surement incomprehensibles
  • y=((*y)-Ay)*cosc+(xt-Ax)*sinc+Ay; //présentées comme ca mais on les retrouve très
//vite en se souvenant de la géométrie avec les //complexes*/ } void ExpRotateY(float* x, float* z, float Ax, float Ay, float alpha)/*Rotation autour de l'axe Y*/ { float xt; float sinc=Tsin(alpha); float cosc=Tcos(alpha); xt=*x;
  • x=((*x)-Ax)*cosc+(Ay-(*z))*sinc+Ax;
  • z=((*z)-Ay)*cosc+(xt-Ax)*sinc+Ay;
} void ExpRotateX(float* y, float* z, float Ax, float Ay, float alpha)/*Rotation autour de l'axe X*/ { float yt; float sinc=Tsin(alpha); float cosc=Tcos(alpha); yt=*y;
  • y=((*y)-Ax)*cosc+(Ay-(*z))*sinc+Ax;
  • z=((*z)-Ay)*cosc+(yt-Ax)*sinc+Ay;
} void FreeRotate() { free(tabSin); free(tabCos); } #endif

Conclusion :


Voila ! J'attends les critiques permettant d'optimiser mon code.

A voir également

Ajouter un commentaire Commentaires
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
C quoi le rapport avec les sinus/cosinus? ta page est sur les matrices...
Messages postés
120
Date d'inscription
mercredi 7 mai 2003
Statut
Membre
Dernière intervention
14 janvier 2006

interessant le fil de discussion :)
mais j'aimerai consulter la doc sur gamecreator "http://prografix.games-creators.org/document/70" et il n'y a pas d'image
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
chapeau
et pour la précision des valeurs?
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
d'apres mes tests: les fonctions ainsi optimisées permettent de calculer la nouvelle position par une rotation en environ 2 ms avec Tsin et Tcos a la place de environ 4 ms avec les fonctions trigo normales :sin cos...
tout sur un amd 2100+ 1.7 GHz
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Bon je vais me répéter puisque j'avais deja posté sur ce sujet. Mais pour tout les processeurs de pentium, la fonction RDTSC (Read time stamp counter) marche tres bien. Elle retourne le nombre de cycle d'horloge depuis le dernier redémarrage. Pour les AMD, la fonction retourne un résultat étrange, mais lorsque l'on fait l'écart entre deux instants, c'est correct:

extern __inline__ unsigned long long int rdtsc()
{
unsigned long long int x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x;
}

Pour une approximation du cosinus, j'utiliserais plutot un tableau de float, et une interpolation linéaire entre chaque valeur. Ca retourne quelque chose de très correct.

L'approximation position += accélération * (delta_t)^2 est tres correct, mais faut rester au dessus de 50fps, en dessous faut faire de calcul de position par frame pour garder une certaine précision. Et puis, qui a besoin d'une telle précision ?
Le truc le plus banal comme la chute libre (dans un jeu par exemple), n'aurait besoin que de 10 rafraichissement par seconde.
Afficher les 48 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (dletozeun)