/*************************************************************************************************************************************/ /* */ /* V I S U A L I S A T I O N D ' U N E C H A I N E D E C O N N E X I O N : */ /* */ /* */ /* Author of '$xrv/particule.31$I' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1997??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V I S U A L I S A T I O N D ' U N E C H A I N E D E C O N N E X I O N : */ /* */ /*************************************************************************************************************************************/ #define AIDER_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION \ FAUX DEFV(Local,DEFV(Logical,INIT(aider_a_la_mise_au_point_de__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION ,AIDER_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION ) ) ); #define AIDE_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION(edition) \ Bblock \ Test(IL_FAUT(aider_a_la_mise_au_point_de__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION)) \ Bblock \ BLOC(edition); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit le 20230130124849 pour aider au choix des parametres... */ #define COEFFICIENT_DE_LA_PENTE_X_DES_CHAINES_DE_CONNEXION \ FZERO #define COEFFICIENT_DE_LA_PENTE_Y_DES_CHAINES_DE_CONNEXION \ FZERO #define COEFFICIENT_DE_LA_PENTE_Z_DES_CHAINES_DE_CONNEXION \ FZERO #define COEFFICIENT_DES_PENTE_XYZ_DES_CHAINES_DE_CONNEXION \ FU DEFV(Local,DEFV(Float,INIT(coefficient_de_la_pente_X_des_chaines_de_connexion,COEFFICIENT_DE_LA_PENTE_X_DES_CHAINES_DE_CONNEXION))); DEFV(Local,DEFV(Float,INIT(coefficient_de_la_pente_Y_des_chaines_de_connexion,COEFFICIENT_DE_LA_PENTE_Y_DES_CHAINES_DE_CONNEXION))); DEFV(Local,DEFV(Float,INIT(coefficient_de_la_pente_Z_des_chaines_de_connexion,COEFFICIENT_DE_LA_PENTE_Z_DES_CHAINES_DE_CONNEXION))); DEFV(Local,DEFV(Float,INIT(coefficient_des_pente_XYZ_des_chaines_de_connexion,COEFFICIENT_DES_PENTE_XYZ_DES_CHAINES_DE_CONNEXION))); /* Introduit le 20180702094538 afin de pouvoir rendre "relatives" a la direction des */ /* connexions les definitions des splines eventuellement utilises... */ #define GARANTIR_L_EQUIDISTANCE_DES_POINTS_SUCCESSIFS_D_UNE_CHAINE_DE_CONNEXION \ FAUX DEFV(Local,DEFV(Logical,INIT(garantir_l_equidistance_des_points_successifs_d_une_chaine_de_connexion ,GARANTIR_L_EQUIDISTANCE_DES_POINTS_SUCCESSIFS_D_UNE_CHAINE_DE_CONNEXION ) ) ); /* Afin de garantir l'equidistance des points successifs d'une chaine de connexion. Ceci fut */ /* introduit le 20051213135606 et la valeur par defaut garantit la compatibilite anterieure. */ #TestADef EQUIDISTANCE_DES_POINTS_SUCCESSIFS_D_UNE_CHAINE_DE_CONNEXION_____COMPATIBILITE_20051230 \ FAUX DEFV(Local,DEFV(Logical,INIT(equidistance_des_points_successifs_d_une_chaine_de_connexion_____compatibilite_20051230 ,EQUIDISTANCE_DES_POINTS_SUCCESSIFS_D_UNE_CHAINE_DE_CONNEXION_____COMPATIBILITE_20051230 ) ) ); /* Afin d'assurer la compatibilite avec les resultats obtenus anterieurement a la date */ /* du 20051230130832... */ #TestADef EQUIDISTANCE_DES_POINTS_SUCCESSIFS_D_UNE_CHAINE_DE_CONNEXION_____COMPATIBILITE_20081109 \ FAUX DEFV(Local,DEFV(Logical,INIT(equidistance_des_points_successifs_d_une_chaine_de_connexion_____compatibilite_20081109 ,EQUIDISTANCE_DES_POINTS_SUCCESSIFS_D_UNE_CHAINE_DE_CONNEXION_____COMPATIBILITE_20081109 ) ) ); /* Afin d'assurer la compatibilite avec les resultats obtenus anterieurement a la date */ /* du 20081109112831... */ #TestADef GROSSISSEMENT_DU_RAYON_DE_VISUALISATION_DES_POINTS_____COMPATIBILITE_20250215 \ FAUX DEFV(Local,DEFV(Logical,INIT(grossissement_du_rayon_de_visualisation_des_points_____compatibilite_20250215 ,GROSSISSEMENT_DU_RAYON_DE_VISUALISATION_DES_POINTS_____COMPATIBILITE_20250215 ) ) ); /* Afin d'assurer la compatibilite avec les resultats obtenus anterieurement a la date */ /* du 20250215121531... */ #define DISTANCE_MINIMALE_ENTRE_DEUX_POINTS_SUCCESSIFS_D_UNE_CHAINE_DE_CONNEXION \ GRO5(FRA10(FRA10(FRA10(FU)))) DEFV(Local,DEFV(Float,INIT(distance_minimale_entre_deux_points_successifs_d_une_chaine_de_connexion ,DISTANCE_MINIMALE_ENTRE_DEUX_POINTS_SUCCESSIFS_D_UNE_CHAINE_DE_CONNEXION ) ) ); /* Distance minimale entre deux points successifs d'une chaine de connexion. Ceci a ete */ /* introduit le 20051213092326. Le 20051213152707, la valeur par defaut est pasee de */ /* 'F_INFINI' a une valeur finie et pertinente... */ #define FACTEUR_D_AMELIORATION_DU_LAMBDA_D_UNE_CHAINE_DE_CONNEXION \ FRA10(FU) DEFV(Local,DEFV(Float,INIT(facteur_d_amelioration_du_lambda_d_une_chaine_de_connexion ,FACTEUR_D_AMELIORATION_DU_LAMBDA_D_UNE_CHAINE_DE_CONNEXION ) ) ); /* Facteur permettant d'affiner 'lambda' de maniere iterative lorsque l'equidistance des */ /* points sucessifs est demandee... */ #define LAMBDA_MINIMAL_D_UNE_CHAINE_DE_CONNEXION \ COORDONNEE_BARYCENTRIQUE_MINIMALE #define LAMBDA_MAXIMAL_D_UNE_CHAINE_DE_CONNEXION \ COORDONNEE_BARYCENTRIQUE_MAXIMALE DEFV(Local,DEFV(Float,INIT(lambda_minimal_d_une_chaine_de_connexion,LAMBDA_MINIMAL_D_UNE_CHAINE_DE_CONNEXION))); DEFV(Local,DEFV(Float,INIT(lambda_maximal_d_une_chaine_de_connexion,LAMBDA_MAXIMAL_D_UNE_CHAINE_DE_CONNEXION))); /* Afin de pouvoir limiter l'amplitude utilisee pour le 'lambda' d'interpolation ci-apres */ /* (introduit le 20010706161609) et ainsi pouvoir ne visualiser qu'une partie des points */ /* d'une chaine de connexion (par exemple reduite a un point comme cela est utilise dans */ /* 'v $xiird/.ACIN.A.11.$U Acinus_LambdaM'). */ #define INTERPOLER_LES_CHAINES_DE_CONNEXION_PAR_DES_SPLINES_CUBIQUES \ VRAI #define NE_PAS_INTERPOLER_LES_CHAINES_DE_CONNEXION_PAR_DES_SPLINES_CUBIQUES \ NOTL(INTERPOLER_LES_CHAINES_DE_CONNEXION_PAR_DES_SPLINES_CUBIQUES) DEFV(Local,DEFV(Logical,INIT(interpoler_les_chaines_de_connexion_par_des_splines_cubiques ,NE_PAS_INTERPOLER_LES_CHAINES_DE_CONNEXION_PAR_DES_SPLINES_CUBIQUES ) ) ); /* Indique si l'on doit interpoler avec des splines cubiques ou simplement lineairement... */ #ifndef NE_PAS_GENERER_grossissement_du_rayon_de_visualisation_des_points /* Introduit le 20151207113023 pour 'v $xrc/Cfract_4D.11$K NE_PAS_GENERER_grossissement'... */ # TestADef GROSSISSEMENT_DU_RAYON_DE_VISUALISATION_DES_POINTS \ FU DEFV(Local,DEFV(Float,INIT(grossissement_du_rayon_de_visualisation_des_points,GROSSISSEMENT_DU_RAYON_DE_VISUALISATION_DES_POINTS))); /* Facteur permettant de materialiser differemment les points d'extremite et les connexions. */ # TestADef EPSILON_DE_GROSSISSEMENT_DU_RAYON_DE_VISUALISATION_DES_POINTS \ mgEPSILON DEFV(Local,DEFV(Float,INIT(epsilon_de_grossissement_du_rayon_de_visualisation_des_points ,EPSILON_DE_GROSSISSEMENT_DU_RAYON_DE_VISUALISATION_DES_POINTS ) ) ); /* Introduit le 20250215121531 pour tenir compte des arrondis lors du choix de grossir */ /* le rayon ou pas... */ #Aifndef NE_PAS_GENERER_grossissement_du_rayon_de_visualisation_des_points #Eifndef NE_PAS_GENERER_grossissement_du_rayon_de_visualisation_des_points #define INDEX_DE_CONSTRUCTION_DE_LA_CHAINE_DE_CONNEXION \ UN #define compatibilite_20051230_de_l_equidistance_des_points_successifs \ equidistance_des_points_successifs_d_une_chaine_de_connexion_____compatibilite_20051230 \ /* Afin de raccourcir la longueur de la ligne qui l'utilise... */ Denumer04(INIS(METHODE_DE_MODULATION_DU_LAMBDA_DES_DERIVEES_NEUT,UN) ,METHODE_DE_MODULATION_DU_LAMBDA_DES_DERIVEES_COSX ,METHODE_DE_MODULATION_DU_LAMBDA_DES_DERIVEES_SINX ,METHODE_DE_MODULATION_DU_LAMBDA_DES_DERIVEES_TANH ,methodes_de_modulation_du_lambda_des_derivees ); DEFV(Local,DEFV(Int,INIT(choix_de_la_methode_de_modulation_du_lambda_des_derivees,METHODE_DE_MODULATION_DU_LAMBDA_DES_DERIVEES_NEUT))); DEFV(Local,DEFV(Float,INIT(facteur_du_lambda_des_derivees,FU))); DEFV(Local,DEFV(Float,INIT(translation_du_lambda_des_derivees,FZERO))); DEFV(Local,DEFV(Float,INIT(facteur_modulation_du_lambda_des_derivees,FU))); DEFV(Local,DEFV(Float,INIT(translation_modulation_du_lambda_des_derivees,FZERO))); /* Introduit le 20180528094155 afin de permettre la modulation du 'lambda' des derivees */ /* tout specialement pour 'v $xrv/particule.10$K VISUALISATION_D_UNE_CHAINE_DE_CONNEXION' */ /* lors de la mise au point des images du type 'v $xiird/NETW.33'... */ #define MASSE_DES_POINTS_EXTREMES___D_UN_SEGMENT \ FLOT(EXIST) #define MASSE_DES_POINTS_INTERIEURS_D_UN_SEGMENT \ FLOT(NEXIST) /* Introduit le 20240519081857... */ #define grossissement_rayon_visualisation_____compatibilite_20250215 \ grossissement_du_rayon_de_visualisation_des_points_____compatibilite_20250215 #define epsilon_de_grossissement_rayon_visualisation \ epsilon_de_grossissement_du_rayon_de_visualisation_des_points /* Introduit le 20250215122855 afin de raccourcir quelques lignes a venir... */ #define VISUALISATION_D_UNE_CHAINE_DE_CONNEXION(Ax,Ay,Az,Adcx,Adcy,Adcz,Ar,Bx,By,Bz,Bdcx,Bdcy,Bdcz,Br,Np,N,c,Adx,Ady,Adz,Bdx,Bdy,Bdz) \ /* Le 20051213144859 l'argument 'n' a ete rebaptise 'N' car, en effet, le nom 'n' */ \ /* interferait malheureusement avec des chaines du type "\n" utilise dans des editions */ \ /* en phase de mise au point... */ \ /* */ \ /* ATTENTION : ne pas confondre {Adcx,Adcy,Adcz,Bdcx,Bdcy,Bdcz} qui concernent le coloriage */ \ /* et {Adx,Ady,Adz,Bdx,Bdy,Bdz} qui concernent les tangentes... */ \ Bblock \ DEFV(Positive,INIT(compteur_des_points_memorises_pour_la_chaine_de_connexion_courante,ZERO)); \ /* Compteur introduit le 20230130124849 a des fins de validation... */ \ DEFV(Logical,INIT(la_construction_de_la_chaine_de_connexion_est_achevee,FAUX)); \ DEFV(Int,INIT(index_de_construction_de_la_chaine_de_connexion,INDEX_DE_CONSTRUCTION_DE_LA_CHAINE_DE_CONNEXION)); \ /* Indicateurs de controle de la chaine de connexion... */ \ DEFV(Float,INIT(EnTete_de_sauvegardM ## rayon_de_visualisation,rayon_de_visualisation)); \ /* Sauvegarde du rayon de visualisation avant sa modification. Ne pas le faire a des */ \ /* consequences graves dans le cas de la visualisation des axes au cas ou plusieurs */ \ /* images sont generees : pour les suivantes, le rayon de visualisation s'il n'est pas */ \ /* reinitialise se retrouve avec cette valeur... */ \ DEFV(Float,INIT(Ar_local,Ar)); \ DEFV(Float,INIT(Br_local,Br)); \ /* Memorisation locale des rayons {Ar,Br} au cas ou l'un ou l'autre aurait la mauvaise */ \ /* idee d'etre en fait 'rayon_de_visualisation' (defaut corrige le 20010510122057). */ \ DEFV(Float,INIT(distance_minimale_effective_entre_deux_points_successifs \ ,COND(IL_FAUT(compatibilite_20051230_de_l_equidistance_des_points_successifs) \ ,distance_minimale_entre_deux_points_successifs_d_une_chaine_de_connexion \ ,DIVI(distance_minimale_entre_deux_points_successifs_d_une_chaine_de_connexion \ ,rapport_courant_du_zoom \ ) \ ) \ ) \ ); \ /* Petite optimisation introduite le 20230130155951... */ \ DEFV(Float,INIT(c_x_precedent,FLOT__UNDEF)); \ DEFV(Float,INIT(c_y_precedent,FLOT__UNDEF)); \ DEFV(Float,INIT(c_z_precedent,FLOT__UNDEF)); \ /* Coordonnees du point precedant le point courant {c_x,c_y,c_z} dans la chaine en */ \ /* construction (introduit le 20051213092326). */ \ DEFV(Float,INIT(pas_de_lambda \ ,DIVI(AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES \ ,FLOT(SOUS(Np \ ,INDEX_DE_CONSTRUCTION_DE_LA_CHAINE_DE_CONNEXION \ ) \ ) \ ) \ ) \ ); \ DEFV(Float,INIT(lambda_precedent,FLOT__UNDEF)); \ DEFV(Float,INIT(lambda,COORDONNEE_BARYCENTRIQUE_MINIMALE)); \ /* Parametre d'interpolation du point precedant le point courant, le pas ne servant que si */ \ /* 'IL_FAUT(garantir_l_equidistance_des_points_successifs_d_une_chaine_de_connexion)' */ \ /* */ \ /* Le 20230128141620, le 'INVE(...)' de la definition de 'pas_de_lambda' a ete remplace */ \ /* par 'DIVI(AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES,...)' qui est plus logique et donne */ \ /* evidemment le meme resultat... */ \ \ Tant(EST_FAUX(la_construction_de_la_chaine_de_connexion_est_achevee)) \ Bblock \ Test(IL_FAUT(garantir_l_equidistance_des_points_successifs_d_une_chaine_de_connexion)) \ Bblock \ AIDE_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION \ ( \ Bblock \ CAL2(Prin0(" Equidistance des points. ")); \ Eblock \ ); \ \ Eblock \ ATes \ Bblock \ AIDE_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION \ ( \ Bblock \ CAL2(Prin1(" NombreDePoints=%d ",Np)); \ Eblock \ ); \ \ EGAL(lambda \ ,ADD2(COORDONNEE_BARYCENTRIQUE_MINIMALE \ ,SCAL(FLOT(SOUS(index_de_construction_de_la_chaine_de_connexion \ ,INDEX_DE_CONSTRUCTION_DE_LA_CHAINE_DE_CONNEXION \ ) \ ) \ ,FLOT(SOUS(Np \ ,INDEX_DE_CONSTRUCTION_DE_LA_CHAINE_DE_CONNEXION \ ) \ ) \ ,SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE \ ,COORDONNEE_BARYCENTRIQUE_MINIMALE \ ) \ ) \ ) \ ); \ /* Definition de la coordonnee barycentrique d'interpolation des coordonnees et des */ \ /* couleurs des points de l'espace. */ \ Eblock \ ETes \ \ AIDE_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION \ ( \ Bblock \ CAL2(Prin1("Lambda=%f\n",lambda)); \ Eblock \ ); \ \ Test(IL_FAUT(equidistance_des_points_successifs_d_une_chaine_de_connexion_____compatibilite_20081109)) \ Bblock \ Eblock \ ATes \ Bblock \ Test(IFEXff(lambda,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE)) \ /* Ce test introduit le 20081109112831 est rendu necessaire par le mode */ \ /* 'IL_FAUT(garantir_l_equidistance_des_points_successifs_d_une_chaine_de_connexion)' */ \ /* a cause duquel 'lambda' peut aller au-dela de 'COORDONNEE_BARYCENTRIQUE_MAXIMALE'... */ \ Bblock \ EGAL(lambda,TRON(lambda,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE)); \ /* Ce seuillage de 'lambda' garantit alors que l'extremite {Bx,By,Bz} de la chaine de */ \ /* connexion sera atteinte... */ \ /* */ \ /* Cela s'est vu a cette date lors de la generation de l'image 'v $xiirv/SURR.11'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ \ Test(IFINff(lambda \ ,lambda_minimal_d_une_chaine_de_connexion \ ,COND(IL_FAUT(garantir_l_equidistance_des_points_successifs_d_une_chaine_de_connexion) \ ,ADD2(lambda_maximal_d_une_chaine_de_connexion,pas_de_lambda) \ ,lambda_maximal_d_une_chaine_de_connexion \ ) \ ) \ ) \ Bblock \ DEFV(Logical,INIT(le_point_courant_est_connu,FAUX)); \ /* Afin de calculer le point courant... */ \ DEFV(Float,INIT(c_x,FLOT__UNDEF)); \ DEFV(Float,INIT(c_y,FLOT__UNDEF)); \ DEFV(Float,INIT(c_z,FLOT__UNDEF)); \ \ DEFV(Float,INIT(dc_x,FLOT__UNDEF)); \ DEFV(Float,INIT(dc_y,FLOT__UNDEF)); \ DEFV(Float,INIT(dc_z,FLOT__UNDEF)); \ /* Definition du point courant {c_x,c_y,c_z} et de sa couleur {dc_x,dc_y,dc_z}. */ \ /* */ \ /* ATTENTION, on notera que le 19991008092221, on est passe de {{cx,cy,cz},{dcx,dcy,dcz}} */ \ /* a {{c_x,c_y,c_z},{dc_x,dc_y,dc_z}} a cause de l'introduction de la procedure */ \ /* 'VISUALISATION_D_UN_SEGMENT_VARIABLE(...)' qui si 'IL_FAUT(generer_des_points_isoles)' */ \ /* est appelee avec comme argument {{cx,cy,cz},{dcx,dcy,dcz}}, variables qui existent donc */ \ /* a un autre niveau, d'ou un mechant probleme... */ \ \ Tant(EST_FAUX(le_point_courant_est_connu)) \ /* Ce dispositif a ete introduit le 20051213092326 afin de permettre d'ajuster localement */ \ /* l'interpolation sur une chaine de connexion ce qui garantit alors une distance presque */ \ /* constante entre deux points successifs... */ \ Bblock \ Test(IL_FAUT(c)) \ Bblock \ DEFV(Float,INIT(Adx_effectif,Adx)); \ DEFV(Float,INIT(Ady_effectif,Ady)); \ DEFV(Float,INIT(Adz_effectif,Adz)); \ DEFV(Float,INIT(Bdx_effectif,Bdx)); \ DEFV(Float,INIT(Bdy_effectif,Bdy)); \ DEFV(Float,INIT(Bdz_effectif,Bdz)); \ /* Introduit le 20180702103601 afin d'alleger ce qui suit... */ \ \ INCR(Adx_effectif \ ,oAXPB(MUL2(coefficient_des_pente_XYZ_des_chaines_de_connexion \ ,coefficient_de_la_pente_X_des_chaines_de_connexion \ ) \ ,PenteX_normalisee_3D(Ax,Ay,Az,Bx,By,Bz) \ ,FZERO \ ) \ ); \ INCR(Ady_effectif \ ,oAXPB(MUL2(coefficient_des_pente_XYZ_des_chaines_de_connexion \ ,coefficient_de_la_pente_Y_des_chaines_de_connexion \ ) \ ,PenteY_normalisee_3D(Ax,Ay,Az,Bx,By,Bz) \ ,FZERO \ ) \ ); \ INCR(Adz_effectif \ ,oAXPB(MUL2(coefficient_des_pente_XYZ_des_chaines_de_connexion \ ,coefficient_de_la_pente_Z_des_chaines_de_connexion \ ) \ ,PenteZ_normalisee_3D(Ax,Ay,Az,Bx,By,Bz) \ ,FZERO \ ) \ ); \ INCR(Bdx_effectif \ ,oAXPB(MUL2(coefficient_des_pente_XYZ_des_chaines_de_connexion \ ,coefficient_de_la_pente_X_des_chaines_de_connexion \ ) \ ,PenteX_normalisee_3D(Ax,Ay,Az,Bx,By,Bz) \ ,FZERO \ ) \ ); \ INCR(Bdy_effectif \ ,oAXPB(MUL2(coefficient_des_pente_XYZ_des_chaines_de_connexion \ ,coefficient_de_la_pente_Y_des_chaines_de_connexion \ ) \ ,PenteY_normalisee_3D(Ax,Ay,Az,Bx,By,Bz) \ ,FZERO \ ) \ ); \ INCR(Bdz_effectif \ ,oAXPB(MUL2(coefficient_des_pente_XYZ_des_chaines_de_connexion \ ,coefficient_de_la_pente_Z_des_chaines_de_connexion \ ) \ ,PenteZ_normalisee_3D(Ax,Ay,Az,Bx,By,Bz) \ ,FZERO \ ) \ ); \ /* Introduit le 20180702094538 afin de pouvoir rendre "relatives" a la direction des */ \ /* connexions les definitions des splines eventuellement utilises... */ \ \ EGAL(c_x,INTERPOLATION_CUBIQUE(Ax,Adx_effectif,Bx,Bdx_effectif,lambda)); \ EGAL(c_y,INTERPOLATION_CUBIQUE(Ay,Ady_effectif,By,Bdy_effectif,lambda)); \ EGAL(c_z,INTERPOLATION_CUBIQUE(Az,Adz_effectif,Bz,Bdz_effectif,lambda)); \ /* Recuperation de la position du point courant (c_x,c_y,c_z) par interpolation cubique... */ \ /* */ \ /* Le 20231012102900 grace a 'v $xiirv/SMIT.91' je note que le processus precedent ne */ \ /* fonctionne pas correctement si, en deux dimensions, la pente du segment AB est egale */ \ /* a 1. Cela a ete teste en tracant le segment {{0.1,0.1}.{0.9,0.9}} et en editant les */ \ /* valeurs des coefficients 'INTERPOLATION_CUBIQUE_t3?(...)' pour les coordonnees 'c_x' */ \ /* et 'c_y'. Avec les valeurs (arbitraires, mais non nulles evidemment) : */ \ /* */ \ /* LISTE_dX=0.5 */ \ /* LISTE_dY=0.5 */ \ /* */ \ /* on obtient lors du calcul des coordonnees 'x' et 'y' des 16 points, malheureusement, */ \ /* les memes valeurs : */ \ /* */ \ /* t3x=-2.2000 t2x=3.3000 t1x=0.5000 t0x=-0.8000 */ \ /* t3y=-2.2000 t2y=3.3000 t1y=0.5000 t0y=-0.8000 */ \ /* */ \ /* L'interpolation est donc strictement la meme sur les deux axes (voire les trois si l'on */ \ /* avait ete dans un test tridimensionnel), ce qui fait que tous les points interpoles */ \ /* restent sur le segment {{0.1,0.1}.{0.9,0.9}} au lieu d'onduler de part et d'autre, */ \ /* comme on l'esperait... */ \ Eblock \ ATes \ Bblock \ EGAL(c_x,INTERPOLATION_LINEAIRE(Ax,Bx,lambda)); \ EGAL(c_y,INTERPOLATION_LINEAIRE(Ay,By,lambda)); \ EGAL(c_z,INTERPOLATION_LINEAIRE(Az,Bz,lambda)); \ /* Recuperation de la position du point courant (c_x,c_y,c_z) par interpolation lineaire... */ \ Eblock \ ETes \ \ Test(IFET(IL_FAUT(garantir_l_equidistance_des_points_successifs_d_une_chaine_de_connexion) \ ,IFGT(index_de_construction_de_la_chaine_de_connexion \ ,INDEX_DE_CONSTRUCTION_DE_LA_CHAINE_DE_CONNEXION \ ) \ ) \ ) \ Bblock \ /* Cas des points suivants lorsqu'il faut garantir l'equidistance des points successifs : */ \ AIDE_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION \ ( \ Bblock \ CAL2(Prin7(" DistanceCourante{{%f,%f,%f},{%f,%f,%f}}=%f " \ ,c_x,c_y,c_z \ ,c_x_precedent,c_y_precedent,c_z_precedent \ ,RdisF3D(c_x,c_y,c_z \ ,c_x_precedent,c_y_precedent,c_z_precedent \ ) \ ) \ ); \ CAL2(Prin1("DistanceMinimaleEffective=%f\n" \ ,distance_minimale_effective_entre_deux_points_successifs \ ) \ ); \ Eblock \ ); \ \ Test(IFLE(RdisF3D(c_x,c_y,c_z \ ,c_x_precedent,c_y_precedent,c_z_precedent \ ) \ ,distance_minimale_effective_entre_deux_points_successifs \ ) \ ) \ Bblock \ EGAL(le_point_courant_est_connu,VRAI); \ /* Le point courant est suffisamment pres du point precedent : on s'arrete... */ \ Eblock \ ATes \ Bblock \ DECR(lambda \ ,MUL2(facteur_d_amelioration_du_lambda_d_une_chaine_de_connexion \ ,SOUS(lambda,lambda_precedent) \ ) \ ); \ /* Et reduction du parametre d'interpolation... */ \ /* */ \ /* Le 20160321145415, de nombreuses experiences furent effectuees afin de comprendre */ \ /* pourquoi si 'IL_FAUT(c)' le 'rayon_de_visualisation', bien qu'interpole a l'aide de */ \ /* 'INTERPOLATION_LINEAIRE(...)' variait de facon "non lineaire". L'explication est la */ \ /* suivante : cette interpolation lineaire est controlee par le parametre 'lambda'. Or */ \ /* celui-ci est ajuste en permanence grace a 'INTERPOLATION_CUBIQUE(...)' via les */ \ /* coordonnees du point courant {c_x,c_y,c_z} et celles du point precedent. Ainsi, par */ \ /* exemple, pour interpoler entre les points {0,-1,0} et {0,0,0} avec des derivees nulles, */ \ /* voici les differences antre les 'lambdas' calcules successifs (en n'en gardant qu'un */ \ /* sur dix parmi 179) : */ \ /* */ \ /* +0.043047 <-- Grosses */ \ /* +0.007179 <-- differences, */ \ /* +0.005234 */ \ /* +0.004710 */ \ /* +0.004239 */ \ /* +0.003815 - */ \ /* +0.003815 | */ \ /* +0.003815 | */ \ /* +0.003816 | Differences quasiment constantes, */ \ /* +0.003815 | */ \ /* +0.003815 | */ \ /* +0.003815 - */ \ /* +0.004239 */ \ /* +0.004710 */ \ /* +0.005233 */ \ /* +0.006461 */ \ /* +0.014110 <-- Grosses */ \ /* +0.042568 <-- differences. */ \ /* */ \ /* Les variations sont donc assez brutales, en particulier aux extremites. C'est cela qui */ \ /* explique les variations "ennuyeuses" du rayon lorsqu'il est calcule grace a ce 'lambda'. */ \ \ AIDE_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION \ ( \ Bblock \ CAL2(Prin1(" Lambda=%f\n" \ ,lambda \ ) \ ); \ Eblock \ ); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ EGAL(le_point_courant_est_connu,VRAI); \ /* Cas du premier point : on s'arrete immediatement... */ \ Eblock \ ETes \ Eblock \ ETan \ \ Test(IL_FAUT(garantir_l_equidistance_des_points_successifs_d_une_chaine_de_connexion)) \ Bblock \ EGAL(lambda_precedent,lambda); \ /* Et son parametre d'interpolation... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFLE(lambda,COORDONNEE_BARYCENTRIQUE_MAXIMALE)) \ /* Ce test introduit le 20051213143437 est rendu necessaire par le mode */ \ /* 'IL_FAUT(garantir_l_equidistance_des_points_successifs_d_une_chaine_de_connexion)' */ \ /* a cause duquel 'lambda' peut aller au-dela de 'COORDONNEE_BARYCENTRIQUE_MAXIMALE'... */ \ Bblock \ EGAL(c_x_precedent,c_x); \ EGAL(c_y_precedent,c_y); \ EGAL(c_z_precedent,c_z); \ /* Et on memorise le futur point precedent... */ \ \ begin_nouveau_block \ Bblock \ DEFV(Float,INIT(lambda_des_derivees_avant_modulation \ ,AXPB(facteur_du_lambda_des_derivees,lambda,translation_du_lambda_des_derivees) \ ) \ ); \ DEFV(Float,INIT(lambda_des_derivees_apres_modulation,lambda)); \ /* Par defaut au cas ou la mothode de modulation ne serait pas reconnue... */ \ \ Choi(choix_de_la_methode_de_modulation_du_lambda_des_derivees) \ Bblock \ Ca1e(METHODE_DE_MODULATION_DU_LAMBDA_DES_DERIVEES_NEUT) \ Bblock \ EGAL(lambda_des_derivees_apres_modulation \ ,NEUT(lambda_des_derivees_avant_modulation) \ ); \ Eblock \ ECa1 \ \ Ca1e(METHODE_DE_MODULATION_DU_LAMBDA_DES_DERIVEES_COSX) \ Bblock \ EGAL(lambda_des_derivees_apres_modulation \ ,COSX(lambda_des_derivees_avant_modulation) \ ); \ Eblock \ ECa1 \ \ Ca1e(METHODE_DE_MODULATION_DU_LAMBDA_DES_DERIVEES_SINX) \ Bblock \ EGAL(lambda_des_derivees_apres_modulation \ ,SINX(lambda_des_derivees_avant_modulation) \ ); \ Eblock \ ECa1 \ \ Ca1e(METHODE_DE_MODULATION_DU_LAMBDA_DES_DERIVEES_TANH) \ Bblock \ EGAL(lambda_des_derivees_apres_modulation \ ,TANH(lambda_des_derivees_avant_modulation) \ ); \ Eblock \ ECa1 \ \ Defo \ Bblock \ PRINT_ERREUR("la methode de modulation du 'lambda' des derivees n'est pas reconnue"); \ Eblock \ EDef \ Eblock \ ECho \ \ EGAL(lambda_des_derivees_apres_modulation \ ,AXPB(facteur_modulation_du_lambda_des_derivees \ ,lambda_des_derivees_apres_modulation \ ,translation_modulation_du_lambda_des_derivees \ ) \ ); \ /* Cette possibilite de moduler "lambda" a ete introduite le 20180528094155... */ \ /* */ \ /* Les fonctions utilisees ci-dessus (a l'exception evidemment de 'NEUT(...) renvoient */ \ /* des valeurs dans [-1,+1]. On devra donc en general choisir : */ \ /* */ \ /* facteur_modulation_du_lambda_des_derivees = +1/2 */ \ /* translation_modulation_du_lambda_des_derivees = +1/2 */ \ /* */ \ /* pour revenir a un 'lambda' dans [0,1] avec en general au prealable : */ \ /* */ \ /* facteur_modulation_du_lambda_des_derivees = +2 */ \ /* translation_modulation_du_lambda_des_derivees = -1 */ \ /* */ \ /* pour amener le 'lambda' dans [-1,+1]... */ \ \ EGAL(dc_x,INTERPOLATION_LINEAIRE(Adcx,Bdcx,lambda_des_derivees_apres_modulation)); \ EGAL(dc_y,INTERPOLATION_LINEAIRE(Adcy,Bdcy,lambda_des_derivees_apres_modulation)); \ EGAL(dc_z,INTERPOLATION_LINEAIRE(Adcz,Bdcz,lambda_des_derivees_apres_modulation)); \ /* Forcage arbitraire des derivees (dc_x,dc_y,dc_z) au point courant. */ \ Eblock \ end_nouveau_block \ \ EGAL(rayon_de_visualisation,INTERPOLATION_LINEAIRE(Ar_local,Br_local,lambda)); \ /* Et calcul du rayon de visualisation. ATTENTION, 'rayon_de_visualisation' ne peut */ \ /* etre une variable locale parce qu'elle est transmise "globalement" a la fonction */ \ /* 'memorisation_1_point_07(...)'. */ \ \ Test(IFOU(IFOU(IFET(IL_FAUT(grossissement_rayon_visualisation_____compatibilite_20250215) \ ,IFOU(I3ET(IFEQ(c_x,Ax),IFEQ(c_y,Ay),IFEQ(c_z,Az)) \ ,I3ET(IFEQ(c_x,Bx),IFEQ(c_y,By),IFEQ(c_z,Bz)) \ ) \ ) \ ,IFET(IL_NE_FAUT_PAS(grossissement_rayon_visualisation_____compatibilite_20250215) \ ,IFOU(I3ET(IFEQ_a_peu_pres_absolu(c_x,Ax \ ,epsilon_de_grossissement_rayon_visualisation \ ) \ ,IFEQ_a_peu_pres_absolu(c_y,Ay \ ,epsilon_de_grossissement_rayon_visualisation \ ) \ ,IFEQ_a_peu_pres_absolu(c_z,Az \ ,epsilon_de_grossissement_rayon_visualisation \ ) \ ) \ ,I3ET(IFEQ_a_peu_pres_absolu(c_x,Bx \ ,epsilon_de_grossissement_rayon_visualisation \ ) \ ,IFEQ_a_peu_pres_absolu(c_y,By \ ,epsilon_de_grossissement_rayon_visualisation \ ) \ ,IFEQ_a_peu_pres_absolu(c_z,Bz \ ,epsilon_de_grossissement_rayon_visualisation \ ) \ ) \ ) \ ) \ ) \ ,IFGE(lambda,COORDONNEE_BARYCENTRIQUE_MAXIMALE) \ ) \ ) \ /* Le test concernant 'lambda' par rapport a sa valeur maximale a ete introduit le */ \ /* 20130419141837 car, en effet, il manquait. Il est necessaire car rien ne prouve que */ \ /* {c_x,c_y,c_z} atteigne exactement {Bx,By,Bz}, en particulier depuis qu'a ete introduite */ \ /* l'equidistance des points... */ \ /* */ \ /* L'introduction de "epsilon" a ete faite le 20250215121531, lors de la definition de */ \ /* 'v $xiirv/LEGE.11' avec '_____Rayon=0.005' et '_____NombreIntervalles=19' pour laquelle */ \ /* il manquait quelques "boules superieures" (la premiere pour 'index=7')... */ \ Bblock \ EGAL(rayon_de_visualisation \ ,MUL2(grossissement_du_rayon_de_visualisation_des_points,rayon_de_visualisation) \ ); \ EGAL(masse_de_la_sphere_courante,MASSE_DES_POINTS_EXTREMES___D_UN_SEGMENT); \ /* Introduit le 20240519081857 pour transmission "hors-arguments" a la fonction */ \ /* 'memorisation_1_point_07(...)'. */ \ Eblock \ ATes \ Bblock \ EGAL(masse_de_la_sphere_courante,MASSE_DES_POINTS_INTERIEURS_D_UN_SEGMENT); \ /* Introduit le 20240519081857 pour transmission "hors-arguments" a la fonction */ \ /* 'memorisation_1_point_07(...)'. */ \ Eblock \ ETes \ \ INCR(compteur_des_points_memorises_pour_la_chaine_de_connexion_courante,I); \ \ AIDE_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION \ ( \ Bblock \ CAL2(Prin4("Memorisation du point courant(%d)={%f,%f,%f}.\n" \ ,c_x,c_y,c_z \ ,compteur_des_points_memorises_pour_la_chaine_de_connexion_courante \ ) \ ); \ Eblock \ ); \ \ CALS(memorisation_1_point_07(SOUS(c_x,Xcentre_ESPACE) \ ,SOUS(c_y,Ycentre_ESPACE) \ ,SOUS(c_z,Zcentre_ESPACE) \ ,dc_x \ ,dc_y \ ,dc_z \ ,N \ ) \ ); \ /* Memorisation du point courant d'une chaine de materialisation d'un couple de points. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ INCR(index_de_construction_de_la_chaine_de_connexion,I); \ /* Progression de l'index de construction... ATTENTION : cette incrementation doit etre */ \ /* faite meme si l'on garantit la distance entre les points successifs car, en effet, cet */ \ /* index est utilise pour differencier le premier point des autres dans ce cas... */ \ \ Test(IL_FAUT(garantir_l_equidistance_des_points_successifs_d_une_chaine_de_connexion)) \ Bblock \ INCR(lambda,pas_de_lambda); \ /* Progression du lambda... */ \ \ Test(IFGE(lambda,ADD2(COORDONNEE_BARYCENTRIQUE_MAXIMALE,pas_de_lambda))) \ Bblock \ EGAL(la_construction_de_la_chaine_de_connexion_est_achevee,VRAI); \ /* La construction de la chaine de connexion est achevee... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Test(IFGT(index_de_construction_de_la_chaine_de_connexion \ ,COND(I3ET(I3ET(IFEQ(Ax,Bx) \ ,IFEQ(Ay,By) \ ,IFEQ(Az,Bz) \ ) \ ,I3ET(IFEQ(Adcx,Bdcx) \ ,IFEQ(Adcy,Bdcy) \ ,IFEQ(Adcz,Bdcz) \ ) \ ,IFEQ(Ar_local,Br_local) \ ) \ ,UN \ ,Np \ ) \ ) \ ) \ Bblock \ EGAL(la_construction_de_la_chaine_de_connexion_est_achevee,VRAI); \ /* La construction de la chaine de connexion est achevee... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ ETan \ \ EGAL(rayon_de_visualisation,EnTete_de_sauvegardM ## rayon_de_visualisation); \ /* Restauration du rayon de visualisation... */ \ Eblock \ /* Visualisation d'une chaine de points connectant le point 'A' au point 'B'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V I S U A L I S A T I O N D E S A X E S : */ /* */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * ** * * * * * ** * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * ** * * * * * ** */ /* * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* */ /* ATTENTION : */ /* */ /* Lors de l'utilisation d'echelles non lineaires pour les coordonnees */ /* via 'IL_NE_FAUT_PAS(prendre_une_echelle_lineaire_pour_les_coordonnees)' */ /* dans 'v $rxv/champs_5.26$I' (ce qui se produit en general avec le */ /* programme 'v $xrr/N_corps.11$K'), les spheres materialisant les */ /* axes subissent elles-aussi cette transformation ; elles ne sont */ /* alors pas equi-reparties... */ /* */ /* */ /* Couleurs implicites des axes : */ /* */ /* Sauf modification lors de l'appel des */ /* programmes correspondants, la couleur */ /* implicite des axes est : */ /* */ /* OX ROUGE */ /* OY VERTE */ /* OZ BLEUE */ /* */ /* C'est-a-dire l'ordre logique {R,V,B}={X,Y,Z}. */ /* */ /*************************************************************************************************************************************/ #define VISUALISER_LES_AXES_DE_COORDONNEES \ FAUX DEFV(Local,DEFV(Logical,INIT(visualiser_les_axes_de_coordonnees,VISUALISER_LES_AXES_DE_COORDONNEES))); /* Indique si l'on visualise les axes de coordonnees ('VRAI') ou pas ('FAUX'). */ #define VISUALISER_LA_PARTIE_NEGATIVE_DES_AXES_DE_COORDONNEES \ FAUX DEFV(Local,DEFV(Logical,INIT(visualiser_la_partie_negative_des_axes_de_coordonnees ,VISUALISER_LA_PARTIE_NEGATIVE_DES_AXES_DE_COORDONNEES ) ) ); /* Indique si l'on visualise uniquement la partie positive ('FAUX') des axes de coordonnees */ /* ou de plus leur partie negative ('VRAI'). */ #define LONGUEUR_DES_AXES_DE_COORDONNEES \ FRA1(FRA4(mhXYZlongueur_ESPACE)) DEFV(Local,DEFV(Float,INIT(longueur_des_axes_de_coordonnees,LONGUEUR_DES_AXES_DE_COORDONNEES))); #define RAYON_DE_L_ORIGINE_DES_AXES_DE_COORDONNEES \ FRA1(FRA10(FRA10(mhXYZlongueur_ESPACE))) #define RAYON_DE_L_EXTREMITE_DES_AXES_DE_COORDONNEES \ FRA2(FRA10(FRA10(mhXYZlongueur_ESPACE))) DEFV(Local,DEFV(Float,INIT(rayon_de_l_origine_des_axes_de_coordonnees,RAYON_DE_L_ORIGINE_DES_AXES_DE_COORDONNEES))); DEFV(Local,DEFV(Float,INIT(rayon_de_l_extremite_des_axes_de_coordonnees,RAYON_DE_L_EXTREMITE_DES_AXES_DE_COORDONNEES))); /* Definition de la geometrie des 3 axes. ATTENTION, il est impossible d'utiliser la */ /* valeur de 'mXYZlongueur_ESPACE' a la place de 'mhXYZlongueur_ESPACE' car, en effet, */ /* est imperatif d'avoir ici une constante... */ #define NOMBRE_DE_POINTS_DES_AXES_DE_COORDONNEES \ CENT DEFV(Local,DEFV(Int,INIT(nombre_de_points_des_axes_de_coordonnees,NOMBRE_DE_POINTS_DES_AXES_DE_COORDONNEES))); /* Nombre de points utilises pour visualiser chacun des axes de coordonnees. */ #define LA_COULEUR_ORIGINE_EST_COMMUNE_A_XYZ \ VRAI DEFV(Local,DEFV(Logical,INIT(la_couleur_origine_est_commune_a_XYZ,LA_COULEUR_ORIGINE_EST_COMMUNE_A_XYZ))); /* Le 20091024183153 fut introduit le fait que la couleur de l'origine puisse ne plus */ /* etre la meme sur les trois axes. La valeur par defaut ('VRAI') garantit la compatibilite */ /* anterieure... */ #define NIVEAU_DE_ROUGE_DE_L_ORIGINE_DES_AXES \ BLANC #define NIVEAU_DE_VERTE_DE_L_ORIGINE_DES_AXES \ BLANC #define NIVEAU_DE_BLEUE_DE_L_ORIGINE_DES_AXES \ BLANC DEFV(Local,DEFV(genere_p,INIT(niveau_de_ROUGE_de_l_origine_des_axes,NIVEAU_DE_ROUGE_DE_L_ORIGINE_DES_AXES))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_VERTE_de_l_origine_des_axes,NIVEAU_DE_VERTE_DE_L_ORIGINE_DES_AXES))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_BLEUE_de_l_origine_des_axes,NIVEAU_DE_BLEUE_DE_L_ORIGINE_DES_AXES))); /* Definition de la couleur de l'origine des 3 axes. */ #define NIVEAU_DE_ROUGE_DE_L_ORIGINE_DE_L_AXE_OX \ BLANC #define NIVEAU_DE_VERTE_DE_L_ORIGINE_DE_L_AXE_OX \ NOIR #define NIVEAU_DE_BLEUE_DE_L_ORIGINE_DE_L_AXE_OX \ NOIR DEFV(Local,DEFV(genere_p,INIT(niveau_de_ROUGE_de_l_origine_de_l_axe_OX,NIVEAU_DE_ROUGE_DE_L_ORIGINE_DE_L_AXE_OX))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_VERTE_de_l_origine_de_l_axe_OX,NIVEAU_DE_VERTE_DE_L_ORIGINE_DE_L_AXE_OX))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_BLEUE_de_l_origine_de_l_axe_OX,NIVEAU_DE_BLEUE_DE_L_ORIGINE_DE_L_AXE_OX))); /* Definition de la couleur de l'origine de l'axe 'OX' ('ROUGE' implicite). */ #define NIVEAU_DE_ROUGE_DE_L_ORIGINE_DE_L_AXE_OY \ NOIR #define NIVEAU_DE_VERTE_DE_L_ORIGINE_DE_L_AXE_OY \ BLANC #define NIVEAU_DE_BLEUE_DE_L_ORIGINE_DE_L_AXE_OY \ NOIR DEFV(Local,DEFV(genere_p,INIT(niveau_de_ROUGE_de_l_origine_de_l_axe_OY,NIVEAU_DE_ROUGE_DE_L_ORIGINE_DE_L_AXE_OY))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_VERTE_de_l_origine_de_l_axe_OY,NIVEAU_DE_VERTE_DE_L_ORIGINE_DE_L_AXE_OY))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_BLEUE_de_l_origine_de_l_axe_OY,NIVEAU_DE_BLEUE_DE_L_ORIGINE_DE_L_AXE_OY))); /* Definition de la couleur de l'origine de l'axe 'OY' ('VERTE' implicite). */ #define NIVEAU_DE_ROUGE_DE_L_ORIGINE_DE_L_AXE_OZ \ NOIR #define NIVEAU_DE_VERTE_DE_L_ORIGINE_DE_L_AXE_OZ \ NOIR #define NIVEAU_DE_BLEUE_DE_L_ORIGINE_DE_L_AXE_OZ \ BLANC DEFV(Local,DEFV(genere_p,INIT(niveau_de_ROUGE_de_l_origine_de_l_axe_OZ,NIVEAU_DE_ROUGE_DE_L_ORIGINE_DE_L_AXE_OZ))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_VERTE_de_l_origine_de_l_axe_OZ,NIVEAU_DE_VERTE_DE_L_ORIGINE_DE_L_AXE_OZ))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_BLEUE_de_l_origine_de_l_axe_OZ,NIVEAU_DE_BLEUE_DE_L_ORIGINE_DE_L_AXE_OZ))); /* Definition de la couleur de l'origine de l'axe 'OZ' ('BLEUE' implicite). */ #define NIVEAU_DE_ROUGE_DE_L_EXTREMITE_DE_L_AXE_OX \ BLANC #define NIVEAU_DE_VERTE_DE_L_EXTREMITE_DE_L_AXE_OX \ NOIR #define NIVEAU_DE_BLEUE_DE_L_EXTREMITE_DE_L_AXE_OX \ NOIR DEFV(Local,DEFV(genere_p,INIT(niveau_de_ROUGE_de_l_extremite_de_l_axe_OX,NIVEAU_DE_ROUGE_DE_L_EXTREMITE_DE_L_AXE_OX))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_VERTE_de_l_extremite_de_l_axe_OX,NIVEAU_DE_VERTE_DE_L_EXTREMITE_DE_L_AXE_OX))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_BLEUE_de_l_extremite_de_l_axe_OX,NIVEAU_DE_BLEUE_DE_L_EXTREMITE_DE_L_AXE_OX))); /* Definition de la couleur de l'extremite de l'axe 'OX' ('ROUGE' implicite). */ #define NIVEAU_DE_ROUGE_DE_L_EXTREMITE_DE_L_AXE_OY \ NOIR #define NIVEAU_DE_VERTE_DE_L_EXTREMITE_DE_L_AXE_OY \ BLANC #define NIVEAU_DE_BLEUE_DE_L_EXTREMITE_DE_L_AXE_OY \ NOIR DEFV(Local,DEFV(genere_p,INIT(niveau_de_ROUGE_de_l_extremite_de_l_axe_OY,NIVEAU_DE_ROUGE_DE_L_EXTREMITE_DE_L_AXE_OY))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_VERTE_de_l_extremite_de_l_axe_OY,NIVEAU_DE_VERTE_DE_L_EXTREMITE_DE_L_AXE_OY))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_BLEUE_de_l_extremite_de_l_axe_OY,NIVEAU_DE_BLEUE_DE_L_EXTREMITE_DE_L_AXE_OY))); /* Definition de la couleur de l'extremite de l'axe 'OY' ('VERTE' implicite). */ #define NIVEAU_DE_ROUGE_DE_L_EXTREMITE_DE_L_AXE_OZ \ NOIR #define NIVEAU_DE_VERTE_DE_L_EXTREMITE_DE_L_AXE_OZ \ NOIR #define NIVEAU_DE_BLEUE_DE_L_EXTREMITE_DE_L_AXE_OZ \ BLANC DEFV(Local,DEFV(genere_p,INIT(niveau_de_ROUGE_de_l_extremite_de_l_axe_OZ,NIVEAU_DE_ROUGE_DE_L_EXTREMITE_DE_L_AXE_OZ))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_VERTE_de_l_extremite_de_l_axe_OZ,NIVEAU_DE_VERTE_DE_L_EXTREMITE_DE_L_AXE_OZ))); DEFV(Local,DEFV(genere_p,INIT(niveau_de_BLEUE_de_l_extremite_de_l_axe_OZ,NIVEAU_DE_BLEUE_DE_L_EXTREMITE_DE_L_AXE_OZ))); /* Definition de la couleur de l'extremite de l'axe 'OZ' ('BLEUE' implicite). */ #define NIVEAU_DERIVEE_X(niveau) \ X_DERIVEE_DENORMALISEE(______NORMALISE_NIVEAU(niveau)) #define NIVEAU_DERIVEE_Y(niveau) \ Y_DERIVEE_DENORMALISEE(______NORMALISE_NIVEAU(niveau)) #define NIVEAU_DERIVEE_Z(niveau) \ Z_DERIVEE_DENORMALISEE(______NORMALISE_NIVEAU(niveau)) /* Formules de passages des niveaux aux derivees dans le bon segment (elles sont destinees */ /* en fait a ne pas allonger la longueur des lignes ci-apres...). */ #define XYZ_ORIGINE_DES_AXES_DE_COORDONNEES(coordonnee,longueur) \ COND(IL_NE_FAUT_PAS(visualiser_la_partie_negative_des_axes_de_coordonnees) \ ,coordonnee \ ,SOUS(coordonnee,longueur) \ ) #define XYZ_EXTREMITE_DES_AXES_DE_COORDONNEES(coordonnee,longueur) \ ADD2(coordonnee,longueur) #define NOMBRE_EFFECTIF_DE_POINTS_DES_AXES_DE_COORDONNEES \ COND(IL_NE_FAUT_PAS(visualiser_la_partie_negative_des_axes_de_coordonnees) \ ,nombre_de_points_des_axes_de_coordonnees \ ,DOUP(nombre_de_points_des_axes_de_coordonnees) \ ) /* Gestion des extremites des axes de coordonnees... */ #define gVISUALISATION_DES_AXES_DE_COORDONNEES \ Bblock \ Test(IL_FAUT(visualiser_les_axes_de_coordonnees)) \ Bblock \ VISUALISATION_D_UNE_CHAINE_DE_CONNEXION(XYZ_ORIGINE_DES_AXES_DE_COORDONNEES(FXorigine \ ,longueur_des_axes_de_coordonnees \ ) \ ,XYZ_ORIGINE_DES_AXES_DE_COORDONNEES(FYorigine \ ,FZERO \ ) \ ,XYZ_ORIGINE_DES_AXES_DE_COORDONNEES(FZorigine \ ,FZERO \ ) \ ,NIVEAU_DERIVEE_X(COND(EST_VRAI(la_couleur_origine_est_commune_a_XYZ) \ ,niveau_de_ROUGE_de_l_origine_des_axes \ ,niveau_de_ROUGE_de_l_origine_de_l_axe_OX \ ) \ ) \ ,NIVEAU_DERIVEE_Y(COND(EST_VRAI(la_couleur_origine_est_commune_a_XYZ) \ ,niveau_de_VERTE_de_l_origine_des_axes \ ,niveau_de_VERTE_de_l_origine_de_l_axe_OX \ ) \ ) \ ,NIVEAU_DERIVEE_Z(COND(EST_VRAI(la_couleur_origine_est_commune_a_XYZ) \ ,niveau_de_BLEUE_de_l_origine_des_axes \ ,niveau_de_BLEUE_de_l_origine_de_l_axe_OX \ ) \ ) \ ,rayon_de_l_origine_des_axes_de_coordonnees \ ,XYZ_EXTREMITE_DES_AXES_DE_COORDONNEES(FXorigine \ ,longueur_des_axes_de_coordonnees \ ) \ ,XYZ_EXTREMITE_DES_AXES_DE_COORDONNEES(FYorigine \ ,FZERO \ ) \ ,XYZ_EXTREMITE_DES_AXES_DE_COORDONNEES(FZorigine \ ,FZERO \ ) \ ,NIVEAU_DERIVEE_X(niveau_de_ROUGE_de_l_extremite_de_l_axe_OX) \ ,NIVEAU_DERIVEE_Y(niveau_de_VERTE_de_l_extremite_de_l_axe_OX) \ ,NIVEAU_DERIVEE_Z(niveau_de_BLEUE_de_l_extremite_de_l_axe_OX) \ ,rayon_de_l_extremite_des_axes_de_coordonnees \ ,NOMBRE_EFFECTIF_DE_POINTS_DES_AXES_DE_COORDONNEES \ ,DERNIERE_ITERATION_VISUALISEE \ ,NE_PAS_INTERPOLER_LES_CHAINES_DE_CONNEXION_PAR_DES_SPLINES_CUBIQUES \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ); \ /* Visualisation de l'axe 'OX'. */ \ VISUALISATION_D_UNE_CHAINE_DE_CONNEXION(XYZ_ORIGINE_DES_AXES_DE_COORDONNEES(FXorigine \ ,FZERO \ ) \ ,XYZ_ORIGINE_DES_AXES_DE_COORDONNEES(FYorigine \ ,longueur_des_axes_de_coordonnees \ ) \ ,XYZ_ORIGINE_DES_AXES_DE_COORDONNEES(FZorigine \ ,FZERO \ ) \ ,NIVEAU_DERIVEE_X(COND(EST_VRAI(la_couleur_origine_est_commune_a_XYZ) \ ,niveau_de_ROUGE_de_l_origine_des_axes \ ,niveau_de_ROUGE_de_l_origine_de_l_axe_OY \ ) \ ) \ ,NIVEAU_DERIVEE_Y(COND(EST_VRAI(la_couleur_origine_est_commune_a_XYZ) \ ,niveau_de_VERTE_de_l_origine_des_axes \ ,niveau_de_VERTE_de_l_origine_de_l_axe_OY \ ) \ ) \ ,NIVEAU_DERIVEE_Z(COND(EST_VRAI(la_couleur_origine_est_commune_a_XYZ) \ ,niveau_de_BLEUE_de_l_origine_des_axes \ ,niveau_de_BLEUE_de_l_origine_de_l_axe_OY \ ) \ ) \ ,rayon_de_l_origine_des_axes_de_coordonnees \ ,XYZ_EXTREMITE_DES_AXES_DE_COORDONNEES(FXorigine \ ,FZERO \ ) \ ,XYZ_EXTREMITE_DES_AXES_DE_COORDONNEES(FYorigine \ ,longueur_des_axes_de_coordonnees \ ) \ ,XYZ_EXTREMITE_DES_AXES_DE_COORDONNEES(FZorigine \ ,FZERO \ ) \ ,NIVEAU_DERIVEE_X(niveau_de_ROUGE_de_l_extremite_de_l_axe_OY) \ ,NIVEAU_DERIVEE_Y(niveau_de_VERTE_de_l_extremite_de_l_axe_OY) \ ,NIVEAU_DERIVEE_Z(niveau_de_BLEUE_de_l_extremite_de_l_axe_OY) \ ,rayon_de_l_extremite_des_axes_de_coordonnees \ ,NOMBRE_EFFECTIF_DE_POINTS_DES_AXES_DE_COORDONNEES \ ,DERNIERE_ITERATION_VISUALISEE \ ,NE_PAS_INTERPOLER_LES_CHAINES_DE_CONNEXION_PAR_DES_SPLINES_CUBIQUES \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ); \ /* Visualisation de l'axe 'OY'. */ \ VISUALISATION_D_UNE_CHAINE_DE_CONNEXION(XYZ_ORIGINE_DES_AXES_DE_COORDONNEES(FXorigine \ ,FZERO \ ) \ ,XYZ_ORIGINE_DES_AXES_DE_COORDONNEES(FYorigine \ ,FZERO \ ) \ ,XYZ_ORIGINE_DES_AXES_DE_COORDONNEES(FZorigine \ ,longueur_des_axes_de_coordonnees \ ) \ ,NIVEAU_DERIVEE_X(COND(EST_VRAI(la_couleur_origine_est_commune_a_XYZ) \ ,niveau_de_ROUGE_de_l_origine_des_axes \ ,niveau_de_ROUGE_de_l_origine_de_l_axe_OZ \ ) \ ) \ ,NIVEAU_DERIVEE_Y(COND(EST_VRAI(la_couleur_origine_est_commune_a_XYZ) \ ,niveau_de_VERTE_de_l_origine_des_axes \ ,niveau_de_VERTE_de_l_origine_de_l_axe_OZ \ ) \ ) \ ,NIVEAU_DERIVEE_Z(COND(EST_VRAI(la_couleur_origine_est_commune_a_XYZ) \ ,niveau_de_BLEUE_de_l_origine_des_axes \ ,niveau_de_BLEUE_de_l_origine_de_l_axe_OZ \ ) \ ) \ ,rayon_de_l_origine_des_axes_de_coordonnees \ ,XYZ_EXTREMITE_DES_AXES_DE_COORDONNEES(FXorigine \ ,FZERO \ ) \ ,XYZ_EXTREMITE_DES_AXES_DE_COORDONNEES(FYorigine \ ,FZERO \ ) \ ,XYZ_EXTREMITE_DES_AXES_DE_COORDONNEES(FZorigine \ ,longueur_des_axes_de_coordonnees \ ) \ ,NIVEAU_DERIVEE_X(niveau_de_ROUGE_de_l_extremite_de_l_axe_OZ) \ ,NIVEAU_DERIVEE_Y(niveau_de_VERTE_de_l_extremite_de_l_axe_OZ) \ ,NIVEAU_DERIVEE_Z(niveau_de_BLEUE_de_l_extremite_de_l_axe_OZ) \ ,rayon_de_l_extremite_des_axes_de_coordonnees \ ,NOMBRE_EFFECTIF_DE_POINTS_DES_AXES_DE_COORDONNEES \ ,DERNIERE_ITERATION_VISUALISEE \ ,NE_PAS_INTERPOLER_LES_CHAINES_DE_CONNEXION_PAR_DES_SPLINES_CUBIQUES \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ,FLOT__UNDEF \ ); \ /* Visualisation de l'axe 'OZ'. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Visualisation des trois axes de coordonnees. */ BFonctionI DEFV(Local,DEFV(FonctionI,visualisation_des_axes_de_coordonnees())) /* Cette fonction a ete introduite pour alleger les compilations (de 'v $xrk/fluide_2D.11$K' */ /* en particulier...). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ gVISUALISATION_DES_AXES_DE_COORDONNEES; RETU_ERROR; Eblock EFonctionI #define VISUALISATION_DES_AXES_DE_COORDONNEES \ Bblock \ CALS(visualisation_des_axes_de_coordonnees()); \ Eblock \ /* Visualisation des trois axes de coordonnees. */