/*************************************************************************************************************************************/
/* */
/* F O N C T I O N D E M E M O R I S A T I O N D U P O I N T C O U R A N T : */
/* */
/* */
/* Author of '$xrv/champs_5.26$I' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1995??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H O I X D U T Y P E D E C O U L E U R S A G E N E R E R : */
/* */
/*************************************************************************************************************************************/
#define VISUALISER_EN_RVB \
VRAI
DEFV(Local,DEFV(Logical,INIT(visualiser_en_RVB,VISUALISER_EN_RVB)));
/* Indique si l'on visualise en Noir et Blanc ('FAUX') ou en vraies couleurs ('VRAI'). */
/* Une image en Noir et Blanc est obtenue en visualisant "betement" chaque pas {x,y,z,t} */
/* de l'iteration par une sphere blanche. Lorsqu'une visualisation en couleurs (appelee */
/* alors 'RVB') est demandee, chaque sphere est coloriee en associant chaque composante */
/* chromatique a l'une des trois differentielles : */
/* */
/* ROUGE <--> dx, */
/* VERTE <--> dy, */
/* BLEUE <--> dz. */
/* */
/* On notera que pour simplifier les choses (et donc reutiliser '$xrv/champs_5.1?$I'), la */
/* visualisation en Noir et Blanc genere malgre tout trois composantes RVB identiques... */
#define GENERER_DU_VRAI_NOIR_ET_BLANC \
VRAI
DEFV(Local,DEFV(Logical,INIT(generer_du_vrai_NOIR_et_BLANC,GENERER_DU_VRAI_NOIR_ET_BLANC)));
/* Lorsque 'IL_NE_FAUT_PAS(visualiser_en_RVB)', indique si l'on genere du vrai Noir et */
/* Blanc ('VRAI') ou si l'on s'autorise quand meme des "modulations" differentes entre les */
/* trois composantes ('FAUX'). */
#define NIVEAU_DU_CHAMP_NOIR_et_BLANC \
______________BLANC_NORMALISE
DEFV(Local,DEFV(genere_Float,INIT(niveau_du_champ_NOIR_et_BLANC,FLOT__NIVEAU_UNDEF)));
/* Lorsque 'IL_NE_FAUT_PAS(visualiser_en_RVB)' et 'IL_FAUT(generer_du_vrai_NOIR_et_BLANC)', */
/* donne les niveaux RVB respectifs (introduit le 20051220115558...). */
/* */
/* Le 20091022085930, 'NIVEAU_DU_CHAMP_NOIR_et_BLANC' fut remplace par 'FLOT__NIVEAU_UNDEF' */
/* a cause de 'NIVEAU_DU_CHAMP_NOIR_et_BLANC' defini par '______________BLANC_NORMALISE' */
/* et donc par 'v $xiiD/definit.2$DEF ______NORMALISE_NIVEAU' qui lui-meme utilise */
/* 'v $xiiD/definit.2$DEF AXE_NIVEAUX_OUVERT_FERME'. Alors 'NIVEAU_DU_CHAMP_NOIR_et_BLANC' */
/* ne peut etre dans un 'DEFV(Local,DEFV(genere_Float,INIT(...)))' puisqu'il teste une */
/* variable... */
#define COLORIER_LE_VRAI_NOIR_ET_BLANC \
FAUX
DEFV(Local,DEFV(Logical,INIT(colorier_le_vrai_noir_et_blanc,COLORIER_LE_VRAI_NOIR_ET_BLANC)));
/* Lorsque 'IL_FAUT(generer_du_vrai_NOIR_et_BLANC)' indique si le Noir et Blanc est "pur" */
/* ('VRAI') ou bien colorie l'aide du triplet {ROUGE,VERTE,BLEUE} defini ci-apres ('FAUX'). */
#define COULEUR_DU_VRAI_NOIR_ET_BLANC(niveau,champ_ROUGE,champ_VERTE,champ_BLEUE) \
COND(IL_FAUT(generer_du_vrai_NOIR_et_BLANC) \
,COND(IL_NE_FAUT_PAS(colorier_le_vrai_noir_et_blanc) \
,niveau_du_champ_NOIR_et_BLANC \
,niveau \
) \
,CALCUL_DE_LA_LUMINANCE(champ_ROUGE,champ_VERTE,champ_BLEUE) \
)
DEFV(Local,DEFV(genere_Float,INIT(niveau_ROUGE_du_champ_NOIR_et_BLANC,FLOT__NIVEAU_UNDEF)));
DEFV(Local,DEFV(genere_Float,INIT(niveau_VERTE_du_champ_NOIR_et_BLANC,FLOT__NIVEAU_UNDEF)));
DEFV(Local,DEFV(genere_Float,INIT(niveau_BLEUE_du_champ_NOIR_et_BLANC,FLOT__NIVEAU_UNDEF)));
/* Defini le coloriage du "Noir et Blanc". Tout ceci fut introduit le 20070818172849 pour */
/* 'v $xrk/lorenz.11$Z colorier_N_et_B'. Cela peut sembler un peu complique, mais le */
/* probleme est d'assurer la compatibilite anterieure... */
/* */
/* Le 20091022085930, 'NIVEAU_DU_CHAMP_NOIR_et_BLANC' fut remplace par 'FLOT__NIVEAU_UNDEF' */
/* a cause de 'NIVEAU_DU_CHAMP_NOIR_et_BLANC' defini par '______________BLANC_NORMALISE' */
/* et donc par 'v $xiiD/definit.2$DEF ______NORMALISE_NIVEAU' qui lui-meme utilise */
/* 'v $xiiD/definit.2$DEF AXE_NIVEAUX_OUVERT_FERME'. Alors 'NIVEAU_DU_CHAMP_NOIR_et_BLANC' */
/* ne peut etre dans un 'DEFV(Local,DEFV(genere_Float,INIT(...)))' puisqu'il teste une */
/* variable... */
/* */
/* Le 20160412105851, je rappelle que ces niveaux doivent etre dans [0,1] puisqu'ils */
/* sont en fait de meme nature que les differentielles {dx,dy,dz}... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N S T R U C T I O N S P O U R L A G E S T I O N E T L A P R O J E C T I O N D U R A Y O N : */
/* */
/*************************************************************************************************************************************/
#define RAYON_DU_POINT_COURANT(champ_RAYON) \
COND(IL_FAUT(projeter_correctement_le_rayon_avec_le_ZOOM),MUL2(rapport_courant_du_zoom,champ_RAYON),champ_RAYON)
/* Pour ce qui est de la projection du rayon, on verra avec interet les commentaires */
/* 'v $xrv/champs_5.26$I 20070823143716'... */
#include xrv/champs_5.27.I"
/* ATTENTION, pour regenerer exactement des images anterieures au 19971113103239, il */
/* conviendra de prendre pour 'projeter_correctement_le_rayon_avec_le_ZOOM' la valeur */
/* 'FAUX' et pour 'projeter_correctement_le_rayon_une_seule_fois' la valeur 'FAUX'. */
/* Cela se fera donc avec les options : */
/* */
/* rayon_correct_ZOOM=FAUX */
/* rayon_correct_une_seule_fois=FAUX */
/* */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N S T R U C T I O N S P O U R L A M E M O R I S A T I O N D U P O I N T C O U R A N T : */
/* */
/*************************************************************************************************************************************/
#define PRENDRE_UNE_ECHELLE_LINEAIRE_POUR_LES_COORDONNEES \
VRAI
DEFV(Local,DEFV(Logical,INIT(prendre_une_echelle_lineaire_pour_les_coordonnees,PRENDRE_UNE_ECHELLE_LINEAIRE_POUR_LES_COORDONNEES)));
/* Indique si l'on doit utiliser les coordonnees calculees ('VRAI') ou bien passer a une */
/* echelle "logarithmique" ('FAUX'), ce qui est tres pratique lorsqu'il y a une grande */
/* disparite dans les distances (voir par exemple 'v $xrr/N_corps.11$K' et le systeme */
/* solaire avec ses planetes exterieures...). */
#define EXPOSANT_DE_L_ECHELLE \
FDU
DEFV(Local,DEFV(Float,INIT(exposant_de_l_echelle,EXPOSANT_DE_L_ECHELLE)));
/* Parametre definissant la forme de l'echelle des coordonnees. */
#define ECHELLE_DES_COORDONNEES(valeur) \
PUIX(valeur,exposant_de_l_echelle) \
/* Fonction definissant l'echelle des coordonnees. */ \
/* */ \
/* On notera qu'utliser un exposant unite est equivalent a demander des echelles lineaires */ \
/* pour les coordonnees... */
#define ECHELLE_NON_LINEAIRE(valeur) \
MEME_SIGNE_QUE(valeur \
,SCAL(ECHELLE_DES_COORDONNEES(ABSO(valeur)) \
,ECHELLE_DES_COORDONNEES(MOIT(diagonale_ESPACE)) \
,MOIT(diagonale_ESPACE) \
) \
) \
/* Fonction de passage a une echelle non lineaire pour les coordonnees. La fonction */ \
/* utilisee est la fonction 'f(...)' suivante : */ \
/* */ \
/* E */ \
/* f(|x|) = |x| */ \
/* */
/* ATTENTION, la sequence de code qui suit se retrouve, a quelque chose pres, dans les */
/* deux fichiers suivants : */
/* */
/* $xrq/nucleon.LU$I */
/* $xrv/champs_5.26$I */
/* */
/* Donc, toute modification faite dans l'un, peut avoir a etre reportee dans l'autre... */
#define METTRE_LES_COORDONNEES_XYZ_DANS_0_1 \
VRAI
DEFV(Local,DEFV(Logical,INIT(mettre_les_coordonnees_XYZ_dans_0_1,METTRE_LES_COORDONNEES_XYZ_DANS_0_1)));
/* Indique si l'on doit mettre les coordonnees {Xf,Yf,Zf} dans [0,1] ('VRAI') ou bien les */
/* laisser tel quel ('FAUX') en faisant donc l'hypothese qu'elles y sont deja ; cela peut */
/* etre utile par exemple lorsque des coordonnees editees par un certain programme (par */
/* exemple 'v $xrr/N_corps.11$K' avec "lister_les_points=VRAI") sont reprises par le */
/* programme 'v $xrv/particule.10$K'. On notera que dans ce dernier cas, si cet indicateur */
/* vaut 'VRAI', alors les proportions ne sont plus conservees ; par exemple, un cercle */
/* deviendra une ellipse de grand axe vertical... */
/* 'faire_la_difference_entre_rayon_reel_absolu_et_rayon_reel_de_visualisation' a ete */
/* deplace de '$xrv/champs_5.26$I' a '$xrv/champs_5.27$I' le 20000301085218... */
#ifdef PRAGMA_CPP_____AUTORISER_LE_GooF
# TestADef ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF_____COMPATIBILITE_20080124 \
FAUX
DEFV(Local,DEFV(Logical,INIT(activer__s_il_est_activable__et__si_utile__GooF_____compatibilite_20080124
,ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF_____COMPATIBILITE_20080124
)
)
);
/* Afin d'assurer la compatibilite avec les resultats obtenus anterieurement a la date */
/* du 20080124181859 en ce qui concerne le probleme corrige par l'usage du 'GooF'... */
#Aifdef PRAGMA_CPP_____AUTORISER_LE_GooF
#Eifdef PRAGMA_CPP_____AUTORISER_LE_GooF
#define renormaliser_arbitrairement_derivees \
renormaliser_arbitrairement_les_differentielles
#define lister_la_liste_des_points_apres_toutes_transformations \
lister_la_liste_des_points_apres_toutes_les_transformations
#define faire_la_difference_entre_rayon_reel_absolu_et_rayon_reel_visu \
faire_la_difference_entre_rayon_reel_absolu_et_rayon_reel_de_visualisation
#define rayon_reel_de_visu \
rayon_reel_de_visualisation
#define initialiser_le_Z_Buffer_en_fonction_spheres_visu \
initialiser_le_Z_Buffer_en_fonction_des_spheres_visualisees
/* Definitions introduites le 20080125084533 afin de reduire la longueur de quelques */
/* lignes de 'MEMORISATION_DU_POINT_COURANT_COMPLET(...)'. */
#define INDIQUER_SI_TOUS_LES_POINTS_ONT_ETE_LISTES \
FAUX
DEFV(Local,DEFV(Logical,INIT(indiquer_si_tous_les_points_ont_ete_listes,INDIQUER_SI_TOUS_LES_POINTS_ONT_ETE_LISTES)));
/* Indique si l'on doit mettre les coordonnees {Xf,Yf,Zf} dans [0,1] ('VRAI') ou bien les */
DEFV(Local,DEFV(Positive,INIT(nombre_de_points_traites_par_MEMORISATION_DU_POINT_COURANT_COMPLET,ZERO)));
DEFV(Local,DEFV(Positive,INIT(nombre_de_points_listes_avant_toutes_transformations,ZERO)));
/* Compteurs introduits le 20131214183150 apres un probleme rencontre lors de la mise au */
/* point de l'image 'v $xiirv/PIPO.A1.21' : la marceh aleatoire n'etait pas connexe et ce */
/* parce qu'il y avit des points "a l'exterieur"... */
/* */
/* Le 20140823131224, 'nombre_de_points_listes_apres_toutes_transformations' a ete deplace */
/* dans 'v $xrv/champs_5.11$I 20140823131219' a cause des '$K's de '$xrq'... */
DEFV(Local,DEFV(Logical,INIT(il_y_a_une_identite_pour_le_point_courant_complet,FAUX)));
DEFV(Local,DEFV(Int,INIT(identite_du_point_courant_complet,UNDEF)));
/* Introduit le 20210101095317 pour 'v $xrr/N_corps.11$K 20210101095317'... */
#define MEMORISATION_DU_POINT_COURANT_COMPLET(champ_X,champ_Y,champ_Z,champ_RAYON,champ_ROUGE,champ_VERTE,champ_BLEUE) \
Bblock \
DEFV(genere_Float,INIT(champ_ROUGE_effectif,champ_ROUGE)); \
DEFV(genere_Float,INIT(champ_VERTE_effectif,champ_VERTE)); \
DEFV(genere_Float,INIT(champ_BLEUE_effectif,champ_BLEUE)); \
/* Variables introduites le 20070819104552 afin que les options : */ \
/* */ \
/* lister_les_points=VRAI lister_les_points_apres=FAUX */ \
/* */ \
/* et : */ \
/* */ \
/* lister_les_points=VRAI lister_les_points_apres=VRAI */ \
/* */ \
/* donnent les memes triplets {ROUGE,VERTE,BLEUE}. Cela n'etait pas vrai avant cette date */ \
/* et cela s'est vu avec 'v $xrk/lorenz.11$Z CouleursRDN'... */ \
\
INCR(nombre_de_points_traites_par_MEMORISATION_DU_POINT_COURANT_COMPLET,I); \
/* Comptage introduit le 20131214183150... */ \
\
Test(IL_FAUT(visualiser_en_RVB)) \
Bblock \
Eblock \
ATes \
Bblock \
EGAL(champ_ROUGE_effectif \
,COULEUR_DU_VRAI_NOIR_ET_BLANC(niveau_ROUGE_du_champ_NOIR_et_BLANC \
,champ_ROUGE \
,champ_VERTE \
,champ_BLEUE \
) \
); \
EGAL(champ_VERTE_effectif \
,COULEUR_DU_VRAI_NOIR_ET_BLANC(niveau_VERTE_du_champ_NOIR_et_BLANC \
,champ_ROUGE \
,champ_VERTE \
,champ_BLEUE \
) \
); \
EGAL(champ_BLEUE_effectif \
,COULEUR_DU_VRAI_NOIR_ET_BLANC(niveau_BLEUE_du_champ_NOIR_et_BLANC \
,champ_ROUGE \
,champ_VERTE \
,champ_BLEUE \
) \
); \
/* Niveau a utiliser pour le Noir et Blanc... */ \
Eblock \
ETes \
\
USs_GooF______CONDITIONNEL(activer__s_il_est_activable__et__si_utile__GooF_____compatibilite_20080124 \
,BLOC( \
Bblock \
/* Ceci a ete introduit le 20040423095426 dans le but de comprendre le probleme decrit */ \
/* dans 'v $xiirs/$Fnota 20040330115702'. */ \
/* */ \
/* ATTENTION : on notera le 20070126105733 que les programmes : */ \
/* */ \
/* $xrv/champs_5.10$K */ \
/* $xrv/champs_5.20$K */ \
/* $xrv/champs_5.30$K */ \
/* */ \
/* qui utilisent cette procedure 'MEMORISATION_DU_POINT_COURANT_COMPLET(...)' n'utilisent */ \
/* pas, a priori, la directive : */ \
/* */ \
/* #define PRAGMA_CPP_____AUTORISER_LE_GooF */ \
/* */ \
/* Pour ces programmes, '$GooF' n'est donc pas actif ; il s'agissait juste d'un test aux */ \
/* environs du 20040423095426... */ \
/* */ \
/* Le 20080106120733, je le laisse sous cette forme malgre l'introduction le 20080105225133 */ \
/* de 'v $xil/defi_K2$vv$DEF USE_GooF' et ce a cause de son statut de test de comprehension */ \
/* d'un probleme et de la difficulte de la mise en place de 'USs_GooF(...)' ici... */ \
\
Test(IFET(IZGT(champ_RAYON) \
,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(champ_ROUGE_effectif) \
,IZNE(champ_VERTE_effectif) \
,IZNE(champ_BLEUE_effectif) \
) \
) \
) \
) \
) \
) \
) \
/* Le test oublie sur 'renormaliser_arbitrairement_derivees' a ete ajoute */ \
/* le 19980304153153. */ \
/* */ \
/* Le 20030129175252, j'ai remplace le test : */ \
/* */ \
/* I3OU(IZGT(champ_ROUGE),IZGT(champ_VERTE),IZGT(champ_BLEUE)) */ \
/* */ \
/* qui testait la "positivite stricte" par un test sur la "non nullite stricte" qui */ \
/* semble plus logique, sans que je puisse reellement le justifier. Peut-etre s'agit-il */ \
/* d'un archaisme qui suppose que la nullite est associee a l'invisibilite. Il conviendrait */ \
/* peut-etre de supprimer tout simplement ce test ? */ \
/* */ \
/* Le 20030130132441, l'indicateur 'les_trois_les_differentielles_peuvent_etre_nulles' a */ \
/* ete introduit afin de supprimer l'archaisme mis en evidence le 20030129175316, tout en */ \
/* permettant une compatibilite par rapport aux executions anterieures... */ \
/* */ \
/* Le 20091102125100 je note que ce test doit etre reproduit integralement dans */ \
/* 'v $xrs/surfaces.12$I 20091102123057' afin de ne lister (eventuellement...) les */ \
/* coordonnees {u,v} que si les autres donnees type {X,Y,Z} le sont aussi... */ \
Bblock \
/* Cas ou le point {Xf,Yf,Zf} a un rayon strictement positif et ou au moins l'une des */ \
/* trois composantes est strictement positive : */ \
DEFV(Float,INIT(Lchamp_X,MUL2(facteur_de_collapse,champ_X))); \
DEFV(Float,INIT(Lchamp_Y,MUL2(facteur_de_collapse,champ_Y))); \
DEFV(Float,INIT(Lchamp_Z,MUL2(facteur_de_collapse,champ_Z))); \
/* Coordonnees intermediaires destinees eventuellement a passer a une echelle non lineaire. */ \
\
DEFV(Float,INIT(Yf_au_pole_nord_de_la_sphere,FLOT__UNDEF)); \
/* Definition de la coordonnee 'y' au pole de la particule dans [0,1]. */ \
\
DEFV(Float,INIT(rayon_reel_absolu,FLOT__UNDEF)); \
/* Rayon absolu (c'est-a-dire en general avant projection...). */ \
\
Test(IFET(IL_FAUT(lister_la_liste_des_points) \
,EST_FAUX(lister_la_liste_des_points_apres_toutes_transformations) \
) \
) \
Bblock \
INCR(nombre_de_points_listes_avant_toutes_transformations,I); \
/* Comptage introduit le 20131214183150... */ \
\
OUVRIR_L_ENTREE_COURANTE_DE_LA_LISTE; \
/* Introduit le 20210104115446... */ \
\
LISTER_LA_PERIODE_DE_LA_LISTE_DES_POINTS(champ_X,champ_Y,champ_Z); \
LISTER_LA_LISTE_DES_COORDONNEES_DES_POINTS(champ_X,champ_Y,champ_Z); \
LISTER_LA_LISTE_DES_VITESSES_DES_POINTS; \
\
Test(EST_VRAI(il_y_a_une_identite_pour_le_point_courant_complet)) \
Bblock \
CAL2(Prin1(" IDENTITE=%d" \
,identite_du_point_courant_complet \
) \
); \
/* Introduit le 20210101095317 pour 'v $xrr/N_corps.11$K 20210101095317'... */ \
/* */ \
/* On notera que l'identite est placee comme dans 'v $xrv/champs_5.11$I IDENTITE='... */ \
/* */ \
/* Le 20210104114710, je rapelle qu'ici, on liste les points AVANT (voir a ce propos */ \
/* 'v $xrv/champs_5.11$I 20210104113820'). */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
LISTER_LA_LISTE_DES_RAYONS_DES_POINTS(champ_RAYON); \
/* On notera le 20110712102842 que l'edition des rayons avant toutes les transformations */ \
/* donne bien 'champ_RAYON', c'est-a-dire les rayons tels qu'ils ont ete specifies en */ \
/* tant qu'arguments des '$X'... */ \
LISTER_LA_LISTE_DES_COULEURS_DES_POINTS(champ_ROUGE_effectif \
,champ_VERTE_effectif \
,champ_BLEUE_effectif \
); \
\
FERMER_L_ENTREE_COURANTE_DE_LA_LISTE; \
/* Introduit le 20210104115446... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_NE_FAUT_PAS(prendre_une_echelle_lineaire_pour_les_coordonnees)) \
Bblock \
DEFV(Float,INIT(rho,Rho_3D(Lchamp_X,Lchamp_Y,Lchamp_Z))); \
DEFV(Float,INIT(rho_non_lineaire,FLOT__UNDEF)); \
DEFV(Float,INIT(phi,Phi_3D(Lchamp_X,Lchamp_Y,Lchamp_Z))); \
DEFV(Float,INIT(theta,Theta_3D(Lchamp_X,Lchamp_Y,Lchamp_Z))); \
/* Passage en coordonnees spheriques... */ \
\
EGAL(rho_non_lineaire,ECHELLE_NON_LINEAIRE(rho)); \
/* Ce calcul intermediaire est destine simplement a alleger la charge des compilateurs et */ \
/* en particulier celui de 'SYSTEME_VAX9000_ULTRIX_GCC' (le 1996031400)... */ \
\
EGAL(Lchamp_X,Xcartesienne_3D(rho_non_lineaire,phi,theta)); \
EGAL(Lchamp_Y,Ycartesienne_3D(rho_non_lineaire,phi,theta)); \
EGAL(Lchamp_Z,Zcartesienne_3D(rho_non_lineaire,phi,theta)); \
/* Et enfin, retour aux coordonnees cartesiennes... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
EGAL(Xf \
,TRANSFORMATION_GEOMETRIQUE_3D_Fx(Lchamp_X,Lchamp_Y,Lchamp_Z \
,ASD1(translation_de_l_origine,dx) \
) \
); \
EGAL(Yf \
,TRANSFORMATION_GEOMETRIQUE_3D_Fy(Lchamp_X,Lchamp_Y,Lchamp_Z \
,ASD1(translation_de_l_origine,dy) \
) \
); \
EGAL(Zf \
,TRANSFORMATION_GEOMETRIQUE_3D_Fz(Lchamp_X,Lchamp_Y,Lchamp_Z \
,ASD1(translation_de_l_origine,dz) \
) \
); \
/* Coordonnees {x,y,z} de la particule dans l'espace physique eventuellement translatee */ \
/* le long de la direction de la vitesse afin de visualiser des chaines de sphere lorsque */ \
/* cela est demande... */ \
\
EGAL(Yf_au_pole_nord_de_la_sphere \
,ADD2(Yf,RAYON_DU_POINT_COURANT(champ_RAYON)) \
); \
/* Calcul de la coordonnee 'y' de l'un des "poles" de la particule dans [0,1], afin de */ \
/* calculer son rayon apparent... */ \
\
Test(IL_FAUT(mettre_les_coordonnees_XYZ_dans_0_1)) \
Bblock \
EGAL(Yf_au_pole_nord_de_la_sphere \
,Y_PHYSIQUE_DANS_01(Yf_au_pole_nord_de_la_sphere) \
); \
\
EGAL(Xf,X_PHYSIQUE_DANS_01(Xf)); \
EGAL(Yf,Y_PHYSIQUE_DANS_01(Yf)); \
EGAL(Zf,Z_PHYSIQUE_DANS_01(Zf)); \
/* Coordonnees {x,y,z} de la particule dans [0,1]... */ \
\
EGAL(rayon_reel_absolu,lZ_PHYSIQUE_DANS_01(champ_RAYON)); \
/* Rayon absolu avant projection. On notera que c'est 'lZ_PHYSIQUE_DANS_01(...)' qui est */ \
/* utilise car, en effet, 'rayon_reel_absolu' est utilise ulterieurement pour la gestion */ \
/* de l'anti-aliasing ('v $xrv/champs_5.1C$I Arayon') en conjonction avec la coordonnee 'Z'. */ \
Eblock \
ATes \
Bblock \
EGAL(rayon_reel_absolu,champ_RAYON); \
/* Rayon absolu avant projection... */ \
Eblock \
ETes \
\
EGAL(rayon_reel_de_visu \
,COND(IL_FAUT(projeter_correctement_le_rayon_une_seule_fois) \
,SOUA(Yf_au_pole_nord_de_la_sphere \
,Yf \
) \
,SOUA(Projection_OY(Xf,Yf_au_pole_nord_de_la_sphere,Zf) \
,Projection_OY(Xf,Yf,Zf) \
) \
) \
); \
/* Determination du rayon reellement utilise pour la visualisation... */ \
/* */ \
/* On notera le 20070823143716 qu'au moment de la projection des coordonnees et du rayon */ \
/* des particules, ces dernieres quantites sont en general dans [0,1]. Un parametre */ \
/* important pour jouer sur la taille apparente relative de differents rayons identiques, */ \
/* mais situes a des profondeurs differentes, est le parametre fondamental */ \
/* 'v $xrv/champs_5.13$I facteur_en_Z_de_l_observateur' dont la valeur par defaut est */ \
/* 2 a cette date ; ceci est trop important et provoque un effet d'ecrasement de la */ \
/* perspective, de tels differents rayons semblant alors relativement egaux... */ \
\
Test(IL_FAUT(faire_la_difference_entre_rayon_reel_absolu_et_rayon_reel_visu)) \
Bblock \
Eblock \
ATes \
Bblock \
EGAL(rayon_reel_absolu,rayon_reel_de_visu); \
/* Ainsi, on ignore 'rayon_reel_absolu' revenant a la version du 19991216165710... */ \
Eblock \
ETes \
\
Test(EST_FAUX(LE_POINT_EST_INVISIBLE_OU_INDETERMINE(Xf \
,Yf \
,ADD2(Zf \
,rayon_reel_de_visu \
) \
) \
) \
) \
Bblock \
/* Cas ou le point {Xf,Yf,Zf} est visible apres projection. On notera que pendant */ \
/* longtemps, il y a eu ici : */ \
/* */ \
/* Test(EST_FAUX(LE_POINT_EST_INVISIBLE_OU_INDETERMINE(Xf,Yf,Zf))) */ \
/* */ \
/* ce qui, dans 'DEFINITION_DU_POINT_2D_COURANT_SUR_LA_SPHERE(...)', pouvait creer des */ \
/* problemes ; il est donc plus logique d'utiliser le point que l'on suppose le plus */ \
/* proche de l'observateur (que l'on suppose donc ici sur l'axe 'OZ', ce qui n'est donc */ \
/* pas toujours vrai -voir les cas de stereoscopie-). */ \
\
Test(IZNE(rayon_reel_de_visu)) \
Bblock \
/* Cas ou le point {Xf,Yf,Zf} est materialise par une sphere non ponctuelle... */ \
MEMORISATION_D_UN_POINT(Xf,Yf,Zf \
,rayon_reel_absolu \
,rayon_reel_de_visu \
,champ_ROUGE_effectif \
,champ_VERTE_effectif \
,champ_BLEUE_effectif \
); \
/* Memorisation du point courant dans l'espace de visualisation... */ \
/* */ \
/* On rappelle le 20120516155951 que 'MEMORISATION_D_UN_POINT(...)' peut faire, elle-aussi, */ \
/* (apres donc les 'TRANSFORMATION_GEOMETRIQUE_3D_F?(...)'s) appel a : */ \
/* */ \
/* LISTER_LA_PERIODE_DE_LA_LISTE_DES_POINTS(...); */ \
/* */ \
/* comme cela a pu etre fait avant les 'TRANSFORMATION_GEOMETRIQUE_3D_F?(...)'s et ce en */ \
/* fonction de l'etat de 'lister_la_liste_des_points_apres_toutes_les_transformations'... */ \
\
Test(IL_FAUT(initialiser_le_Z_Buffer_en_fonction_spheres_visu)) \
/* Ce test a ete introduit le 20000627164827 ('v $xrv/champs_5.16$I 20000627164827'). */ \
Bblock \
EGAL(valeur_d_initialisation_du_Z_Buffer \
,MIN2(valeur_d_initialisation_du_Z_Buffer \
,SOUS(Zf,rayon_reel_de_visu) \
) \
); \
/* La future valeur d'initialisation du 'Z-Buffer' est en fait la plus petite coordonnee */ \
/* 'Z' rencontree (c'est le minimum des 'Z' des points "arriere" de chaque sphere...). */ \
Eblock \
ATes \
Bblock \
/* La future valeur d'initialisation du 'Z-Buffer' est independante de la scene a visualiser */ \
/* et a ete fixee dans 'v $xrv/champs_5.16$I PREPARATION_DE_L_INITIALISATION_DU_Z_BUFFER'. */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
/* Cas ou le point {Xf,Yf,Zf} est materialise par une sphere ponctuelle... */ \
Eblock \
ETes \
\
Eblock \
ATes \
Bblock \
/* Cas ou le point {Xf,Yf,Zf} n'est pas visible apres projection... */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
/* Cas ou le point {Xf,Yf,Zf} a un rayon negatif ou nul... */ \
Eblock \
ETes \
\
Eblock \
) \
); \
/* Ceci a ete introduit le 20040423095426 dans le but de comprendre le probleme decrit */ \
/* dans 'v $xiirs/$Fnota 20040330115702'. */ \
/* */ \
/* ATTENTION : on notera le 20070126105733 que les programmes : */ \
/* */ \
/* $xrv/champs_5.10$K */ \
/* $xrv/champs_5.20$K */ \
/* $xrv/champs_5.30$K */ \
/* */ \
/* qui utilisent cette procedure 'MEMORISATION_DU_POINT_COURANT_COMPLET(...)' n'utilisent */ \
/* pas, a priori, la directive : */ \
/* */ \
/* #define PRAGMA_CPP_____AUTORISER_LE_GooF */ \
/* */ \
/* Pour ces programmes, '$GooF' n'est donc pas actif ; il s'agissait juste d'un test aux */ \
/* environs du 20040423095426... */ \
/* */ \
/* Le 20080106120733, je le laisse sous cette forme malgre l'introduction le 20080105225133 */ \
/* de 'v $xil/defi_K2$vv$DEF USE_GooF' et ce a cause de son statut de test de comprehension */ \
/* d'un probleme et de la difficulte de la mise en place de 'USs_GooF(...)' ici... */ \
\
Eblock \
/* Instructions necessaires a la memorisation du point courant (s'il est visible...). */
/* ATTENTION, la sequence de code qui precede se retrouve, a quelque chose pres, dans les */
/* deux fichiers suivants : */
/* */
/* $xrq/nucleon.LU$I */
/* $xrv/champs_5.26$I */
/* */
/* Donc, toute modification faite dans l'un, peut avoir a etre reportee dans l'autre... */