/*************************************************************************************************************************************/ /* */ /* R O T A T I O N D E V E C T E U R S S U I V A N T L E S A N G L E S D ' E U L E R : */ /* */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * ** * * * * * ** * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * ** * * * * * ** */ /* * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* */ /* ATTENTION : */ /* */ /* Lors de l'utilisation des angles */ /* d'Euler, la rotation inverse de celle */ /* qui est definie par {+theta,+psi,+phi} */ /* N'EST PAS celle qui est definie par */ /* {-theta,-psi,-phi} ! */ /* */ /* Cela peut se verifier aisement en */ /* generant deux triplets de type {theta,psi,phi} */ /* grace a : */ /* */ /* $xrv/Car_Euler.01$X $PaRaMeTrEs directe=VRAI */ /* */ /* donnant {Dtheta,Dpsi,Dphi} et : */ /* */ /* $xrv/Car_Euler.01$X $PaRaMeTrEs directe=FAUX */ /* */ /* donnant {Itheta,Ipsi,Iphi} avec : */ /* */ /* set PaRaMeTrEs="$K_VIDE" */ /* set PaRaMeTrEs="$PaRaMeTrEs""ne=1" */ /* set PaRaMeTrEs="$PaRaMeTrEs"" LISTE_V1X=... LISTE_V1Y=... LISTE_V1Z=..." */ /* set PaRaMeTrEs="$PaRaMeTrEs"" LISTE_V2X=... LISTE_V2Y=... LISTE_V2Z=..." */ /* */ /* et successivement : */ /* */ /* set PaRaMeTrEs="$PaRaMeTrEs"" pTHETA=1 pPSI=0 pPHI=0" */ /* set PaRaMeTrEs="$PaRaMeTrEs"" pTHETA=0 pPSI=1 pPHI=0" */ /* set PaRaMeTrEs="$PaRaMeTrEs"" pTHETA=0 pPSI=0 pPHI=1" */ /* */ /* Enfin, on applique {Dtheta,Dpsi,Dphi} sur un */ /* vecteur arbitraire {X1,Y1,Z1} ce qui donne */ /* un vecteur {X2,Y2,Z2}, sur lequel on applique */ /* {Itheta,Ipsi,Iphi} ce qui redonne {X1,Y1,Z1} */ /* ('v $xtz/Rot_Euler.01$Z'). */ /* */ /* On notera bien qu'alors {Dtheta,Dpsi,Dphi} */ /* et {Itheta,Ipsi,Iphi} n'ont pas de liens */ /* directs entre-eux ('v $ximD/definit.1$DEF 20030630122915'). */ /* */ /* */ /* Author of '$xrv/Rot_Euler.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20030630103416). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A L E U R S I M P L I C I T E S D E S P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define PONDERATION_X_IMPLICITE \ FZERO #define PONDERATION_Y_IMPLICITE \ FZERO #define PONDERATION_Z_IMPLICITE \ FZERO /* Ponderation de selection des coordonnees apres rotation. */ /* */ /* Le 20030703105407, le parametre 'PONDERATION_X_IMPLICITE' est passe de la valeur */ /* 'FU' a 'FZERO' par symetrie avec les autres programmes... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S F I C H I E R S : */ /* */ /*************************************************************************************************************************************/ #include xrv/ARITHMET.1d.I" /* Passage a l'allocation dynamique le 20060214182609... */ #include xrv/ARITHMET.21.I" #include xrv/champs_5.41.I" #define VX_IMPLICITE \ FU #define VY_IMPLICITE \ FZERO #define VZ_IMPLICITE \ FZERO gGENERATION_D_UN_FICHIER(fichier_LISTE_VX,liste_initiale_des_VX); gGENERATION_D_UN_FICHIER(fichier_LISTE_VY,liste_initiale_des_VY); gGENERATION_D_UN_FICHIER(fichier_LISTE_VZ,liste_initiale_des_VZ); /* Definition en memoire des fichiers definissant le vecteur 'V'. */ #define ELEMENT_DU_FICHIER_LISTE_VX(index) \ gELEMENT_DU_FICHIER(liste_initiale_des_VX,index) #define ELEMENT_DU_FICHIER_LISTE_VY(index) \ gELEMENT_DU_FICHIER(liste_initiale_des_VY,index) #define ELEMENT_DU_FICHIER_LISTE_VZ(index) \ gELEMENT_DU_FICHIER(liste_initiale_des_VZ,index) /* Acces a un element courant des fichiers definissant le vecteur 'V'. */ #define THETA_IMPLICITE \ FZERO #define PSI__IMPLICITE \ FZERO #define PHI__IMPLICITE \ FZERO gGENERATION_D_UN_FICHIER(fichier_LISTE_THETA,liste_initiale_des_THETA); gGENERATION_D_UN_FICHIER(fichier_LISTE__PSI,liste_initiale_des__PSI); gGENERATION_D_UN_FICHIER(fichier_LISTE__PHI,liste_initiale_des__PHI); /* Definition en memoire des fichiers definissant les angles d'Euler. */ #define ELEMENT_DU_FICHIER_LISTE_THETA(index) \ gELEMENT_DU_FICHIER(liste_initiale_des_THETA,index) #define ELEMENT_DU_FICHIER_LISTE__PSI(index) \ gELEMENT_DU_FICHIER(liste_initiale_des__PSI,index) #define ELEMENT_DU_FICHIER_LISTE__PHI(index) \ gELEMENT_DU_FICHIER(liste_initiale_des__PHI,index) /* Acces a un element courant des fichiers definissant les angles d'Euler. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R O T A T I O N D E V E C T E U R S S U I V A N T L E S A N G L E S D ' E U L E R : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xrv/ARITHMET.22.I" #include xci/valeurs.03.I" DEFV(Float,INIT(ponderation_X,PONDERATION_X_IMPLICITE)); DEFV(Float,INIT(ponderation_Y,PONDERATION_Y_IMPLICITE)); DEFV(Float,INIT(ponderation_Z,PONDERATION_Z_IMPLICITE)); /* Ponderation de selection des coordonnees apres rotation. */ /*..............................................................................................................................*/ #include xrv/champs_5.1A.I" /* Ceci fut introduit le 20070103172821... */ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers"); Eblock ) ); PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01; PROKESF_ARGUMENT_FICHIER("LISTE_VX=" ,fichier_LISTE_VX ,liste_initiale_des_VX ,VX_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); PROKESF_ARGUMENT_FICHIER("LISTE_VY=" ,fichier_LISTE_VY ,liste_initiale_des_VY ,VY_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); PROKESF_ARGUMENT_FICHIER("LISTE_VZ=" ,fichier_LISTE_VZ ,liste_initiale_des_VZ ,VZ_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); PROKESF_ARGUMENT_FICHIER("LISTE_THETA=" ,fichier_LISTE_THETA ,liste_initiale_des_THETA ,THETA_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); PROKESF_ARGUMENT_FICHIER("LISTE_PSI=" ,fichier_LISTE__PSI ,liste_initiale_des__PSI ,PSI__IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); PROKESF_ARGUMENT_FICHIER("LISTE_PHI=" ,fichier_LISTE__PHI ,liste_initiale_des__PHI ,PHI__IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); GET_ARGUMENT_F("px=""pX=""Pond1=",ponderation_X); /* A ne pas confondre avec 'v $xig/fonct$vv$DEF ENTREE_ARGUMENT_pasX'... */ GET_ARGUMENT_F("py=""pY=""Pond2=",ponderation_Y); /* A ne pas confondre avec 'v $xig/fonct$vv$DEF ENTREE_ARGUMENT_pasY'... */ GET_ARGUMENT_F("pz=""pZ=""Pond3=",ponderation_Z); /* A ne pas confondre avec 'v $xig/fonct$vv$DEF ENTREE_ARGUMENT_pasZ'... */ PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3; /* Cette procedure fut introduite le 20070103172821... */ PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; /* Cette procedure fut introduite le 20061226193004... */ PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_5; /* Cette procedure fut introduite le 20211005104956... */ ) ); gOPERATION_SUR_LES_FICHIERS(BLOC( DEFV(Float,INIT(coordonnee_VX,ELEMENT_DU_FICHIER_LISTE_VX(index))); DEFV(Float,INIT(coordonnee_VY,ELEMENT_DU_FICHIER_LISTE_VY(index))); DEFV(Float,INIT(coordonnee_VZ,ELEMENT_DU_FICHIER_LISTE_VZ(index))); /* Recuperation des coordonnees {X,Y,Z} courantes dans les fichiers du vecteur 'V'. */ DEFV(Float,INIT(angle_theta,ELEMENT_DU_FICHIER_LISTE_THETA(index))); DEFV(Float,INIT(angle__psi,ELEMENT_DU_FICHIER_LISTE__PSI(index))); DEFV(Float,INIT(angle__phi,ELEMENT_DU_FICHIER_LISTE__PHI(index))); /* Recuperation des angles d'Euler {theta,psi,phi}. */ DEFV(deltaF_3D,vecteur_avant_rotation); DEFV(deltaF_3D,vecteur_apres_rotation); /* Definition du vecteur courant avant et apres rotation... */ DEFV(matrixF_3D,matrice_de_rotation); /* Definition de la matrice de rotation courante. */ INITIALISATION_ACCROISSEMENT_3D(vecteur_avant_rotation ,coordonnee_VX ,coordonnee_VY ,coordonnee_VZ ); /* Initialisation du vecteur courant. */ INITIALISATION_D_UNE_MATRICE_DE_ROTATION_D_EULER(matrice_de_rotation ,angle_theta ,angle__psi ,angle__phi ); /* Initialisation de la matrice de rotation d'Euler. */ PRODUIT_MATRICE_ACCROISSEMENT_3D(vecteur_apres_rotation ,matrice_de_rotation ,vecteur_avant_rotation ); /* Rotation du vecteur courant. */ ) ,LIZ3(ponderation_X,ASD1(vecteur_apres_rotation,dx) ,ponderation_Y,ASD1(vecteur_apres_rotation,dy) ,ponderation_Z,ASD1(vecteur_apres_rotation,dz) ) ,EDITER_LA_VALEUR_RESULTANTE_DANS_gOPERATION_SUR_LES_FICHIERS ,nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes ); /* Rotation de vecteurs suivant les angles d'Euler. */ lGENERATION_D_UN_FICHIER(liste_initiale_des__PHI,PHI__IMPLICITE); lGENERATION_D_UN_FICHIER(liste_initiale_des__PSI,PSI__IMPLICITE); lGENERATION_D_UN_FICHIER(liste_initiale_des_THETA,THETA_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_initiale_des_VZ,VZ_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_initiale_des_VY,VY_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_initiale_des_VX,VX_IMPLICITE); RETU_Commande; Eblock ECommande