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




Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.