/*************************************************************************************************************************************/
/* */
/* 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