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