Fonctions de rotation dans l'espace

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

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)