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