/*************************************************************************************************************************************/
/* */
/* 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____'. */