/*************************************************************************************************************************************/ /* */ /* C A L C U L D U V O L U M E P R O P R E M E N T D I T : */ /* */ /* */ /* Author of '$xrs/volumes.12$I' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20040325105905). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D U V O L U M E V I A L E S C O O R D O N N E E S C U R V I L I G N E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.1A.I" #include xrv/champs_5.19.I" /* Pour eviter le message : */ /* */ /* Static function is not referenced. */ /* */ #include xrk/attractor.19.I" /* Validations et definition de l'espace physique. */ #define u_NORMALISEE \ NORM(u,minimum_de_u,maximum_de_u) #define v_NORMALISEE \ NORM(v,minimum_de_v,maximum_de_v) #define w_NORMALISEE \ NORM(w,minimum_de_w,maximum_de_w) /* Coordonnees {u,v,w} dans [0,1]... */ /* */ /* On notera que l'on ne peut utiliser {u_effectif,v_effectif,w_effectif} evidemment... */ #define GENERATION_DU_TEXTURAGE_DU_VOLUME(texture_x,texture_y,texture_z) \ Bblock \ DEFV(Float,INIT(grossissement_courant_du_rayon_de_visualisation \ ,COND(I3ET(DIVISIBLE(echantillonnage_courant_de_u,echantillonnage_de_u) \ ,DIVISIBLE(echantillonnage_courant_de_v,echantillonnage_de_v) \ ,DIVISIBLE(echantillonnage_courant_de_w,echantillonnage_de_w) \ ) \ ,grossissement_du_rayon_de_visualisation_aux_intersections_des_lignes_de_coordonnees \ ,FU \ ) \ ) \ ); \ /* Afin de pouvoir marquer l'intersection des lignes de coordonnees... */ \ \ BSaveModifyVariable(Logical \ ,AXES_COORDONNEES_FERMES_OUVERTS_____compatibilite_20090929 \ ,COND(IL_FAUT(AXES_COORDONNEES_FERMES_OUVERTS__texturage_volumes_____compatibilite_20130220) \ ,AXES_COORDONNEES_FERMES_OUVERTS_____compatibilite_20090929 \ ,VRAI \ ) \ ); \ /* Introduit le 20130220133200R et mis avant 'rayon_de_visualisation' le 20160331100022 */ \ /* (donc avec quelques annees de retard...). */ \ \ EGAL(rayon_de_visualisation \ ,MUL2(grossissement_courant_du_rayon_de_visualisation \ ,sgFFAload_point_coordonnees_01(Album_RAYON \ ,u_NORMALISEE \ ,v_NORMALISEE \ ,w_NORMALISEE \ ,Album_RAYON_periodiser_u \ ,Album_RAYON_periodiser_v \ ,Album_RAYON_periodiser_w \ ,Album_RAYON_symetriser_u \ ,Album_RAYON_symetriser_v \ ,Album_RAYON_symetriser_w \ ,Album_RAYON_prolonger_u \ ,Album_RAYON_prolonger_v \ ,Album_RAYON_prolonger_w \ ,Album_RAYON_niveau_hors_album \ ,Album_RAYON__interpoler_bilineairement_ou_bicubiquement \ ,Album_RAYON__utiliser_l_interpolation_bilineaire \ ,Album_RAYON__eviter_les_fortes_discontinuites \ ,Album_RAYON__epsilon_detection_des_fortes_discontinuites \ ) \ ) \ ); \ /* Acces au champ RAYON... */ \ \ EGAL(texture_x \ ,sgFFAload_point_coordonnees_01(Album_ROUGE \ ,u_NORMALISEE \ ,v_NORMALISEE \ ,w_NORMALISEE \ ,Album_ROUGE_periodiser_u \ ,Album_ROUGE_periodiser_v \ ,Album_ROUGE_periodiser_w \ ,Album_ROUGE_symetriser_u \ ,Album_ROUGE_symetriser_v \ ,Album_ROUGE_symetriser_w \ ,Album_ROUGE_prolonger_u \ ,Album_ROUGE_prolonger_v \ ,Album_ROUGE_prolonger_w \ ,Album_ROUGE_niveau_hors_album \ ,Album_ROUGE__interpoler_bilineairement_ou_bicubiquement \ ,Album_ROUGE__utiliser_l_interpolation_bilineaire \ ,Album_ROUGE__eviter_les_fortes_discontinuites \ ,Album_ROUGE__epsilon_detection_des_fortes_discontinuites \ ) \ ); \ EGAL(texture_y \ ,sgFFAload_point_coordonnees_01(Album_VERTE \ ,u_NORMALISEE \ ,v_NORMALISEE \ ,w_NORMALISEE \ ,Album_VERTE_periodiser_u \ ,Album_VERTE_periodiser_v \ ,Album_VERTE_periodiser_w \ ,Album_VERTE_symetriser_u \ ,Album_VERTE_symetriser_v \ ,Album_VERTE_symetriser_w \ ,Album_VERTE_prolonger_u \ ,Album_VERTE_prolonger_v \ ,Album_VERTE_prolonger_w \ ,Album_VERTE_niveau_hors_album \ ,Album_VERTE__interpoler_bilineairement_ou_bicubiquement \ ,Album_VERTE__utiliser_l_interpolation_bilineaire \ ,Album_VERTE__eviter_les_fortes_discontinuites \ ,Album_VERTE__epsilon_detection_des_fortes_discontinuites \ ) \ ); \ EGAL(texture_z \ ,sgFFAload_point_coordonnees_01(Album_BLEUE \ ,u_NORMALISEE \ ,v_NORMALISEE \ ,w_NORMALISEE \ ,Album_BLEUE_periodiser_u \ ,Album_BLEUE_periodiser_v \ ,Album_BLEUE_periodiser_w \ ,Album_BLEUE_symetriser_u \ ,Album_BLEUE_symetriser_v \ ,Album_BLEUE_symetriser_w \ ,Album_BLEUE_prolonger_u \ ,Album_BLEUE_prolonger_v \ ,Album_BLEUE_prolonger_w \ ,Album_BLEUE_niveau_hors_album \ ,Album_BLEUE__interpoler_bilineairement_ou_bicubiquement \ ,Album_BLEUE__utiliser_l_interpolation_bilineaire \ ,Album_BLEUE__eviter_les_fortes_discontinuites \ ,Album_BLEUE__epsilon_detection_des_fortes_discontinuites \ ) \ ); \ /* Acces aux champs {ROUGE,VERTE,BLEUE}. */ \ \ ESaveModifyVariable(Logical \ ,AXES_COORDONNEES_FERMES_OUVERTS_____compatibilite_20090929 \ ); \ /* Introduit le 20130220133200... */ \ Eblock \ /* Calcul du texturage du volume au point courant {u,v,w} associe au point {X,Y,Z}. Ceci */ \ /* fut introduit le 20050621174058 "a vide" et complete le 20050622093052... */ #define GtV(texture_x,texture_y,texture_z) \ Bblock \ GENERATION_DU_TEXTURAGE_DU_VOLUME(texture_x,texture_y,texture_z); \ Eblock \ /* Synonyme de 'GENERATION_DU_TEXTURAGE_DU_VOLUME(...)' destine a raccourcir la longueur */ \ /* de certaines lignes qui vont suivre... */ #define PERMUTATION_EVENTUELLE_DES_COORDONNEES_ET_DES_DIFFERENTIELLES \ Bblock \ Test(IL_FAUT(permuter_les_coordonnees_et_les_differentielles)) \ Bblock \ fSWAP(cx,dcx); \ fSWAP(cy,dcy); \ fSWAP(cz,dcz); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Permutation eventuelle des coordonnees et des differentielles. Ce dispositif a ete */ \ /* introduit le 20050623085804 "pour voir ce que cela donne"... */ #define MINIMUM_DE_u_LORS_D_UNE_PROJECTION \ COND(IL_FAUT(forcer_les_extrema_de_u_v_w_lors_de_la_projection_du_volume) \ ,minimum_de_u \ ,sauvegarde_de_minimum_de_u \ ) #define MAXIMUM_DE_u_LORS_D_UNE_PROJECTION \ ADD2(COND(IL_FAUT(forcer_les_extrema_de_u_v_w_lors_de_la_projection_du_volume) \ ,maximum_de_u \ ,sauvegarde_de_maximum_de_u \ ) \ ,MOIT(pas_de_u) \ ) #define MINIMUM_DE_v_LORS_D_UNE_PROJECTION \ COND(IL_FAUT(forcer_les_extrema_de_u_v_w_lors_de_la_projection_du_volume) \ ,minimum_de_v \ ,sauvegarde_de_minimum_de_v \ ) #define MAXIMUM_DE_v_LORS_D_UNE_PROJECTION \ ADD2(COND(IL_FAUT(forcer_les_extrema_de_u_v_w_lors_de_la_projection_du_volume) \ ,maximum_de_v \ ,sauvegarde_de_maximum_de_v \ ) \ ,MOIT(pas_de_v) \ ) #define MINIMUM_DE_w_LORS_D_UNE_PROJECTION \ COND(IL_FAUT(forcer_les_extrema_de_u_v_w_lors_de_la_projection_du_volume) \ ,minimum_de_w \ ,sauvegarde_de_minimum_de_w \ ) #define MAXIMUM_DE_w_LORS_D_UNE_PROJECTION \ ADD2(COND(IL_FAUT(forcer_les_extrema_de_u_v_w_lors_de_la_projection_du_volume) \ ,maximum_de_w \ ,sauvegarde_de_maximum_de_w \ ) \ ,MOIT(pas_de_w) \ ) /* Introduit le 20050908134533... */ #define GENERATION_DU_POINT_uvw_COURANT(Fx,Fy,Fz,calcul_eventuel_point_courant,sequence_de_generation,Fu,Fv,Fw,Tuvw) \ /* Introduit le 20221221143907... */ \ Bblock \ begin_nouveau_block \ Bblock \ begin_nouveau_block \ Bblock \ begin_nouveau_block \ Bblock \ /* Je note le 20221222080857 que cette suite de 'Bblock's est destinee a ne pas changer */ \ /* la tabulation de ce qui suit... */ \ DEFV(Float,INIT(u_effectif,Fu(u))); \ DEFV(Float,INIT(d_u_effectif,d_u)); \ /* Je note le 20060531104200 (avec un peu de retard que les {u,v,w} effectifs ne peuvent */ \ /* etre evalues que lorsque les {u,v,w} "de base" sont connus, c'est-a-dire a l'interieur de */ \ /* toutes les boucles 'DoIn(...)' imbriquees, d'ou de plus l'introduction des 'FDoIn(...)' */ \ /* le 20060602135618 par precaution... */ \ DEFV(Float,INIT(v_effectif,Fv(v))); \ DEFV(Float,INIT(d_v_effectif,d_v)); \ /* Je note le 20060531104200 (avec un peu de retard que les {u,v,w} effectifs ne peuvent */ \ /* etre evalues que lorsque les {u,v,w} "de base" sont connus, c'est-a-dire a l'interieur de */ \ /* toutes les boucles 'DoIn(...)' imbriquees, d'ou de plus l'introduction des 'FDoIn(...)' */ \ /* le 20060602135618 par precaution... */ \ DEFV(Float,INIT(w_effectif,Fw(w))); \ DEFV(Float,INIT(d_w_effectif,d_w)); \ \ EGAL(u_effectif \ ,COND(IL_NE_FAUT_PAS(gestion_torique_de_u) \ ,NEUT(u_effectif) \ ,MODF(u_effectif,minimum_de_u_effectif,maximum_de_u_effectif) \ ) \ ); \ EGAL(v_effectif \ ,COND(IL_NE_FAUT_PAS(gestion_torique_de_v) \ ,NEUT(v_effectif) \ ,MODF(v_effectif,minimum_de_v_effectif,maximum_de_v_effectif) \ ) \ ); \ EGAL(w_effectif \ ,COND(IL_NE_FAUT_PAS(gestion_torique_de_w) \ ,NEUT(w_effectif) \ ,MODF(w_effectif,minimum_de_w_effectif,maximum_de_w_effectif) \ ) \ ); \ /* La gestion "torique" des coordonnees {u,v,w} a ete introduite le 20060601133046... */ \ \ Test(IFET(I3ET(IFINff(u_effectif,minimum_de_u_effectif,maximum_de_u_effectif) \ ,IFINff(v_effectif,minimum_de_v_effectif,maximum_de_v_effectif) \ ,IFINff(w_effectif,minimum_de_w_effectif,maximum_de_w_effectif) \ ) \ /* Ce test d'inclusion a ete introduit le 20060530095647... */ \ ,Tuvw \ ) \ /* Ce test de "trouage" a ete introduit le 20060530133706... */ \ ) \ Bblock \ Test(I4OU(I3ET(DIVISIBLE(echantillonnage_courant_de_u,echantillonnage_de_u) \ ,DIVISIBLE(echantillonnage_courant_de_v,echantillonnage_de_v) \ ,DIVISIBLE(echantillonnage_courant_de_w,echantillonnage_de_w) \ ) \ ,I3ET(NON_DIVISIBLE(echantillonnage_courant_de_u,echantillonnage_de_u) \ ,DIVISIBLE(echantillonnage_courant_de_v,echantillonnage_de_v) \ ,DIVISIBLE(echantillonnage_courant_de_w,echantillonnage_de_w) \ ) \ ,I3ET(DIVISIBLE(echantillonnage_courant_de_u,echantillonnage_de_u) \ ,NON_DIVISIBLE(echantillonnage_courant_de_v,echantillonnage_de_v) \ ,DIVISIBLE(echantillonnage_courant_de_w,echantillonnage_de_w) \ ) \ ,I3ET(DIVISIBLE(echantillonnage_courant_de_u,echantillonnage_de_u) \ ,DIVISIBLE(echantillonnage_courant_de_v,echantillonnage_de_v) \ ,NON_DIVISIBLE(echantillonnage_courant_de_w,echantillonnage_de_w) \ ) \ ) \ ) \ Bblock \ EGAL(cx,Fx(u_effectif,v_effectif,w_effectif)); \ EGAL(cy,Fy(u_effectif,v_effectif,w_effectif)); \ EGAL(cz,Fz(u_effectif,v_effectif,w_effectif)); \ /* Generation du point courant du volume... */ \ /* */ \ /* ATTENTION : les trois fonctions 'F?(u,v,w)' sont en general des fonctions projetees par */ \ /* les operateurs 'PROJECTION_PARALLELE_01_?D_3D_?(...)' et sont donc tridimensionnelles */ \ /* ('v $xrs/Mobius3D.11$I DERIVATION_PARTIELLE' par exemple). Cela implique, par exemple, */ \ /* qu'une modification des parametres 'coefficient_de_projection_parallele_01_?D_3D_x?_?' */ \ /* modifie leur valeur et donc les valeurs des differentielles qui sont calculees ci-apres */ \ /* eventuellement pour le coloriage... */ \ /* */ \ /* On notera qu'avant le 20050628123846, le calcul de {cx,cy,cz} figurait explicitement a */ \ /* l'interieur des differentes 'sequence_de_generation'. Mais avec l'introduction de la */ \ /* generation eventuelle des trois "projections" d'une surface, il est plus astucieux et */ \ /* economique de faire cela avant l'appel de 'sequence_de_generation'... */ \ \ Test(IL_FAUT(generer_les_trois_projections_du_volume)) \ /* Cas ou il faut generer les trois projections (introduit le 20050628092016) : */ \ Bblock \ AstoreF_point_valide(cx \ ,Projection_de_Fx \ ,X_de_projection \ ,Y_de_projection \ ,Z_de_projection \ ); \ AstoreF_point_valide(cy \ ,Projection_de_Fy \ ,X_de_projection \ ,Y_de_projection \ ,Z_de_projection \ ); \ AstoreF_point_valide(cz \ ,Projection_de_Fz \ ,X_de_projection \ ,Y_de_projection \ ,Z_de_projection \ ); \ /* Generation des trois projections d'une surface tel que cela est defini et exploite */ \ /* dans 'v $xrs/project3D.11$K P.R.O.J.E.C.T.O.R'. Ceci a ete introduit le 20050628092016. */ \ /* */ \ /* L'utilisation des coordonnees entieres {X_de_projection,Y_de_projection,Z_de_projection} */ \ /* a ete introduite le 20050908130630 pour eviter les "trous" dans les matrices de */ \ /* projection... */ \ \ AstoreI_point_valide(ADD2(AloadI_point(validation_de_la_projection \ ,X_de_projection \ ,Y_de_projection \ ,Z_de_projection \ ) \ ,I \ ) \ ,validation_de_la_projection \ ,X_de_projection \ ,Y_de_projection \ ,Z_de_projection \ ); \ /* Marquage de tous les points {u,v} possibles... */ \ Eblock \ ATes \ Bblock \ /* Cas ou il faut visualiser le volume : */ \ BLOC(sequence_de_generation); \ /* Generation specifique de l'image du volume pour le point courant {u,v,w}. */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ end_nouveau_block \ Eblock \ end_nouveau_block \ Eblock \ end_nouveau_block \ Eblock #define index_definition_arbitraire \ index_de_definition_arbitraire_des_coordonnees_u_v_w \ /* Afin de raccourcir certaines des lignes qui suivent... */ #define gGENERATION_D_UNE_IMAGE_DU_VOLUME(Fx,Fy,Fz,calcul_eventuel_point_courant,sequence_de_generation,Fu,Fv,Fw,Tuvw) \ /* Les quatre fonctions {Fu,Fv,Fw,Tuvw} furent introduites le 20060530133706... */ \ Bblock \ BDEFV(albumI,validation_de_la_projection); \ /* Dispositif de validation de la projection introduit le 20050909142343... */ \ DEFV(Int,INIT(X_de_projection,Xmin)); \ /* Pour indexer les trois matrices de projection... */ \ \ DEFV(Float,INIT(differentielle_ROUGE,FLOT__UNDEF)); \ DEFV(Float,INIT(differentielle_VERTE,FLOT__UNDEF)); \ DEFV(Float,INIT(differentielle_BLEUE,FLOT__UNDEF)); \ DEFV(Logical,INIT(utiliser_les_differentielles_ROUGE_VERTE_BLEUE,FAUX)); \ /* Introduit le 20230124142028 car, en effet, les trois differentielles utiles */ \ /* {differentielle_x,differentielle_y,differentielle_z} n'existent pas ici, etant */ \ /* definies localement dans 'GENERATION_D_UNE_IMAGE_DU_VOLUME_AVEC_DIFFERENCES____(...)' */ \ \ DEFV(Float,INIT(minimum_de_u_effectif \ ,COND(IL_FAUT(generer_les_trois_projections_du_volume) \ ,MINIMUM_DE_u_LORS_D_UNE_PROJECTION \ ,minimum_de_u \ ) \ ) \ ); \ DEFV(Float,INIT(maximum_de_u_effectif \ ,ADD2(COND(IL_FAUT(generer_les_trois_projections_du_volume) \ ,MAXIMUM_DE_u_LORS_D_UNE_PROJECTION \ ,maximum_de_u \ ) \ ,COND(IL_FAUT(majoration_du_maximum_des_coordonnees_u_v_w_____compatibilite_20160414) \ ,FZERO \ ,epsilon_de_majoration_du_maximum_des_coordonnees_u_v_w \ ) \ ) \ ) \ ); \ DEFV(Float,INIT(minimum_de_v_effectif \ ,COND(IL_FAUT(generer_les_trois_projections_du_volume) \ ,MINIMUM_DE_v_LORS_D_UNE_PROJECTION \ ,minimum_de_v \ ) \ ) \ ); \ DEFV(Float,INIT(maximum_de_v_effectif \ ,ADD2(COND(IL_FAUT(generer_les_trois_projections_du_volume) \ ,MAXIMUM_DE_v_LORS_D_UNE_PROJECTION \ ,maximum_de_v \ ) \ ,COND(IL_FAUT(majoration_du_maximum_des_coordonnees_u_v_w_____compatibilite_20160414) \ ,FZERO \ ,epsilon_de_majoration_du_maximum_des_coordonnees_u_v_w \ ) \ ) \ ) \ ); \ DEFV(Float,INIT(minimum_de_w_effectif \ ,COND(IL_FAUT(generer_les_trois_projections_du_volume) \ ,MINIMUM_DE_w_LORS_D_UNE_PROJECTION \ ,minimum_de_w \ ) \ ) \ ); \ DEFV(Float,INIT(maximum_de_w_effectif \ ,ADD2(COND(IL_FAUT(generer_les_trois_projections_du_volume) \ ,MAXIMUM_DE_w_LORS_D_UNE_PROJECTION \ ,maximum_de_w \ ) \ ,COND(IL_FAUT(majoration_du_maximum_des_coordonnees_u_v_w_____compatibilite_20160414) \ ,FZERO \ ,epsilon_de_majoration_du_maximum_des_coordonnees_u_v_w \ ) \ ) \ ) \ ); \ /* Ceci a ete introduit le 20050908132631 afin de prevenir le phenomene decrit dans */ \ /* 'v $xrs/surfaces.12$I 20050908130630'... */ \ /* */ \ /* Les 'minimum_de_?_effectif' ont ete introduits le 20060307102027 par symetrie avec */ \ /* 'v $xrs/surfaces.12$I minimum_de_._effectif'... */ \ /* */ \ /* La modification du 20160414131603 vient de l'observation que les 'FDoIn(...)' concernant */ \ /* {u,v} qui vont suivre n'atteignent pas toujours le maximum. Ainsi, par exemple : */ \ /* */ \ /* FDoIn(uv,-0.5,+0.5,0.050) ==> 'uv' atteint +0.5 */ \ /* */ \ /* alors que : */ \ /* */ \ /* FDoIn(uv,-0.5,+0.5,0.025) ==> 'uv' atteint +0.475000 */ \ /* */ \ /* (voir a ce propos 'v $xtc/test_for_flottant.01$c'). */ \ /* Le 20160414145625 fut introduit l'epsilon. On notera au passage qu'il est different de */ \ /* de celui de 'v $xrs/surfaces.14$I gEPSILON'... */ \ DEFV(Float,INIT(pas_de_u_effectif,DIVI(pas_de_u,diviseur_du_pas_de_u))); \ DEFV(Float,INIT(pas_de_v_effectif,DIVI(pas_de_v,diviseur_du_pas_de_v))); \ DEFV(Float,INIT(pas_de_w_effectif,DIVI(pas_de_w,diviseur_du_pas_de_w))); \ /* Afin faciliter l'utilisation de l'echantillonnage, facilite introduite le 20021009100745. */ \ \ DEFV(Int,INIT(echantillonnage_courant_de_u,translation_de_l_echantillonnage_de_u)); \ /* Afin de gerer l'echantillonnage de 'u'. */ \ /* */ \ /* La translation a ete introduite le 20040330113801 afin de permettre, par sa variation */ \ /* (0, 1, 2,...), de faire glisser la grille d'echantillonnage dans le volume... */ \ \ DEFV(Float,INIT(pas_u_de_differentiation,FLOT__UNDEF)); \ DEFV(Float,INIT(pas_v_de_differentiation,FLOT__UNDEF)); \ DEFV(Float,INIT(pas_w_de_differentiation,FLOT__UNDEF)); \ EGAL(pas_u_de_differentiation \ ,DIVI(COND(EST_VRAI(le_pas_de_u_de_differentiation_est_homothetique),pas_de_u_effectif,pas_de_u) \ ,diviseur_de_differentiation_de_u \ ) \ ); \ EGAL(pas_v_de_differentiation \ ,DIVI(COND(EST_VRAI(le_pas_de_v_de_differentiation_est_homothetique),pas_de_v_effectif,pas_de_v) \ ,diviseur_de_differentiation_de_v \ ) \ ); \ EGAL(pas_w_de_differentiation \ ,DIVI(COND(EST_VRAI(le_pas_de_w_de_differentiation_est_homothetique),pas_de_w_effectif,pas_de_w) \ ,diviseur_de_differentiation_de_w \ ) \ ); \ /* Pour faire les differentiations (introduit le 20060505162530)... */ \ \ Test(IL_FAUT(generer_les_trois_projections_du_volume)) \ /* Cas ou il faut generer les trois projections (introduit le 20050909142343) : */ \ Bblock \ begin_album \ Bblock \ AstoreI_point(ZERO,validation_de_la_projection,X,Y,Z); \ /* A priori aucun point ne va etre atteint ci-apres... */ \ Eblock \ end_album \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(definir_arbitrairement_les_coordonnees_u_v_w)) \ /* Possibilite introduite le 20221221143907... */ \ Bblock \ DEFV(Int,INIT(X_de_projection,Xmin)); \ DEFV(Int,INIT(Y_de_projection,Ymin)); \ DEFV(Int,INIT(Z_de_projection,Zmin)); \ /* Ne servent qu'a permettre 'GENERATION_DU_POINT_uvw_COURANT(...)' ci-apres... */ \ \ DEFV(Int,INIT(echantillonnage_courant_de_u,translation_de_l_echantillonnage_de_u)); \ DEFV(Int,INIT(echantillonnage_courant_de_v,translation_de_l_echantillonnage_de_v)); \ DEFV(Int,INIT(echantillonnage_courant_de_w,translation_de_l_echantillonnage_de_w)); \ /* Ne servent qu'a permettre 'GENERATION_DU_POINT_uvw_COURANT(...)' ci-apres... */ \ \ DEFV(Logical,INIT(recuperer_les_coordonnees_u_v_w,VRAI)); \ \ Test(IL_FAUT(generer_les_trois_projections_du_volume)) \ /* Test introduit le 20221222080857... */ \ Bblock \ PRINT_ATTENTION("pas de projection du volume lorsque les coordonnees {u,v,w} sont arbitraires"); \ EGAL(generer_les_trois_projections_du_volume,FAUX); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Tant(IL_FAUT(recuperer_les_coordonnees_u_v_w)) \ Bblock \ DEFV(Float,INIT(u,ELEMENT_DU_FICHIER_COORDONNEES_u(index_definition_arbitraire))); \ DEFV(Float,INIT(v,ELEMENT_DU_FICHIER_COORDONNEES_v(index_definition_arbitraire))); \ DEFV(Float,INIT(w,ELEMENT_DU_FICHIER_COORDONNEES_w(index_definition_arbitraire))); \ \ Test(I3ET(IFNE(u,separateur_de_definition_arbitraire_des_coordonnees_u_v_w) \ ,IFNE(v,separateur_de_definition_arbitraire_des_coordonnees_u_v_w) \ ,IFNE(w,separateur_de_definition_arbitraire_des_coordonnees_u_v_w) \ ) \ ) \ /* Test introduit le 20230217102709... */ \ Bblock \ Test(I3ET(IFNE_chaine(fichier_des_coordonnees_ROUGE,NOM_PIPE_Local) \ ,IFNE_chaine(fichier_des_coordonnees_VERTE,NOM_PIPE_Local) \ ,IFNE_chaine(fichier_des_coordonnees_BLEUE,NOM_PIPE_Local) \ ) \ ) \ /* Possibilite introduite le 20230124133820... */ \ Bblock \ EGAL(differentielle_ROUGE,ELEMENT_DU_FICHIER_COORDONNEES_ROUGE(index_definition_arbitraire)); \ EGAL(differentielle_VERTE,ELEMENT_DU_FICHIER_COORDONNEES_VERTE(index_definition_arbitraire)); \ EGAL(differentielle_BLEUE,ELEMENT_DU_FICHIER_COORDONNEES_BLEUE(index_definition_arbitraire)); \ /* Les initialisations de 'GENERATION_D_UNE_IMAGE_DU_VOLUME_AVEC_DIFFERENCES____(...)' */ \ /* sont donc ici "oubliees"... */ \ \ EGAL(utiliser_les_differentielles_ROUGE_VERTE_BLEUE,VRAI); \ /* Afin de pouvoir definir {differentielle_x,differentielle_y,differentielle_z} */ \ /* dans 'GENERATION_D_UNE_IMAGE_DU_VOLUME_AVEC_DIFFERENCES____(...)' */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFNE_chaine(fichier_des_coordonnees_RAYON,NOM_PIPE_Local)) \ Bblock \ EGAL(rayon_de_visualisation,ELEMENT_DU_FICHIER_COORDONNEES_RAYON(index_definition_arbitraire)); \ /* Introduit le 20240517140744... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFNE_chaine(fichier_des_coordonnees_MASSE,NOM_PIPE_Local)) \ Bblock \ EGAL(masse_de_la_sphere_courante \ ,ELEMENT_DU_FICHIER_COORDONNEES_MASSE(index_definition_arbitraire) \ ); \ /* Introduit le 20240519090904... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ GENERATION_DU_POINT_uvw_COURANT(Fx,Fy,Fz \ ,calcul_eventuel_point_courant \ ,sequence_de_generation \ ,Fu,Fv,Fw \ ,Tuvw \ ); \ Eblock \ ATes \ Bblock \ EGAL(recuperer_les_coordonnees_u_v_w,FAUX); \ Eblock \ ETes \ \ INCR(index_definition_arbitraire,pas_de_parcours_d_un_fichier); \ \ Test(IFGT(index_definition_arbitraire,DERNIER_ELEMENT_D_UN_FICHIER)) \ Bblock \ EGAL(index_definition_arbitraire,PREMIER_ELEMENT_D_UN_FICHIER); \ EGAL(recuperer_les_coordonnees_u_v_w,FAUX); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETan \ Eblock \ ATes \ Bblock \ FDoIn(u,minimum_de_u_effectif,maximum_de_u_effectif,pas_de_u_effectif) \ /* Passage de 'DoIn(...)' a 'FDoIn(...)' le 20060602135618... */ \ Bblock \ DEFV(Int,INIT(Y_de_projection,Ymin)); \ /* Pour indexer les trois matrices de projection... */ \ DEFV(Int,INIT(echantillonnage_courant_de_v,translation_de_l_echantillonnage_de_v)); \ /* Afin de gerer l'echantillonnage de 'v'. */ \ /* */ \ /* La translation a ete introduite le 20040330113801 afin de permettre, par sa variation */ \ /* (0, 1, 2,...), de faire glisser la grille d'echantillonnage dans le volume... */ \ \ FDoIn(v,minimum_de_v_effectif,maximum_de_v_effectif,pas_de_v_effectif) \ /* Passage de 'DoIn(...)' a 'FDoIn(...)' le 20060602135618... */ \ Bblock \ DEFV(Int,INIT(Z_de_projection,Zmin)); \ /* Pour indexer les trois matrices de projection... */ \ DEFV(Int,INIT(echantillonnage_courant_de_w,translation_de_l_echantillonnage_de_w)); \ /* Afin de gerer l'echantillonnage de 'w'. */ \ /* */ \ /* La translation a ete introduite le 20040330113801 afin de permettre, par sa variation */ \ /* (0, 1, 2,...), de faire glisser la grille d'echantillonnage dans le volume... */ \ \ FDoIn(w,minimum_de_w_effectif,maximum_de_w_effectif,pas_de_w_effectif) \ /* Passage de 'DoIn(...)' a 'FDoIn(...)' le 20060602135618... */ \ Bblock \ GENERATION_DU_POINT_uvw_COURANT(Fx,Fy,Fz \ ,calcul_eventuel_point_courant \ ,sequence_de_generation \ ,Fu,Fv,Fw \ ,Tuvw \ ); \ \ INCR(echantillonnage_courant_de_w,I); \ /* Gestion de l'echantillonnage de 'w'. */ \ INCR(Z_de_projection,PasZ); \ /* Gestion de l'indexation des matrices de projection... */ \ Eblock \ EFDoI \ \ INCR(echantillonnage_courant_de_v,I); \ /* Gestion de l'echantillonnage de 'v'. */ \ INCR(Y_de_projection,PasY); \ /* Gestion de l'indexation des matrices de projection... */ \ Eblock \ EFDoI \ \ INCR(echantillonnage_courant_de_u,I); \ /* Gestion de l'echantillonnage de 'u'. */ \ INCR(X_de_projection,PasX); \ /* Gestion de l'indexation des matrices de projection... */ \ Eblock \ EFDoI \ Eblock \ ETes \ \ Test(IL_FAUT(generer_les_trois_projections_du_volume)) \ /* Cas ou il faut generer les trois projections (introduit le 20050909142343) : */ \ Bblock \ begin_album \ Bblock \ Test(IZEQ(AloadI_point(validation_de_la_projection,X,Y,Z))) \ Bblock \ PRINT_ERREUR("un point de la projection n'est pas atteint"); \ CAL1(Prer3("il s'agit du point de coordonnees {u,v,w}={%f,%f,%f}\n" \ ,_____cNORMALISE_OX(X) \ ,_____cNORMALISE_OY(Y) \ ,_____cNORMALISE_OZ(Z) \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ end_album \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EDEFV(albumI,validation_de_la_projection); \ /* Dispositif de validation de la projection introduit le 20050909142343... */ \ Eblock \ /* Calcul et visualisation generale du volume pour un instant donne. */ #define LISTER_EVENTUELLEMENT_LES_COORDONNEES_u_v_w_DES_POINTS \ Bblock \ Test(IFET(IL_FAUT(lister_la_liste_des_points) \ ,IL_FAUT(lister_les_coordonnees_u_v_w_des_points) \ ) \ ) \ Bblock \ Test(IFET(IZGT(rayon_de_visualisation) \ ,IFOU(EST_VRAI(les_trois_les_differentielles_peuvent_etre_nulles) \ ,IFET(EST_FAUX(les_trois_les_differentielles_peuvent_etre_nulles) \ ,IFOU(IL_NE_FAUT_PAS(renormaliser_arbitrairement_derivees) \ ,IFET(IL_FAUT(renormaliser_arbitrairement_derivees) \ ,I3OU(IZNE(dcx) \ ,IZNE(dcy) \ ,IZNE(dcz) \ ) \ ) \ ) \ ) \ ) \ ) \ ) \ Bblock \ CAL2(Prin3(" U=%+.^^^ V=%+.^^^ W=%+.^^^ " \ ,u_effectif \ ,v_effectif \ ,w_effectif \ ) \ ); \ /* Ceci fut introduit le 20101006103817 par symetrie avec */ \ /* 'v $xrs/surfaces.12$I LISTER_EVENTUELLEMENT_LES_COORDONNEES_u_v_DES_POINTS'. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Listage des coordonnees {u,v,w} des points introduits le 20101006103817... */ #define GENERATION_D_UNE_IMAGE_DU_VOLUME_SANS_DIFFERENTIATION(Fx,Fy,Fz,calcul_eventuel_point_courant,texturage,Fu,Fv,Fw,Tuvw) \ /* L'optionnalite du texturage via un 'BLOC(...)' a ete introduite le 20050622115433 afin */ \ /* de maintenir la compatibilite de programmes anterieurs ('v $xrs/Mobius3D.31$K' par */ \ /* exemple) et de ne pas avoir a modifier (en ajoutant des "Xmax=..." en particulier) des */ \ /* '$Z' les utilisant... */ \ Bblock \ DEFV(Float,INIT(d_u,FLOT__UNDEF)); \ DEFV(Float,INIT(d_v,FLOT__UNDEF)); \ DEFV(Float,INIT(d_w,FLOT__UNDEF)); \ /* Ces definitions n'ont comme seule utilite que d'eviter des problemes de compilation */ \ /* suite a la definition de {d_u_effectif,d_v_effectif,d_w_effectif} le 20060530095647 */ \ /* dans la procedure 'gGENERATION_D_UNE_IMAGE_DU_VOLUME(...)'... */ \ \ gGENERATION_D_UNE_IMAGE_DU_VOLUME \ (Fx,Fy,Fz \ ,calcul_eventuel_point_courant \ ,BLOC(Bblock \ BLOC(texturage); \ /* Texturage eventuel du volume... */ \ \ RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; \ /* On notera que cette recherche n'est pas conditionnee par 'editer_les_extrema', car les */ \ /* extrema pourraient etre utilises pour la visualisation... */ \ \ BLOC(calcul_eventuel_point_courant); \ /* Calculs eventuels d'informations specifiques au point courant... */ \ \ PERMUTATION_EVENTUELLE_DES_COORDONNEES_ET_DES_DIFFERENTIELLES; \ /* Permutation eventuelle de {cx,cy,cz} et de {dcx,dcy,dcz} (introduit le 20050623085804). */ \ \ LISTER_EVENTUELLEMENT_LES_COORDONNEES_u_v_w_DES_POINTS; \ /* Introduit le 20101006103817... */ \ \ CALS(memorisation_1_point_06(SOUS(cx,Xcentre_ESPACE) \ ,SOUS(cy,Ycentre_ESPACE) \ ,SOUS(cz,Zcentre_ESPACE) \ ,dcx \ ,dcy \ ,dcz \ ) \ ); \ /* Memorisation du point courant. */ \ \ Eblock \ ) \ ,Fu,Fv,Fw,Tuvw \ ) \ Eblock \ /* Calcul et visualisation du volume pour un instant donne sans differentiation. */ #define TEXTURE_PAR_DEFAUT \ FU #define GENERATION_D_UNE_IMAGE_DU_VOLUME_AVEC_DIFFERENCES____(Fx,Fy,Fz,calcul_eventuel_point_courant,texturage,Fu,Fv,Fw,Tuvw) \ /* L'optionnalite du texturage via un 'BLOC(...)' a ete introduite le 20050622115433 afin */ \ /* de maintenir la compatibilite de programmes anterieurs ('v $xrs/Mobius3D.31$K' par */ \ /* exemple) et de ne pas avoir a modifier (en ajoutant des "Xmax=..." en particulier) des */ \ /* '$Z' les utilisant... */ \ Bblock \ DEFV(Float,INIT(d_u,FLOT__UNDEF)); \ DEFV(Float,INIT(d_v,FLOT__UNDEF)); \ DEFV(Float,INIT(d_w,FLOT__UNDEF)); \ /* Ces definitions n'ont comme seule utilite que d'eviter des problemes de compilation */ \ /* suite a la definition de {d_u_effectif,d_v_effectif,d_w_effectif} le 20060530095647 */ \ /* dans la procedure 'gGENERATION_D_UNE_IMAGE_DU_VOLUME(...)'... */ \ \ gGENERATION_D_UNE_IMAGE_DU_VOLUME \ (Fx,Fy,Fz \ ,calcul_eventuel_point_courant \ ,BLOC(Bblock \ DEFV(Float,INIT(differentielle_x,FLOT__UNDEF)); \ DEFV(Float,INIT(differentielle_y,FLOT__UNDEF)); \ DEFV(Float,INIT(differentielle_z,FLOT__UNDEF)); \ /* Definition des trois differentielles. */ \ DEFV(Float,INIT(texture_x,TEXTURE_PAR_DEFAUT)); \ DEFV(Float,INIT(texture_y,TEXTURE_PAR_DEFAUT)); \ DEFV(Float,INIT(texture_z,TEXTURE_PAR_DEFAUT)); \ /* Definition des trois textures. */ \ \ Test(IL_FAUT(utiliser_les_differentielles_ROUGE_VERTE_BLEUE)) \ Bblock \ EGAL(differentielle_x,differentielle_ROUGE); \ EGAL(differentielle_y,differentielle_VERTE); \ EGAL(differentielle_z,differentielle_BLEUE); \ \ EGAL(utiliser_les_differentielles_ROUGE_VERTE_BLEUE,FAUX); \ /* Ne sert a rien, mais c'est plus sur... */ \ Eblock \ ATes \ Bblock \ EGAL(differentielle_x \ ,DERIVATION_PARTIELLE(Fx(SOUS(u_effectif,MUL2(facteur_x_de_pas_de_u,pas_u_de_differentiation)) \ ,SOUS(v_effectif,MUL2(facteur_x_de_pas_de_v,pas_v_de_differentiation)) \ ,SOUS(w_effectif,MUL2(facteur_x_de_pas_de_w,pas_w_de_differentiation)) \ ) \ ,Fx(ADD2(u_effectif,MUL2(facteur_x_de_pas_de_u,pas_u_de_differentiation)) \ ,ADD2(v_effectif,MUL2(facteur_x_de_pas_de_v,pas_v_de_differentiation)) \ ,ADD2(w_effectif,MUL2(facteur_x_de_pas_de_w,pas_w_de_differentiation)) \ ) \ ,DOUB(GpytF3D(MUL2(facteur_x_de_pas_de_u,pas_u_de_differentiation) \ ,MUL2(facteur_x_de_pas_de_v,pas_v_de_differentiation) \ ,MUL2(facteur_x_de_pas_de_w,pas_w_de_differentiation) \ ) \ ) \ ) \ ); \ EGAL(differentielle_y \ ,DERIVATION_PARTIELLE(Fy(SOUS(u_effectif,MUL2(facteur_y_de_pas_de_u,pas_u_de_differentiation)) \ ,SOUS(v_effectif,MUL2(facteur_y_de_pas_de_v,pas_v_de_differentiation)) \ ,SOUS(w_effectif,MUL2(facteur_y_de_pas_de_w,pas_w_de_differentiation)) \ ) \ ,Fy(ADD2(u_effectif,MUL2(facteur_y_de_pas_de_u,pas_u_de_differentiation)) \ ,ADD2(v_effectif,MUL2(facteur_y_de_pas_de_v,pas_v_de_differentiation)) \ ,ADD2(w_effectif,MUL2(facteur_y_de_pas_de_w,pas_w_de_differentiation)) \ ) \ ,DOUB(GpytF3D(MUL2(facteur_y_de_pas_de_u,pas_u_de_differentiation) \ ,MUL2(facteur_y_de_pas_de_v,pas_v_de_differentiation) \ ,MUL2(facteur_y_de_pas_de_w,pas_w_de_differentiation) \ ) \ ) \ ) \ ); \ EGAL(differentielle_z \ ,DERIVATION_PARTIELLE(Fz(SOUS(u_effectif,MUL2(facteur_z_de_pas_de_u,pas_u_de_differentiation)) \ ,SOUS(v_effectif,MUL2(facteur_z_de_pas_de_v,pas_v_de_differentiation)) \ ,SOUS(w_effectif,MUL2(facteur_z_de_pas_de_w,pas_w_de_differentiation)) \ ) \ ,Fz(ADD2(u_effectif,MUL2(facteur_z_de_pas_de_u,pas_u_de_differentiation)) \ ,ADD2(v_effectif,MUL2(facteur_z_de_pas_de_v,pas_v_de_differentiation)) \ ,ADD2(w_effectif,MUL2(facteur_z_de_pas_de_w,pas_w_de_differentiation)) \ ) \ ,DOUB(GpytF3D(MUL2(facteur_z_de_pas_de_u,pas_u_de_differentiation) \ ,MUL2(facteur_z_de_pas_de_v,pas_v_de_differentiation) \ ,MUL2(facteur_z_de_pas_de_w,pas_w_de_differentiation) \ ) \ ) \ ) \ ); \ /* Calcul des differentielles. Le passage du calcul formel au calcul numerique a ete */ \ /* effectue pour 'v $xrs/Mobius3D.11$K VISUALISATION_DU_VOLUME_AVEC_DIFFERENCES____' */ \ /* le 20040327163945. */ \ Eblock \ ETes \ \ BLOC(texturage); \ /* Texturage eventuel du volume... */ \ \ EGAL(dcx \ ,BARY(LIZ9(ponderation_de__x_____dans_dx,cx \ ,ponderation_de__y_____dans_dx,cy \ ,ponderation_de__z_____dans_dx,cz \ ,ponderation_de__u_____dans_dx,u \ ,ponderation_de__v_____dans_dx,v \ ,ponderation_de__w_____dans_dx,w \ ,ponderation_de_dx_____dans_dx,differentielle_x \ ,ponderation_de_dy_____dans_dx,differentielle_y \ ,ponderation_de_dz_____dans_dx,differentielle_z \ ) \ ,texture_x \ ,ponderation_ROUGE_pour_dcx \ ) \ ); \ EGAL(dcy \ ,BARY(LIZ9(ponderation_de__x_____dans_dy,cx \ ,ponderation_de__y_____dans_dy,cy \ ,ponderation_de__z_____dans_dy,cz \ ,ponderation_de__u_____dans_dy,u \ ,ponderation_de__v_____dans_dy,v \ ,ponderation_de__w_____dans_dy,w \ ,ponderation_de_dx_____dans_dy,differentielle_x \ ,ponderation_de_dy_____dans_dy,differentielle_y \ ,ponderation_de_dz_____dans_dy,differentielle_z \ ) \ ,texture_y \ ,ponderation_VERTE_pour_dcy \ ) \ ); \ EGAL(dcz \ ,BARY(LIZ9(ponderation_de__x_____dans_dz,cx \ ,ponderation_de__y_____dans_dz,cy \ ,ponderation_de__z_____dans_dz,cz \ ,ponderation_de__u_____dans_dz,u \ ,ponderation_de__v_____dans_dz,v \ ,ponderation_de__w_____dans_dz,w \ ,ponderation_de_dx_____dans_dz,differentielle_x \ ,ponderation_de_dy_____dans_dz,differentielle_y \ ,ponderation_de_dz_____dans_dz,differentielle_z \ ) \ ,texture_z \ ,ponderation_BLEUE_pour_dcz \ ) \ ); \ /* Calcul des couleurs utiles... */ \ /* */ \ /* La prise en compte eventuelle des coordonnees {cx,cy,cz} a ete introduite le */ \ /* 20090723121855 pour 'v $xiirs/PROJ.m1.2D'... */ \ \ RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; \ /* On notera que cette recherche n'est pas conditionnee par 'editer_les_extrema', car les */ \ /* extrema pourraient etre utilises pour la visualisation... */ \ \ BLOC(calcul_eventuel_point_courant); \ /* Calculs eventuels d'informations specifiques au point courant... */ \ \ PERMUTATION_EVENTUELLE_DES_COORDONNEES_ET_DES_DIFFERENTIELLES; \ /* Permutation eventuelle de {cx,cy,cz} et de {dcx,dcy,dcz} (introduit le 20050623085804). */ \ \ LISTER_EVENTUELLEMENT_LES_COORDONNEES_u_v_w_DES_POINTS; \ /* Introduit le 20101006103817... */ \ \ CALS(memorisation_1_point_06(SOUS(cx,Xcentre_ESPACE) \ ,SOUS(cy,Ycentre_ESPACE) \ ,SOUS(cz,Zcentre_ESPACE) \ ,dcx \ ,dcy \ ,dcz \ ) \ ); \ /* Memorisation du point courant. */ \ Eblock \ ) \ ,Fu,Fv,Fw,Tuvw \ ) \ Eblock \ /* Calcul et visualisation du volume pour un instant donne avec differentiation numerique. */ \ /* */ \ /* Le nom 'GENERATION_D_UNE_IMAGE_DU_VOLUME_AVEC_DIFFERENTIATION(...)' a ete change en */ \ /* GENERATION_D_UNE_IMAGE_DU_VOLUME_AVEC_DIFFERENCES____(...)' le 20041107152121 par */ \ /* symetrie avec ce qui a ete fait dans 'v $xrs/surfaces.12$I SURFACE_AVEC_DIFFERENCES____'. */ #define INITIALISATIONS_COMMUNES_DE_PROJECTION_DU_VOLUME \ Bblock \ EGAL(nombre_de_periodes_de_la_simulation,UN); \ /* Un seul "tour" suffit... */ \ \ EGAL(diviseur_du_pas_de_u,FU); \ EGAL(diviseur_du_pas_de_v,FU); \ EGAL(diviseur_du_pas_de_w,FU); \ \ Test(IL_FAUT(forcer_les_extrema_de_u_v_w_lors_de_la_projection_du_volume)) \ /* Test introduit le 20060307102027... */ \ Bblock \ EGAL(pas_de_u,DIVI(SOUS(maximum_de_u,minimum_de_u),FLOT(dimX))); \ EGAL(pas_de_v,DIVI(SOUS(maximum_de_v,minimum_de_v),FLOT(dimY))); \ EGAL(pas_de_w,DIVI(SOUS(maximum_de_w,minimum_de_w),FLOT(dimZ))); \ Eblock \ ATes \ Bblock \ EGAL(pas_de_u,DIVI(SOUS(sauvegarde_de_maximum_de_u,minimum_de_u),FLOT(dimX))); \ EGAL(pas_de_v,DIVI(SOUS(sauvegarde_de_maximum_de_v,minimum_de_v),FLOT(dimY))); \ EGAL(pas_de_w,DIVI(SOUS(sauvegarde_de_maximum_de_w,minimum_de_w),FLOT(dimZ))); \ Eblock \ ETes \ \ EGAL(echantillonnage_de_u,UN); \ EGAL(echantillonnage_de_v,UN); \ EGAL(echantillonnage_de_w,UN); \ EGAL(translation_de_l_echantillonnage_de_u,ZERO); \ EGAL(translation_de_l_echantillonnage_de_v,ZERO); \ EGAL(translation_de_l_echantillonnage_de_w,ZERO); \ /* Generation des trois projections d'une surface tel que cela est defini et exploite */ \ /* dans 'v $xrs/project2D.11$K P.R.O.J.E.C.T.O.R'. Ceci a ete introduit le 20041125111850. */ \ /* */ \ /* On notera que pour que cela ait un interet, il faut que : */ \ /* */ \ /* diviseur_du_pas_de_u = 1 (dpu=1) */ \ /* diviseur_du_pas_de_v = 1 (dpv=1) */ \ /* diviseur_du_pas_de_w = 1 (dpw=1) */ \ /* */ \ /* maximum_de_u - minimum_de_u */ \ /* pas_de_u = ----------------------------- */ \ /* dimX */ \ /* */ \ /* maximum_de_v - minimum_de_v */ \ /* pas_de_v = ----------------------------- */ \ /* dimY */ \ /* */ \ /* maximum_de_w - minimum_de_w */ \ /* pas_de_w = ----------------------------- */ \ /* dimZ */ \ /* */ \ /* afin de bien "remplir" les albums {Proj_Fx,Proj_Fy,Proj_Fz}. */ \ /* */ \ /* La reinitialisation de l'echantillonnage de la surface a ete introduit le 20050114214615 */ \ /* car cela manquait effectivement... */ \ Eblock \ /* Initialisations communes a tous les volumes destinees a permettre la reinjection des */ \ /* trois pseudo-projections {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} dans */ \ /* 'v $xrs/project3D.11$K' (introduit sous forme de procedure le 20050628080236...). */ #define INITIALISATIONS_SPECIFIQUES_DE_PROJECTION_DU_VOLUME(initialisations) \ Bblock \ Test(IL_FAUT(faire_les_initialisations_specifiques_de_projection_du_volume)) \ /* Test introduit le 20060502142823 par symetrie avec 'v $xrs/surfaces.12$I 20060502142542'. */ \ Bblock \ BLOC(initialisations;); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Initialisations specifiques a ce volume destinees a permettre la reinjection des */ \ /* trois pseudo-projections {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} dans */ \ /* 'v $xrs/project3D.11$K' (introduit le 20050628080236)... */ #define DEBUT_DE_LA_DEFINITION_DE_PETITS_ALBUMS \ /* ATTENTION : on notera l'absence de {Bblock,Eblock} afin de permettre au definitions de */ \ /* {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} qui sont faites a l'interieur du */ \ /* couple {DEBUT_DE_LA_DEFINITION_DE_PETITS_ALBUMS,FIN_DE_LA_DEFINITION_DE_PETITS_ALBUMS} */ \ /* de ne pas etre locales a l'interieur de cette "structure"... */ \ EGAL(sauvegarde_du_Zmax_reel,Zmax); \ \ Test(IL_FAUT(generer_les_trois_projections_du_volume)) \ Bblock \ Eblock \ ATes \ Bblock \ SET_DIMENSIONS_3D_SANS_VALIDATION(Xmin,Xmax,Ymin,Ymax,Zmin,Zmin); \ /* Ceci permet de generer des albums {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} */ \ /* ci-apres de tailles reduites puisqu'ils sont alors inutiles... */ \ Eblock \ ETes #define FIN_DE_LA_DEFINITION_DE_PETITS_ALBUMS \ EGAL(Zmax,sauvegarde_du_Zmax_reel); \ /* ATTENTION : on notera l'absence de {Bblock,Eblock} afin de permettre au definitions de */ \ /* {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} qui sont faites a l'interieur du */ \ /* couple {DEBUT_DE_LA_DEFINITION_DE_PETITS_ALBUMS,FIN_DE_LA_DEFINITION_DE_PETITS_ALBUMS} */ \ /* de ne pas etre locales a l'interieur de cette "structure"... */ #define gVISUALISATION_GENERALE_TEXTURE_DU_VOLUME(calcul_des_parametres,calcul_du_volume,Fx,Fy,Fz,Pxyz,debut_texture,fin_texture) \ Bblock \ DEFV(Float,INIT(sauvegarde_de_minimum_de_u,minimum_de_u)); \ DEFV(Float,INIT(sauvegarde_de_maximum_de_u,maximum_de_u)); \ DEFV(Float,INIT(sauvegarde_de_minimum_de_v,minimum_de_v)); \ DEFV(Float,INIT(sauvegarde_de_maximum_de_v,maximum_de_v)); \ DEFV(Float,INIT(sauvegarde_de_minimum_de_w,minimum_de_w)); \ DEFV(Float,INIT(sauvegarde_de_maximum_de_w,maximum_de_w)); \ /* Introduit le 20060307102027 par symetrie avec ''v $xrs/surfaces.12$I sauvegarde_de_m'. */ \ \ DEFV(Int,INIT(sauvegarde_du_Zmax_reel,Zmax)); \ /* On ne peut malheureusement utiliser {PUSH_DIMENSIONS_3D,PULL_DIMENSIONS_3D} a cause */ \ /* du 'Bblock' et du 'Eblock' qui les encadrent, ce qui rendraient les definitions de */ \ /* {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} locales a l'interieur... */ \ \ DEBUT_DE_LA_DEFINITION_DE_PETITS_ALBUMS; \ \ BDEFV(albumF,Projection_de_Fx); \ BDEFV(albumF,Projection_de_Fy); \ BDEFV(albumF,Projection_de_Fz); \ /* Definition des trois projections... */ \ \ FIN_DE_LA_DEFINITION_DE_PETITS_ALBUMS; \ \ Test(IL_FAUT(generer_les_trois_projections_du_volume)) \ /* Cas ou il faut generer les trois projections (introduit le 20050628080236) : */ \ Bblock \ /* ATTENTION ; jusqu'au 20050628155937, l'ordre des deux initialisations suivantes etaient */ \ /* etait l'inverse par erreur. 'INITIALISATIONS_SPECIFIQUES_DE_PROJECTION_DU_VOLUME' */ \ /* peut en effet modifier des parametres qui sont exploites (par exemple 'maximum_de_v') */ \ /* par 'INITIALISATIONS_COMMUNES_DE_PROJECTION_DU_VOLUME', d'ou l'ordre logique qui */ \ /* suit... */ \ INITIALISATIONS_SPECIFIQUES_DE_PROJECTION_DU_VOLUME(Pxyz); \ INITIALISATIONS_COMMUNES_DE_PROJECTION_DU_VOLUME; \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ BLOC(debut_texture); \ \ RE_INITIALISATION_DE_L_HORLOGE; \ /* Depuis que le 19990512152305 a ete mis en place un : */ \ /* */ \ /* INCREMENTATION_DE_L_HORLOGE(dct); */ \ /* */ \ /* apres chaque image, l'initialisation de l'horloge ne doit plus etre faite pour chaque */ \ /* image, mais une seul fois, au tout debut... */ \ \ Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation) \ Bblock \ INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante); \ /* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image. */ \ \ BLOC(calcul_des_parametres); \ /* Calcul des parametres evoluant au cours de la simulation... */ \ \ BLOC(calcul_du_volume); \ /* Calcul du volume proprement dit... */ \ \ Test(IL_FAUT(generer_les_trois_projections_du_volume)) \ /* Test introduit le 20060307110319 car, tres mysterieusement, il manquait... */ \ Bblock \ Eblock \ ATes \ Bblock \ GENERATION_D_UNE_IMAGE_ET_PASSAGE_A_LA_SUIVANTE(BLOC(VIDE;)); \ /* Generation de l'image courante... */ \ Eblock \ ETes \ \ INCREMENTATION_DE_L_HORLOGE(dct); \ /* Simulation d'un temps arbitraire (introduit le 19990512094356). */ \ Eblock \ EKom \ \ Test(IL_FAUT(generer_les_trois_projections_du_volume)) \ /* Cas ou il faut generer les trois projections : */ \ Bblock \ CALi(dAupdateF_album(nom_albumProjectionFx \ ,nom_postfixeProjectionFx \ ,premiere_imageProjectionFx \ ,pas_des_imagesProjectionFx \ ,Projection_de_Fx \ ,nombre_de_chiffresProjectionFx \ ,FAUX \ ) \ ); \ /* L'argument 'Inv' ('FAUX') a ete introduit le 20100624091846... */ \ CALi(dAupdateF_album(nom_albumProjectionFy \ ,nom_postfixeProjectionFy \ ,premiere_imageProjectionFy \ ,pas_des_imagesProjectionFy \ ,Projection_de_Fy \ ,nombre_de_chiffresProjectionFy \ ,FAUX \ ) \ ); \ /* L'argument 'Inv' ('FAUX') a ete introduit le 20100624091846... */ \ CALi(dAupdateF_album(nom_albumProjectionFz \ ,nom_postfixeProjectionFz \ ,premiere_imageProjectionFz \ ,pas_des_imagesProjectionFz \ ,Projection_de_Fz \ ,nombre_de_chiffresProjectionFz \ ,FAUX \ ) \ ); \ /* L'argument 'Inv' ('FAUX') a ete introduit le 20100624091846... */ \ Eblock \ ATes \ Bblock \ EDITION_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; \ /* Edition facultative des extrema des coordonnees. */ \ Eblock \ ETes \ \ BLOC(fin_texture); \ \ DEBUT_DE_LA_DEFINITION_DE_PETITS_ALBUMS; \ \ EDEFV(albumF,Projection_de_Fz); \ EDEFV(albumF,Projection_de_Fy); \ EDEFV(albumF,Projection_de_Fx); \ /* Definition des trois projections... */ \ \ FIN_DE_LA_DEFINITION_DE_PETITS_ALBUMS; \ Eblock \ /* Calcul et visualisation du volume avec evolution temporelle... */ #define VISUALISATION_GENERALE_DU_VOLUME(calcul_des_parametres,calcul_du_volume,Fx,Fy,Fz,Pxyz) \ Bblock \ gVISUALISATION_GENERALE_TEXTURE_DU_VOLUME(calcul_des_parametres \ ,calcul_du_volume \ ,Fx,Fy,Fz \ ,Pxyz \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Calcul et visualisation du volume avec evolution temporelle... */ #define transformer_u_v_w_hors_album \ transformer_u_v_w_niveau_hors_album /* Pour raccourcir quelques lignes a venir... */ #define PAS_DE_TRANSFO(uvw) \ NEUT(uvw) #define TRANSFORMATION_uvw(album,uvw) \ COND(IL_NE_FAUT_PAS(transformer_u_v_w) \ ,uvw \ ,sgFFAload_point_coordonnees_01(album \ ,u_NORMALISEE \ ,v_NORMALISEE \ ,w_NORMALISEE \ ,transformer_u_v_w_periodiser_u \ ,transformer_u_v_w_periodiser_v \ ,transformer_u_v_w_periodiser_w \ ,transformer_u_v_w_symetriser_u \ ,transformer_u_v_w_symetriser_v \ ,transformer_u_v_w_symetriser_w \ ,transformer_u_v_w_prolonger_u \ ,transformer_u_v_w_prolonger_v \ ,transformer_u_v_w_prolonger_w \ ,transformer_u_v_w_hors_album \ ,albumTransformation_uvw__interpoler_bilineairement_ou_bicubiquement \ ,albumTransformation_uvw__utiliser_l_interpolation_bilineaire \ ,albumTransformation_uvw__eviter_les_fortes_discontinuites \ ,albumTransformation_uvw__epsilon_detection_des_fortes_discontinuites \ ) \ ) #define TRANSFORM_u(u) \ TRANSFORMATION_uvw(albumTransformation_u,u) #define TRANSFORM_v(v) \ TRANSFORMATION_uvw(albumTransformation_v,v) #define TRANSFORM_w(w) \ TRANSFORMATION_uvw(albumTransformation_w,w) /* Introduit le 20060530133706... */ /* */ /* Le 20060601121716 je note qu'il faut etre tres prudent quant aux eventuelles */ /* discontinuites dans l'album ('v $xiipf/fonction.2$FON 20060601101800')... */ #define PAS_DE_TROUAGE \ TOUJOURS_VRAI #define TROUER_uvw \ IFOU(IL_NE_FAUT_PAS(trouer_u_v_w) \ ,IFET(IL_FAUT(trouer_u_v_w) \ ,EST_VRAI(fLOGI(sgFFAload_point_coordonnees_01 \ (albumTrouage_uvw \ ,u_NORMALISEE \ ,v_NORMALISEE \ ,w_NORMALISEE \ ,trouer_u_v_w_periodiser_u \ ,trouer_u_v_w_periodiser_v \ ,trouer_u_v_w_periodiser_w \ ,trouer_u_v_w_symetriser_u \ ,trouer_u_v_w_symetriser_v \ ,trouer_u_v_w_symetriser_w \ ,trouer_u_v_w_prolonger_u \ ,trouer_u_v_w_prolonger_v \ ,trouer_u_v_w_prolonger_w \ ,LE_VOLUME_EST_INTEGRE \ ,albumTrouage_uvw__interpoler_bilineairement_ou_bicubiquement \ ,albumTrouage_uvw__utiliser_l_interpolation_bilineaire \ ,albumTrouage_uvw__eviter_les_fortes_discontinuites \ ,albumTrouage_uvw__epsilon_detection_des_fortes_discontinuites \ ) \ ) \ ) \ ) \ ) /* Introduit le 20060530133706... */ /* */ /* Le 20060602091935 fut introduit le 'fLOGI(...)' pour eviter des trous parasites lies */ /* a des "rebonds" d'interpolation qui font que ce qui devrait valoir exactement 1 ('VRAI') */ /* peut valoir un tout petit peu moins, d'ou 0 ('FAUX') avec un 'LOGI(...)'... */ #define VISUALISATION_DU_VOLUME_SANS_DIFFERENTIATION(calcul_des_parametres,Fx,Fy,Fz,Pxyz,calcul_pc) \ /* Jusqu'au 20010525121332 'calcul_pc' s'appelait 'calcul_eventuel_point_courant' et son */ \ /* nom a ete reduit a cause de la longueur de la ligne qui le reference ci-apres... */ \ Bblock \ VISUALISATION_GENERALE_DU_VOLUME(BLOC(calcul_des_parametres) \ ,BLOC(Bblock \ GENERATION_D_UNE_IMAGE_DU_VOLUME_SANS_DIFFERENTIATION(Fx,Fy,Fz \ ,BLOC(calcul_pc) \ ,BLOC(VIDE;) \ ,PAS_DE_TRANSFO \ ,PAS_DE_TRANSFO \ ,PAS_DE_TRANSFO \ ,PAS_DE_TROUAGE \ ); \ Eblock \ ) \ ,Fx,Fy,Fz \ ,Pxyz \ ); \ Eblock \ /* Calcul sans differentiation et visualisation du volume avec evolution temporelle... */ #define VISUALISATION_DU_VOLUME_AVEC_DIFFERENCES____(calcul_des_parametres,Fx,Fy,Fz,Pxyz,calcul_pc) \ /* Jusqu'au 20010525121332 'calcul_pc' s'appelait 'calcul_eventuel_point_courant' et son */ \ /* nom a ete reduit a cause de la longueur de la ligne qui le reference ci-apres... */ \ Bblock \ VISUALISATION_GENERALE_DU_VOLUME(BLOC(calcul_des_parametres) \ ,BLOC(Bblock \ GENERATION_D_UNE_IMAGE_DU_VOLUME_AVEC_DIFFERENCES____(Fx,Fy,Fz \ ,BLOC(calcul_pc) \ ,BLOC(VIDE;) \ ,PAS_DE_TRANSFO \ ,PAS_DE_TRANSFO \ ,PAS_DE_TRANSFO \ ,PAS_DE_TROUAGE \ ); \ Eblock \ ) \ ,Fx,Fy,Fz \ ,Pxyz \ ); \ Eblock \ /* Calcul avec differentiation et visualisation du volume avec evolution temporelle... */ \ /* */ \ /* Le nom 'VISUALISATION_DU_VOLUME_AVEC_DIFFERENTIATION(...)' a ete change en */ \ /* VISUALISATION_DU_VOLUME_AVEC_DIFFERENCES____(...)' le 20041107152121 par */ \ /* symetrie avec ce qui a ete fait dans 'v $xrs/surfaces.12$I SURFACE_AVEC_DIFFERENCES____'. */ #define VISUALISATION_GENERALE_TEXTURE_DU_VOLUME(calcul_des_parametres,calcul_du_volume,Fx,Fy,Fz,Pxyz) \ Bblock \ gVISUALISATION_GENERALE_TEXTURE_DU_VOLUME(calcul_des_parametres \ ,calcul_du_volume \ ,Fx,Fy,Fz \ ,Pxyz \ ,BLOC( \ BDEFV(albumF,Album_ROUGE); \ BDEFV(albumF,Album_VERTE); \ BDEFV(albumF,Album_BLEUE); \ BDEFV(albumF,Album_RAYON); \ /* Definition des albums de texturage... */ \ \ ACCES_AUX_ALBUMS_FLOTTANTS(Album_ROUGE \ ,nom_texture_ROUGE \ ,nom_postfixe_ROUGE \ ,premiere_image_ROUGE \ ,pas_des_images_ROUGE \ ,nombre_de_chiffres_ROUGE \ ,TEXTURE_PAR_DEFAUT \ ); \ ACCES_AUX_ALBUMS_FLOTTANTS(Album_VERTE \ ,nom_texture_VERTE \ ,nom_postfixe_VERTE \ ,premiere_image_VERTE \ ,pas_des_images_VERTE \ ,nombre_de_chiffres_VERTE \ ,TEXTURE_PAR_DEFAUT \ ); \ ACCES_AUX_ALBUMS_FLOTTANTS(Album_BLEUE \ ,nom_texture_BLEUE \ ,nom_postfixe_BLEUE \ ,premiere_image_BLEUE \ ,pas_des_images_BLEUE \ ,nombre_de_chiffres_BLEUE \ ,TEXTURE_PAR_DEFAUT \ ); \ ACCES_AUX_ALBUMS_FLOTTANTS(Album_RAYON \ ,nom_RAYON \ ,nom_postfixe_RAYON \ ,premiere_image_RAYON \ ,pas_des_images_RAYON \ ,nombre_de_chiffres_RAYON \ ,rayon_de_visualisation \ ); \ ) \ ,BLOC( \ EDEFV(albumF,Album_RAYON); \ EDEFV(albumF,Album_BLEUE); \ EDEFV(albumF,Album_VERTE); \ EDEFV(albumF,Album_ROUGE); \ /* Definition des albums de texturage... */ \ ) \ ); \ Eblock \ /* Calcul et visualisation du volume avec evolution temporelle... */ #define VISUALISATION_DU_VOLUME_SANS_DIFFERENTIATION_ET_AVEC_TEXTURAGE(calcul_des_parametres,Fx,Fy,Fz,Pxyz,calcul_pc) \ /* Jusqu'au 20010525121332 'calcul_pc' s'appelait 'calcul_eventuel_point_courant' et son */ \ /* nom a ete reduit a cause de la longueur de la ligne qui le reference ci-apres... */ \ Bblock \ VISUALISATION_GENERALE_TEXTURE_DU_VOLUME(BLOC(calcul_des_parametres) \ ,BLOC(Bblock \ GENERATION_D_UNE_IMAGE_DU_VOLUME_SANS_DIFFERENTIATION(Fx,Fy,Fz \ ,BLOC(calcul_pc) \ ,GtV(dcx \ ,dcy \ ,dcz \ ); \ ,PAS_DE_TRANSFO \ ,PAS_DE_TRANSFO \ ,PAS_DE_TRANSFO \ ,PAS_DE_TROUAGE \ ); \ Eblock \ ) \ ,Fx,Fy,Fz \ ,Pxyz \ ); \ Eblock \ /* Calcul sans differentiation et visualisation du volume avec evolution temporelle... */ #define VISUALISATION_DU_VOLUME_AVEC_DIFFERENCES_ET_AVEC_TEXTURAGE____(calcul_des_parametres,Fx,Fy,Fz,Pxyz,calcul_pc) \ /* Jusqu'au 20010525121332 'calcul_pc' s'appelait 'calcul_eventuel_point_courant' et son */ \ /* nom a ete reduit a cause de la longueur de la ligne qui le reference ci-apres... */ \ Bblock \ VISUALISATION_GENERALE_TEXTURE_DU_VOLUME(BLOC(calcul_des_parametres) \ ,BLOC(Bblock \ BDEFV(albumF,albumTransformation_u); \ BDEFV(albumF,albumTransformation_v); \ BDEFV(albumF,albumTransformation_w); \ BDEFV(albumF,albumTrouage_uvw); \ /* Definition des albums de transformation et de trouage des coordonnees {u,v,w}... */ \ \ Test(IL_FAUT(transformer_u_v_w)) \ Bblock \ ACCES_AUX_ALBUMS_FLOTTANTS(albumTransformation_u \ ,nom_albumTransformation_u \ ,nom_postfixeTransformation_u \ ,premiere_imageTransformation_u \ ,pas_des_imagesTransformation_u \ ,nombre_de_chiffresTransformation_u \ ,transformer_u_v_w_hors_album \ ); \ ACCES_AUX_ALBUMS_FLOTTANTS(albumTransformation_v \ ,nom_albumTransformation_v \ ,nom_postfixeTransformation_v \ ,premiere_imageTransformation_v \ ,pas_des_imagesTransformation_v \ ,nombre_de_chiffresTransformation_v \ ,transformer_u_v_w_hors_album \ ); \ ACCES_AUX_ALBUMS_FLOTTANTS(albumTransformation_w \ ,nom_albumTransformation_w \ ,nom_postfixeTransformation_w \ ,premiere_imageTransformation_w \ ,pas_des_imagesTransformation_w \ ,nombre_de_chiffresTransformation_w \ ,transformer_u_v_w_hors_album \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(trouer_u_v_w)) \ Bblock \ ACCES_AUX_ALBUMS_FLOTTANTS(albumTrouage_uvw \ ,nom_albumTrouage_uvw \ ,nom_postfixeTrouage_uvw \ ,premiere_imageTrouage_uvw \ ,pas_des_imagesTrouage_uvw \ ,nombre_de_chiffresTrouage_uvw \ ,LE_VOLUME_EST_INTEGRE \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ GENERATION_D_UNE_IMAGE_DU_VOLUME_AVEC_DIFFERENCES____(Fx,Fy,Fz \ ,BLOC(calcul_pc) \ ,GtV(texture_x \ ,texture_y \ ,texture_z \ ); \ ,TRANSFORM_u \ ,TRANSFORM_v \ ,TRANSFORM_w \ ,TROUER_uvw \ ); \ \ EDEFV(albumF,albumTrouage_uvw); \ EDEFV(albumF,albumTransformation_w); \ EDEFV(albumF,albumTransformation_v); \ EDEFV(albumF,albumTransformation_u); \ /* Definition des albums de transformation et de trouage des coordonnees {u,v,w}... */ \ Eblock \ ) \ ,Fx,Fy,Fz \ ,Pxyz \ ); \ Eblock \ /* Calcul avec differentiation et visualisation du volume avec evolution temporelle... */ \ /* */ \ /* Le nom 'VISUALISATION_DU_VOLUME_AVEC_DIFFERENTIATION(...)' a ete change en */ \ /* VISUALISATION_DU_VOLUME_AVEC_DIFFERENCES____(...)' le 20041107152121 par */ \ /* symetrie avec ce qui a ete fait dans 'v $xrs/surfaces.12$I SURFACE_AVEC_DIFFERENCES____'. */