/*************************************************************************************************************************************/
/* */
/* C O N S T R U C T I O N D ' U N R E F E R E N T I E L O R T H O N O R M E */
/* D O N T L ' A X E ' Z ' E S T D O N N E : */
/* */
/* */
/* Author of '$xtc/referentiel.01$c' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20161220135707). */
/* */
/*************************************************************************************************************************************/
#include "INCLUDES.01.I"
extern double acos();
#define Definition_OX(a1,a2,a3,c1,c2,c3) \
{ \
if (c1 != 0) \
{ \
a2 = +1; \
a3 = +1; \
a1 = -((a2*c2)+(a3*c3))/c1; \
/* Le vecteur {a1,a2,a3} est calcule "arbitrairement" tel qu'il soit orthogonal au */ \
/* vecteur {c1,c2,c3}. Leur produit scalaire est donc nul : */ \
/* */ \
/* a1.c1 + a2.c2 + a3.c3 = 0 */ \
/* */ \
/* en supposant que la coordonnee 'c1' n'est pas nulle (ce que l'on teste avant d'appeler */ \
/* 'Definition_OX(...)' et ce que l'on reverifie ici), on fixe arbitrairement : */ \
/* */ \
/* a2 = 1 */ \
/* a3 = 1 */ \
/* */ \
/* d'ou la valeur de 'a1'... */ \
} \
else \
{ \
printf("Erreur de logique.\n"); \
/* Et oui, puisqu'un tel test a ete deja fait juste avant l'appel a 'Definition_OX(...)'... */ \
} \
}
#define ProduitVectoriel_1(c1,c2,c3,a1,a2,a3) \
NEUT(DET2(c2,c3 \
,a2,a3 \
) \
)
#define ProduitVectoriel_2(c1,c2,c3,a1,a2,a3) \
NEGA(DET2(c1,c3 \
,a1,a3 \
) \
)
#define ProduitVectoriel_3(c1,c2,c3,a1,a2,a3) \
NEUT(DET2(c1,c2 \
,a1,a2 \
) \
)
/* Produit vectoriel : */
/* */
/* (b1,b2,b3) = (c1,c2,c3) /\ (a1,a2,a3) */
/* */
#define NORME(a1,a2,a3) \
sqrt(((a1)*(a1))+((a2)*(a2))+((a3)*(a3)))
#define NormalisationVecteur(a1,a2,a3) \
{ \
double norme=NORME(a1,a2,a3); \
\
a1 = a1/norme; \
a2 = a2/norme; \
a3 = a3/norme; \
}
int main()
{
int calculer=VRAI;
double X1,X2,X3;
double Y1,Y2,Y3;
double Z1,Z2,Z3;
/* Definition d'un nouveeau referentiel 'XYZ' par rapport a l'ancien 'xyz'... */
double alpha,beta,gamma;
Z1 = +1;
Z2 = 0;
Z3 = 0;
/* Definition de l'axe 'OZ' (arbitraire...) "autour" duquel on souhaite creer un */
/* referentiel {OX,OY,OZ} direct et orthornome... */
/* */
/* Cet axe 'OZ' c'est, par exemple, un vecteur tangent a une courbe... */
if (Z1 != 0)
{
Definition_OX(X1,X2,X3,Z1,Z2,Z3);
}
else
{
if (Z2 != 0)
{
Definition_OX(X2,X3,X1,Z2,Z3,Z1);
}
else
{
if (Z3 != 0)
{
Definition_OX(X3,X1,X2,Z3,Z1,Z2);
/* Definition de l'axe 'OX' tel qu'il soit orthogonal a l'axe 'OZ' (mais de facon */
/* arbitraire...). */
}
else
{
printf("Le vecteur (Z1,Z2,Z3) est le vecteur nul, le calcul est donc impossible.\n");
calculer=FAUX;
}
}
}
if (calculer == VRAI)
{
Y1 = ProduitVectoriel_1(Z1,Z2,Z3,X1,X2,X3);
Y2 = ProduitVectoriel_2(Z1,Z2,Z3,X1,X2,X3);
Y3 = ProduitVectoriel_3(Z1,Z2,Z3,X1,X2,X3);
/* Definition de l'axe 'OY' tel qu'il soit orthogonal au plan {OX,OZ} et en faisant que */
/* le referentiel {OX,OY,OZ} ainsi cree soit direct et orthornome... */
NormalisationVecteur(X1,X2,X3);
NormalisationVecteur(Y1,Y2,Y3);
NormalisationVecteur(Z1,Z2,Z3);
printf("OX=(%+f,%+f,%+f) OY=(%+f,%+f,%+f) OZ=(%+f,%+f,%+f)\n",X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3);
/* Edition du nouveau referentiel {OX,OY,OZ}... */
if (Z3 != 1)
{
alpha = acos(Z2/sqrt(1-EXP2(Z3)));
beta = acos(Z3);
gamma = acos(Y3/sqrt(1-EXP2(Z3)));
/* Calcul des trois angles d'Euler {alpha,beta,gamma} dans le cas general... */
}
else
{
alpha = acos(X1);
beta = acos(Z3);
gamma = 0;
/* Cas ou la ligne des noeuds, intersection des plans {Ox,Oy} de l'ancien referentiel */
/* et {OX,OY} du nouveau, n'est pas definie, ces deux plans etant confondus puisque */
/* 'Z3=1', ce qui signifie que les deux referentiels {x,y,z} et {X,Y,Z} ont le meme */
/* troisieme axe ('z' et 'Z')... */
}
printf("alpha=%f beta=%f gamma=%f\n",alpha,beta,gamma);
/* Definition des trois angles d'Euler {alpha,beta,gamma} permettant de passer de l'ancien */
/* referentiel {x,y,z} au nouveau {X,Y,Z} : */
/* */
/* */
/* z * */
/* * */
/* * */
/* * */
/* * */
/* * */
/* * */
/* * Y */
/* * . */
/* * */
/* Z + * . */
/* + * */
/* +--beta--* . */
/* + * */
/* + * . . X */
/* + * . */
/* + * . . */
/* + * . */
/* + * . . */
/* + * . */
/* +* . | */
/* O* * *g* * * * * * * * * * * * * * * * * * y */
/* * a */
/* * \ m */
/* * m */
/* * \ a */
/* * | */
/* *------alpha------\ */
/* * */
/* * \ */
/* * */
/* * \ */
/* * */
/* x * \ A */
/* */
/* */
/* OA = {Ox,Oy} .INTER. {OX,OY} */
/* (ou "ligne des noeuds") */
}
else
{
}
}