/*************************************************************************************************************************************/
/* */
/* T E S T D E S D I S C O N T I N U I T E S D E ' v $xrs/referentiel3D.11$I discontinuites ' : */
/* */
/* */
/* Nota : */
/* */
/* Ce programme correspond a la date du 20170202092857 */
/* a la sequence 'v $xrs/surfaces.12$I EGAL.cx.Fxyz' de */
/* calcul de la coordonnee 'cx' de 'v $xrs/helicoide.11$K'. */
/* Or 'v $xrs/helicoide.11$I Composante_X1' utilise */
/* 'v $xrs/referentiel3D.11$I CalculNouveauReferentiel' */
/* dans lequel, de par les tests de non nullite des */
/* composantes 'Z1', 'Z2' ou 'Z3', il y a un risque */
/* d'introduction de discontinuites. C'est ce que l'on verifie */
/* ici en calculant 'cx' pour differentes valeurs du */
/* parametre 'parametre_R' nulle ou proches de zero... */
/* */
/* */
/* Author of '$xtc/helicoide.11.01$c' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20170202092857). */
/* */
/*************************************************************************************************************************************/
#include <stdio.h>
#define TABULATION \
14
extern double sqrt();
extern double cos();
extern double sin();
double Definition_OX_a2=1;
double Definition_OX_a3=1;
double parametre_Ra=0.1;
double parametre_Rb=0.1;
double parametre_R=1,d_parametre_R=0;
double parametre_A=1,d_parametre_A=0;
double parametre_B=0,d_parametre_B=0;
double parametre_C=0,d_parametre_C=0;
double parametre_D=0,d_parametre_D=0;
double parametre_E=0,d_parametre_E=0;
double parametre_F=0,d_parametre_F=0;
double d_u=1;
double d_v=1;
double Composante_X1(double u,double v)
{
double Composante=444719;
double d1_XEspace=((((((d_parametre_R*cos(v)))+((parametre_R*((((0-sin(v)))*d_v))))))
+(((((d_parametre_B*u)+(parametre_B*d_u)))+(((d_parametre_C*v)+(parametre_C*d_v))))))
);
double d1_YEspace=((((((d_parametre_R*sin(v)))+((parametre_R*((cos(v)*d_v))))))
+(((((d_parametre_D*u)+(parametre_D*d_u)))+(((d_parametre_E*v)+(parametre_E*d_v))))))
);
double d1_ZEspace=(((((d_parametre_F*u)+(parametre_F*d_u)))+(((d_parametre_A*v)+(parametre_A*d_v)))));
unsigned long int CalculerLesComposantes=1;
double X1=444719;
double X2=444719;
double X3=444719;
double Y1=444719;
double Y2=444719;
double Y3=444719;
double Z1=444719;
double Z2=444719;
double Z3=444719;
Z1=d1_XEspace;
Z2=d1_YEspace;
Z3=d1_ZEspace;
if (Z1!=0)
{
if (Z1!=0)
{
printf(" Z1/");
X2=Definition_OX_a2;
X3=Definition_OX_a3;
X1=((((0-(((X2*Z2)+(X3*Z3)))))/Z1));
}
else
{
}
}
else
{
if (Z2!=0)
{
if (Z2!=0)
{
printf(" Z2/");
X3=Definition_OX_a2;
X1=Definition_OX_a3;
X2=((((0-(((X3*Z3)+(X1*Z1)))))/Z2));
}
else
{
}
}
else
{
if (Z3!=0)
{
if (Z3!=0)
{
printf(" Z3/");
X1=Definition_OX_a2;
X2=Definition_OX_a3;
X3=((((0-(((X1*Z1)+(X2*Z2)))))/Z3));
}
else
{
printf("--/");
}
}
else
{
CalculerLesComposantes=0;
}
}
}
if (CalculerLesComposantes==1)
{
Y1=(Z2*X3)+(((0-Z3)*X2));
Y2=((0-((((Z1*X3)+(((0-Z3)*X1)))))));
Y3=(Z1*X2)+(((0-Z2)*X1));
{
double norme=sqrt((((X1*X1)+(X2*X2)))+(X3*X3));
X1=X1/norme;
X2=X2/norme;
X3=X3/norme;
}
{
double norme=sqrt((((Y1*Y1)+(Y2*Y2)))+(Y3*Y3));
Y1=Y1/norme;
Y2=Y2/norme;
Y3=Y3/norme;
}
{
double norme=sqrt((((Z1*Z1)+(Z2*Z2)))+(Z3*Z3));
Z1=Z1/norme;
Z2=Z2/norme;
Z3=Z3/norme;
}
Composante=(X1);
}
else
{
Composante=0;
}
printf("CX=%+*e",TABULATION,Composante);
return(Composante);
}
double Composante_Y1(double u,double v)
{
double Composante=444719;
double d1_XEspace=((((((d_parametre_R*cos(v)))+((parametre_R*((((0-sin(v)))*d_v))))))
+(((((d_parametre_B*u)+(parametre_B*d_u)))+(((d_parametre_C*v)+(parametre_C*d_v))))))
);
double d1_YEspace=((((((d_parametre_R*sin(v)))+((parametre_R*((cos(v)*d_v))))))
+(((((d_parametre_D*u)+(parametre_D*d_u)))+(((d_parametre_E*v)+(parametre_E*d_v))))))
);
double d1_ZEspace=(((((d_parametre_F*u)+(parametre_F*d_u)))+(((d_parametre_A*v)+(parametre_A*d_v)))));
unsigned long int CalculerLesComposantes=1;
double X1=444719;
double X2=444719;
double X3=444719;
double Y1=444719;
double Y2=444719;
double Y3=444719;
double Z1=444719;
double Z2=444719;
double Z3=444719;
Z1=d1_XEspace;
Z2=d1_YEspace;
Z3=d1_ZEspace;
if (Z1!=0)
{
if (Z1!=0)
{
printf(" Z1/");
X2=Definition_OX_a2;
X3=Definition_OX_a3;
X1=((((0-(((X2*Z2)+(X3*Z3)))))/Z1));
}
else
{
}
}
else
{
if (Z2!=0)
{
if (Z2!=0)
{
printf(" Z2/");
X3=Definition_OX_a2;
X1=Definition_OX_a3;
X2=((((0-(((X3*Z3)+(X1*Z1)))))/Z2));
}
else
{
}
}
else
{
if (Z3!=0)
{
if (Z3!=0)
{
printf(" Z3/");
X1=Definition_OX_a2;
X2=Definition_OX_a3;
X3=((((0-(((X1*Z1)+(X2*Z2)))))/Z3));
}
else
{
printf("--/");
}
}
else
{
CalculerLesComposantes=0;
}
}
}
if (CalculerLesComposantes==1)
{
Y1=(Z2*X3)+(((0-Z3)*X2));
Y2=((0-((((Z1*X3)+(((0-Z3)*X1)))))));
Y3=(Z1*X2)+(((0-Z2)*X1));
{
double norme=sqrt((((X1*X1)+(X2*X2)))+(X3*X3));
X1=X1/norme;
X2=X2/norme;
X3=X3/norme;
}
{
double norme=sqrt((((Y1*Y1)+(Y2*Y2)))+(Y3*Y3));
Y1=Y1/norme;
Y2=Y2/norme;
Y3=Y3/norme;
}
{
double norme=sqrt((((Z1*Z1)+(Z2*Z2)))+(Z3*Z3));
Z1=Z1/norme;
Z2=Z2/norme;
Z3=Z3/norme;
}
Composante=(Y1);
}
else
{
Composante=0;
}
printf("CY=%+*e",TABULATION,Composante);
return(Composante);
}
double Composante_Z1(double u,double v)
{
double Composante=444719;
double d1_XEspace=((((((d_parametre_R*cos(v)))+((parametre_R*((((0-sin(v)))*d_v))))))
+(((((d_parametre_B*u)+(parametre_B*d_u)))+(((d_parametre_C*v)+(parametre_C*d_v))))))
);
double d1_YEspace=((((((d_parametre_R*sin(v)))+((parametre_R*((cos(v)*d_v))))))
+(((((d_parametre_D*u)+(parametre_D*d_u)))+(((d_parametre_E*v)+(parametre_E*d_v))))))
);
double d1_ZEspace=(((((d_parametre_F*u)+(parametre_F*d_u)))+(((d_parametre_A*v)+(parametre_A*d_v)))));
unsigned long int CalculerLesComposantes=1;
double X1=444719;
double X2=444719;
double X3=444719;
double Y1=444719;
double Y2=444719;
double Y3=444719;
double Z1=444719;
double Z2=444719;
double Z3=444719;
Z1=d1_XEspace;
Z2=d1_YEspace;
Z3=d1_ZEspace;
if (Z1!=0)
{
if (Z1!=0)
{
printf(" Z1/");
X2=Definition_OX_a2;
X3=Definition_OX_a3;
X1=((((0-(((X2*Z2)+(X3*Z3)))))/Z1));
}
else
{
}
}
else
{
if (Z2!=0)
{
if (Z2!=0)
{
printf(" Z2/");
X3=Definition_OX_a2;
X1=Definition_OX_a3;
X2=((((0-(((X3*Z3)+(X1*Z1)))))/Z2));
}
else
{
}
}
else
{
if (Z3!=0)
{
if (Z3!=0)
{
printf(" Z3/");
X1=Definition_OX_a2;
X2=Definition_OX_a3;
X3=((((0-(((X1*Z1)+(X2*Z2)))))/Z3));
}
else
{
printf("--/");
}
}
else
{
CalculerLesComposantes=0;
}
}
}
if (CalculerLesComposantes==1)
{
Y1=(Z2*X3)+(((0-Z3)*X2));
Y2=((0-((((Z1*X3)+(((0-Z3)*X1)))))));
Y3=(Z1*X2)+(((0-Z2)*X1));
{
double norme=sqrt((((X1*X1)+(X2*X2)))+(X3*X3));
X1=X1/norme;
X2=X2/norme;
X3=X3/norme;
}
{
double norme=sqrt((((Y1*Y1)+(Y2*Y2)))+(Y3*Y3));
Y1=Y1/norme;
Y2=Y2/norme;
Y3=Y3/norme;
}
{
double norme=sqrt((((Z1*Z1)+(Z2*Z2)))+(Z3*Z3));
Z1=Z1/norme;
Z2=Z2/norme;
Z3=Z3/norme;
}
Composante=(Z1);
}
else
{
Composante=0;
}
printf("CZ=%+*e",TABULATION,Composante);
return(Composante);
}
double Calcul_cx(double u_effectif,double v_effectif)
{
double CX=Composante_X1(u_effectif,v_effectif);
double CY=Composante_Y1(u_effectif,v_effectif);
double CZ=Composante_Z1(u_effectif,v_effectif);
/* On notera que 'CZ' est calcule alors qu'elle est en fait inutile. Cette inutilite vient */
/* du fait que dans la formule "exacte" donnant 'cx', elle apparait bien, mais avec un */
/* facteur multiplicatif nul d'ou sa disparition lors du processus d'optimisation et */
/* d'embellissement du code '$c' resultant de 'v $xrs/helicoide.11$K'... */
double cx=444719;
cx=((((((parametre_Ra*cos(u_effectif)))*CX))
+((((((parametre_Rb*sin(u_effectif)))*CY))
+(((((((parametre_R)*cos(v_effectif)))
+(((parametre_B*u_effectif)
+(parametre_C*v_effectif))))))))))
);
return(cx);
}
#define TEST_CALCUL_cx(R) \
{ \
double cx; \
\
parametre_R=R; \
\
cx=Calcul_cx(u_effectif,v_effectif); \
\
printf(" "); \
printf("R=%+*e cx(%+g,%+g)=%+e\n",TABULATION,parametre_R,u_effectif,v_effectif,cx); \
}
main()
{
double u,u_effectif;
double v,v_effectif;
u=1.23;
v=2.37;
u_effectif=u;
v_effectif=v;
TEST_CALCUL_cx(1e-7);
TEST_CALCUL_cx(1e-8);
TEST_CALCUL_cx(1e-153);
TEST_CALCUL_cx(1e-154);
TEST_CALCUL_cx(1e-159);
TEST_CALCUL_cx(0);
/* Et oui, on aurait pu croire que 1e-159 c'etait pratiquement 0, mais il n'en est rien et */
/* ce a cause des tests du type 'if(Z1!=0)' ci-dessus... */
}