/*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N E T G E S T I O N D E L A L I S T E D E S P O I N T S : */ /* */ /* */ /* Author of '$xrv/champs_5.11$I' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1992??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D ' U N E L I S T E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #include xrv/champs_5.41.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A L I S T E D E S P O I N T S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, jusqu'au 20010920094016, il y avait ici : */ /* */ /* #define DEFINITION_DES_LISTES_DE_POINTS_VERSION_01 */ /* #nodefine DEFINITION_DES_LISTES_DE_POINTS_VERSION_02 */ /* */ /* #ifdef DEFINITION_DES_LISTES_DE_POINTS_VERSION_01 */ /* # define PREMIER_POINT_DES_LISTES \ */ /* PREMIER_POINT */ /* #Aifdef DEFINITION_DES_LISTES_DE_POINTS_VERSION_01 */ /* #Eifdef DEFINITION_DES_LISTES_DE_POINTS_VERSION_01 */ /* */ /* #ifdef DEFINITION_DES_LISTES_DE_POINTS_VERSION_02 */ /* # define PREMIER_POINT_DES_LISTES \ */ /* PREMIER_ELEMENT_D_UN_FICHIER */ /* #Aifdef DEFINITION_DES_LISTES_DE_POINTS_VERSION_02 */ /* #Eifdef DEFINITION_DES_LISTES_DE_POINTS_VERSION_02 */ /* */ /* avec : */ /* */ /* PREMIER_POINT = PREMIERE_ITERATION_D_UN_Komp = 1 */ /* */ /* et : */ /* */ /* PREMIER_ELEMENT_D_UN_FICHIER = INDEX0 = 0 */ /* */ /* Or il est impossible de passer d'une VERSION a l'autre car, en effet, les "corps" qui */ /* utiliseront ces definitions seront geres par des 'Komp(...)' (on verra par exemple le */ /* programme 'v $xrk/rdn_walk.52K Komp' avec lequel j'ai reellement pris conscience de */ /* ce probleme). Il est donc essentiel qu'il y ait compatibilite entre la definition de */ /* 'PREMIER_POINT_DES_LISTES', les procedures d'acces aux listes que l'on va definir */ /* ensuite ('v $xrk/rdn_walk.52$K gACCES_IDENTITES') et la gestion des numeros des "corps" */ /* via les 'Komp(...)'... */ #define PREMIER_POINT_DES_LISTES \ PREMIER_POINT \ /* Definit l'index du premier point dans la liste... */ #if ( (! defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_ZONE_DE_SWAP_1)) \ && (! defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_LIMIT_MEMORY_1)) \ ) # TestADef NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES \ CENT_MILLE \ /* Cette constante est destinee a dimensionner les listes "lineaires" de memorisation des */ \ /* points a visualiser... */ #Aif ( (! defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_ZONE_DE_SWAP_1)) \ && (! defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_LIMIT_MEMORY_1)) \ ) # TestADef NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES \ DIX_MILLE \ /* Cette constante est destinee a dimensionner les listes "lineaires" de memorisation des */ \ /* points a visualiser... */ #Eif ( (! defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_ZONE_DE_SWAP_1)) \ && (! defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_LIMIT_MEMORY_1)) \ ) DEFV(Local,DEFV(Positive,INIT(nombre_maximal_de_points_visualisables,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES))); /* Ceci fut introduit le 20111212160621 afin de pouvoir etre edite pour information via */ /* 'v $xrv/champs_5.1A$I nombre_maximal_de_points_visualisables'... */ /* */ /* Le 20200403094943, le type 'Int' est devenu 'Positive' plus logique... */ DEFV(Local,DEFV(Int,INIT(index_de_rangement_dans_la_liste,PREMIER_POINT_DES_LISTES))); /* Index de rangement dans la liste... */ DEFV(Local,DEFV(Int,INIT(index_d_extraction_de_la_liste,PREMIER_POINT_DES_LISTES))); /* Index d'extraction de la liste... */ gDEFINITION_LISTE(liste_des_index,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_numeros,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_X,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_Y,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_Z,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_GPOND,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_IDENTITE,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_MASSE,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_aRAYON,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_vRAYON,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_ROUGE,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_VERTE,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); gDEFINITION_LISTE(liste_des_BLEUE,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES); /* Les points a visualiser sont memorises au prealable dans une liste "vectorielle" ; on */ /* ne fait pas appel a des vrais listes pour des raisons de performance. On trouve ainsi : */ /* */ /* index : index de permutation destine a trier la liste sans deplacer les elements, */ /* numero : memorise 'numero_de_l_iteration_courante', */ /* X : coordonnee 'X' dans [0,1], */ /* Y : coordonnee 'Y' dans [0,1], */ /* Z : coordonnee 'Z' dans [0,1] (c'est sur elle qu'a lieu le tri : elle donne la */ /* coordonnee 'Z' dans l'espace de visualisation, -infini etant derriere et */ /* et +infini devant), */ /* GPOND : contribution de cette sphere au calcul du pseudo-centre de gravite, */ /* IDENTITE : identite de la sphere de materialisation, */ /* MASSE : masse de la sphere de materialisation, */ /* aRAYON : rayon Absolu de la sphere de materialisation dans [0,1], */ /* vRAYON : rayon de Visualisation de la sphere de materialisation dans [0,1], */ /* ROUGE : composante ROUGE de la couleur dans [0,255], */ /* VERTE : composante VERTE de la couleur dans [0,255], */ /* BLEUE : composante BLEUE de la couleur dans [0,255]. */ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N I T I A L I S A T I O N D E L A L I S T E D E S P O I N T S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, un dispositif de non reinitialisation des listes pour chaque image avait */ /* ete implemente le 1995062600. Il reposait en particulier sur la programmation suivante */ /* de 'INITIALISATION_DE_LA_LISTE_DES_POINTS' : */ /* */ /* #define REINITIALISER_LA_LISTE_DES_POINTS_AVANT_CHAQUE_IMAGE \ */ /* VRAI */ /* DEFV(Local,DEFV(Logical,INIT(reinitialiser_la_liste */ /* ,REINITIALISER_LA_LISTE */ /* ) */ /* ) */ /* ); */ /* DEFV(Local,DEFV(Logical,INIT(la_liste_des_points_a_ete_initialisee,FAUX))); */ /* */ /* #define INITIALISATION_DE_LA_LISTE_DES_POINTS \ */ /* Bblock \ */ /* Test(IFOU(IL_FAUT(reinitialiser_la_liste) \ */ /* ,IFET(IL_NE_FAUT_PAS(reinitialiser_la_liste) \ */ /* ,EST_FAUX(la_liste_des_points_a_ete_initialisee) \ */ /* ) \ */ /* ) \ */ /* ) \ */ /* Bblock \ */ /* EGAL(index_de_rangement_dans_la_liste \ */ /* ,PREMIER_POINT_DES_LISTES \ */ /* ); \ */ /* EGAL(la_liste_des_points_a_ete_initialisee,VRAI); \ */ /* Eblock \ */ /* ATes \ */ /* Bblock \ */ /* INCR(index_de_rangement_dans_la_liste,I); \ */ /* Eblock \ */ /* ETes \ */ /* Eblock \ */ /* */ /* Malheureusement, a cause de 'liste_des_index' cela ne peut pas fonctionner aussi */ /* simplement. En effet, au fur et a mesure, 'liste_des_index' finit par contenir */ /* n'importe quoi, et par exemple, plusieurs fois le meme index... */ /* */ /* Si besoin etait, il suffirait a l'entree de 'TRI_D_UNE_LISTE_DE_POINTS' de placer */ /* une boucle qui reinitialiserait systematiquement 'liste_des_index'. Mais comme ce */ /* dispositif est tres voisin des "trainees" (avec moins de possibilites, en particulier */ /* en ce qui concerne l'attenuation) il n'est pas utile de l'implementer... */ /* */ /* Enfin, cela est finalement peu interessant car, en effet, les points lorsqu'ils */ /* memorises ici ont deja subi les transformations geometriques. Ce qui aurait ete plus */ /* interessant c'est d'avoir dans les listes les points avant ces memes transformations. */ #ifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_01 # define INITIALISATION_DE_LA_LISTE_DES_POINTS \ Bblock \ EGAL(index_de_rangement_dans_la_liste,PREMIER_POINT_DES_LISTES); \ /* (re-)initialisation de l'index de rangement dans la liste... */ \ Eblock \ /* Initialisation de la liste des points avant chaque nouvelle image. */ #Aifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_01 #Eifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_01 #ifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_02 # define INITIALISATION_DE_LA_LISTE_DES_POINTS \ Bblock \ gINITIALISATION_LISTE(liste_des_index,FLOT__UNDEF,PREMIER_POINT_DES_LISTES,nombre_d_iterations); \ gINITIALISATION_LISTE(liste_des_numeros,FLOT__UNDEF,PREMIER_POINT_DES_LISTES,nombre_d_iterations); \ \ EGAL(index_de_rangement_dans_la_liste,PREMIER_POINT_DES_LISTES); \ /* (re-)initialisation de l'index de rangement dans la liste... */ \ Eblock \ /* Initialisation de la liste des points avant chaque nouvelle image. */ #Aifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_02 #Eifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_02 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N E P S E U D O - I D E N T I T E : */ /* */ /*************************************************************************************************************************************/ #define DEFINITION_DE_L_IDENTITE_DE_LA_SPHERE_COURANTE(identite) \ Bblock \ EGAL(identite_de_la_sphere_courante,identite); \ Eblock #define IDENTITE_PAR_DEFAUT_D_UNE_SPHERE \ ZERO DEFV(Local,DEFV(Int,INIT(identite_de_la_sphere_courante,IDENTITE_PAR_DEFAUT_D_UNE_SPHERE))); /* Identite de de la sphere courante de visualisation. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E D I T I O N D ' U N P S E U D O - C E N T R E D E G R A V I T E */ /* S E S C O O R D O N N E E S E T A N T E X P R I M E E S D A N S [0,1+h]x[0,1]x[0,1] */ /* ( O U ' h ' E S T L A P O U R P R E N D R E E N C O M P T E L E F O R M A T : */ /* */ /*************************************************************************************************************************************/ #define EDITER_LE_PSEUDO_CENTRE_DE_GRAVITE \ FAUX DEFV(Local,DEFV(Logical,INIT(editer_le_pseudo_centre_de_gravite,EDITER_LE_PSEUDO_CENTRE_DE_GRAVITE))); /* Cet indicateur permet d'editer un pseudo-centre de gravite. On notera que l'on parle */ /* de pseudo-centre de gravite (introduit le 19980205124220) car, en effet, il n'y a pas */ /* a priori de notion de masse. Celle-ci existe dans les programmes 'v $xrr/N_corps.11$K' */ /* ou 'v $xrk/rdn_walk.41$K', par exemple, mais n'est pas generale. D'ou ici, cette notion */ /* de masse obtenue par une combinaison lineaire des elements : */ /* */ /* 3 */ /* {MASSE,RAYON ,ROUGE,VERTE,BLEUE} */ /* */ /* pour chaque point. Malgre tout, on voit que l'on utilise le cube du rayon qui est donc */ /* proportionnel au volume des spheres et donc a leur masse (on ignore quand meme ici la */ /* masse volumique...). Le 19980209085052, j'ai commence malgre tout a introduire une vraie */ /* masse... */ #define DEFINITION_PONDERATION_DU_PSEUDO_CENTRE_DE_GRAVITE_DE_LA_SPHERE_COURANTE(ponderation) \ Bblock \ EGAL(ponderation_du_pseudo_centre_de_gravite_de_la_sphere_courante,ponderation); \ Eblock #define PONDERATION_DU_PSEUDO_CENTRE_DE_GRAVITE_DE_LA_SPHERE_COURANTE \ FU DEFV(Local,DEFV(Float,INIT(ponderation_du_pseudo_centre_de_gravite_de_la_sphere_courante ,PONDERATION_DU_PSEUDO_CENTRE_DE_GRAVITE_DE_LA_SPHERE_COURANTE ) ) ); /* Ponderation de la sphere courante pour le calcul du pseudo-centre de gravite. Ainsi, */ /* lorsque 'DEFINITION_PONDERATION_DU_PSEUDO_CENTRE_DE_GRAVITE_DE_LA_SPHERE_COURANTE(...)' */ /* n'est pas utilisee, toutes les spheres ont la meme ponderation lors du calcul du */ /* pseudo-centre de gravite 'PONDERATION_DU_PSEUDO_CENTRE_DE_GRAVITE_DE_LA_SPHERE_COURANTE'. */ /* Ce dispositif a ete introduit le 19990608091843, principalement pour etre utilise dans */ /* 'v $xrr/N_corps.11$K ACCES_PONDERATION_CENTRE_DE_GRAVITE'. */ #define DEFINITION_DE_LA_MASSE_DE_LA_SPHERE_COURANTE(masse) \ Bblock \ EGAL(masse_de_la_sphere_courante,masse); \ Eblock #define MASSE_PAR_DEFAUT_D_UNE_SPHERE \ FU DEFV(Local,DEFV(Float,INIT(masse_de_la_sphere_courante,MASSE_PAR_DEFAUT_D_UNE_SPHERE))); /* Masse de la sphere courante de visualisation et son positionnement. On voit ainsi que */ /* pour les programmes n'utilisant pas 'DEFINITION_DE_LA_MASSE_DE_LA_SPHERE_COURANTE(...)' */ /* chaque sphere a la meme masse 'MASSE_PAR_DEFAUT_D_UNE_SPHERE'. */ #define FACTEUR_NEUTRE_DU_PSEUDO_CENTRE_DE_GRAVITE \ FZERO #define FACTEUR_MASSE_DU_PSEUDO_CENTRE_DE_GRAVITE \ FU #define FACTEUR_RAYON_DU_PSEUDO_CENTRE_DE_GRAVITE \ FZERO #define FACTEUR_ROUGE_DU_PSEUDO_CENTRE_DE_GRAVITE \ FZERO #define FACTEUR_VERTE_DU_PSEUDO_CENTRE_DE_GRAVITE \ FZERO #define FACTEUR_BLEUE_DU_PSEUDO_CENTRE_DE_GRAVITE \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_NEUTRE_du_pseudo_centre_de_gravite,FACTEUR_NEUTRE_DU_PSEUDO_CENTRE_DE_GRAVITE))); DEFV(Local,DEFV(Float,INIT(facteur_MASSE_du_pseudo_centre_de_gravite,FACTEUR_MASSE_DU_PSEUDO_CENTRE_DE_GRAVITE))); DEFV(Local,DEFV(Float,INIT(facteur_RAYON_du_pseudo_centre_de_gravite,FACTEUR_RAYON_DU_PSEUDO_CENTRE_DE_GRAVITE))); DEFV(Local,DEFV(Float,INIT(facteur_ROUGE_du_pseudo_centre_de_gravite,FACTEUR_ROUGE_DU_PSEUDO_CENTRE_DE_GRAVITE))); DEFV(Local,DEFV(Float,INIT(facteur_VERTE_du_pseudo_centre_de_gravite,FACTEUR_VERTE_DU_PSEUDO_CENTRE_DE_GRAVITE))); DEFV(Local,DEFV(Float,INIT(facteur_BLEUE_du_pseudo_centre_de_gravite,FACTEUR_BLEUE_DU_PSEUDO_CENTRE_DE_GRAVITE))); /* Facteurs de la ponderation des coordonnees donnant le pseudo-centre de gravite. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E D I T I O N D E L A L I S T E D E S P O I N T S D A N S L ' E S P A C E */ /* T R I D I M E N S I O N E L ( N O N P R O J E T E ) : */ /* */ /*************************************************************************************************************************************/ #define EDITER_LE_NOMBRE_DE_POINTS_MEMORISES \ FAUX DEFV(Local,DEFV(Logical,INIT(editer_le_nombre_de_points_memorises,EDITER_LE_NOMBRE_DE_POINTS_MEMORISES))); /* Cet indicateur permet d'editer le nombre de points memorises. Il a ete introduit le */ /* 20200402115605 a des fins de test... */ #define LISTER_LA_LISTE_DES_POINTS \ FAUX DEFV(Local,DEFV(Logical,INIT(lister_la_liste_des_points,LISTER_LA_LISTE_DES_POINTS))); /* Cet indicateur permet d'editer la liste des points. Ceci a ete ajoute le 19970617172613 */ /* apres l'introduction des programmes du type '$xrv/map_ND_2D.11$K'. */ /* */ /* ATTENTION, etant donnee la definition des fonctions 'X_PHYSIQUE_DANS_01(...)', */ /* 'Y_PHYSIQUE_DANS_01(...)' et 'Z_PHYSIQUE_DANS_01(...)', ainsi que celles des variables */ /* 'TRANSLATION_DE_X_PHYSIQUE', 'TRANSLATION_DE_Y_PHYSIQUE' et 'TRANSLATION_DE_Z_PHYSIQUE' */ /* qu'elles utilisent, les valeurs obtenues sont a priori et par defaut dans : */ /* */ /* x E [0,1] */ /* y E [0,1] */ /* z E [-1/2,+1/2] */ /* */ /* ce qui peut demander une translation a l'edition en particulier pour le 'z' par : */ /* */ /* TZliste=0.5 */ /* */ /* afin de le ramener dans : */ /* */ /* z E [0,1] */ /* */ /* ce qui est essentiel si l'on veut ensuite utiliser '$xrv/particule.10$K' en particulier */ /* avec des transformations de type rotation... */ #define LISTER_LA_LISTE_DES_POINTS_APRES_TOUTES_LES_TRANSFORMATIONS \ VRAI DEFV(Local,DEFV(Logical,INIT(lister_la_liste_des_points_apres_toutes_les_transformations ,LISTER_LA_LISTE_DES_POINTS_APRES_TOUTES_LES_TRANSFORMATIONS ) ) ); /* Cet indicateur indique, a condition que 'IL_FAUT(lister_la_liste_des_points)', si cette */ /* edition a lieu apres toutes les transformations ('TRANSFORMATION_GEOMETRIQUE_3D_Fx?(...)' */ /* et la mise dans [0,1] en particulier) ou alors avant toute autre chose. Ceci a ete ajoute */ /* le 19980416122932 a cause de difficultes pour faire des rotations sur des objets generes */ /* comme 'v $xiirv/REGL.14'. */ #define LISTER_LE_TEMPS_LORS_DE_LISTER_LA_LISTE_DES_POINTS \ FAUX DEFV(Local,DEFV(Logical,INIT(lister_le_temps_lors_de_lister_la_liste_des_points ,LISTER_LE_TEMPS_LORS_DE_LISTER_LA_LISTE_DES_POINTS ) ) ); /* Cet indicateur indique, a condition que 'IL_FAUT(lister_la_liste_des_points)', si il */ /* faut editer le temps courant en plus de la periode courante. */ #define QUANTIFIER_LE_TEMPS_LORS_DE_LISTER_LA_LISTE_DES_POINTS \ VRAI DEFV(Local,DEFV(Logical,INIT(quantifier_le_temps_lors_de_lister_la_liste_des_points ,QUANTIFIER_LE_TEMPS_LORS_DE_LISTER_LA_LISTE_DES_POINTS ) ) ); #define FACTEUR_DE_QUANTIFICATION_DU_TEMPS \ FU DEFV(Local,DEFV(Float,INIT(facteur_de_quantification_du_temps ,FACTEUR_DE_QUANTIFICATION_DU_TEMPS ) ) ); /* A condition que 'IL_FAUT(lister_le_temps_lors_de_lister_la_liste_des_points)', cet */ /* indicateur s'il faut quantifier ou pas le temps, et le facteur a utiliser. */ DEFV(pointF_3D,INIS(position_du_touriste_observateur_relativiste ,IstructL03(Xcentre_ESPACE,Ycentre_ESPACE,Zcentre_ESPACE) ) ); #define X_de_l_observateur_relativiste \ ASD1(position_du_touriste_observateur_relativiste,x) #define Y_de_l_observateur_relativiste \ ASD1(position_du_touriste_observateur_relativiste,y) #define Z_de_l_observateur_relativiste \ ASD1(position_du_touriste_observateur_relativiste,z) /* Position de l'observateur relativiste. Il pourra etre utile de donner a ce point la meme */ /* position que le point 'v $xiii/vecteurs$FON position_de_l_observateur', mais cela n'est */ /* pas obligatoire... */ /* */ /* Le 20061113122045, 'position_de_l_observateur_relativiste' fut remplace par */ /* 'position_du_touriste_observateur_relativiste' pour prepaper l'execution de */ /* 'v $xau/LACT16.61.modifier$sed position_de_l_observateur' via 'v $xau/LACT16.82$Z' */ /* et eviter ainsi une grosse ambiguite... */ /* ambiguite... */ #define PROPAGATION_INSTANTANEE_DES_INFORMATIONS \ FZERO DEFV(Local,DEFV(Float,INIT(vitesse_de_propagation_des_informations,PROPAGATION_INSTANTANEE_DES_INFORMATIONS))); /* Vitesse de propagation des informations ; la valeur implicite implique une propagation */ /* instanee, mais on pourra utiliser, par exemple, 'VITESSE_DE_LA_LUMIERE'. On notera que */ /* la valeur de 'PROPAGATION_INSTANTANEE_DES_INFORMATIONS' est egale a 'FZERO' alors qu'il */ /* aurait ete plus logique de lui donner la valeur 'F_INFINI'. Ceci est en destine a */ /* simplifier l'utilisation de l'option "celerite=" (c'est plus facile d'entrer '0'...). */ #define ECHELLE_OX_POUR_LISTER_LA_LISTE_DES_POINTS \ FU #define ECHELLE_OY_POUR_LISTER_LA_LISTE_DES_POINTS \ FU #define ECHELLE_OZ_POUR_LISTER_LA_LISTE_DES_POINTS \ FU DEFV(Local,DEFV(Float,INIT(echelle_OX_pour_lister_la_liste_des_points,ECHELLE_OX_POUR_LISTER_LA_LISTE_DES_POINTS))); DEFV(Local,DEFV(Float,INIT(echelle_OY_pour_lister_la_liste_des_points,ECHELLE_OY_POUR_LISTER_LA_LISTE_DES_POINTS))); DEFV(Local,DEFV(Float,INIT(echelle_OZ_pour_lister_la_liste_des_points,ECHELLE_OZ_POUR_LISTER_LA_LISTE_DES_POINTS))); /* Lorsque la liste des points est editee, on peut translater les coordonnees. */ #define TRANSLATION_OX_POUR_LISTER_LA_LISTE_DES_POINTS \ FZERO #define TRANSLATION_OY_POUR_LISTER_LA_LISTE_DES_POINTS \ FZERO #define TRANSLATION_OZ_POUR_LISTER_LA_LISTE_DES_POINTS \ FZERO DEFV(Local,DEFV(Float,INIT(translation_OX_pour_lister_la_liste_des_points,TRANSLATION_OX_POUR_LISTER_LA_LISTE_DES_POINTS))); DEFV(Local,DEFV(Float,INIT(translation_OY_pour_lister_la_liste_des_points,TRANSLATION_OY_POUR_LISTER_LA_LISTE_DES_POINTS))); DEFV(Local,DEFV(Float,INIT(translation_OZ_pour_lister_la_liste_des_points,TRANSLATION_OZ_POUR_LISTER_LA_LISTE_DES_POINTS))); /* Lorsque la liste des points est editee, on peut translater les coordonnees. */ #define X_COORDONNEE_DU_POINT_COURANT(x,y,z) \ AXPB(echelle_OX_pour_lister_la_liste_des_points \ ,x \ ,translation_OX_pour_lister_la_liste_des_points \ ) #define Y_COORDONNEE_DU_POINT_COURANT(x,y,z) \ AXPB(echelle_OY_pour_lister_la_liste_des_points \ ,y \ ,translation_OY_pour_lister_la_liste_des_points \ ) #define Z_COORDONNEE_DU_POINT_COURANT(x,y,z) \ AXPB(echelle_OZ_pour_lister_la_liste_des_points \ ,z \ ,translation_OZ_pour_lister_la_liste_des_points \ ) /* Acces aux coordonnees {x,y,z} du point courant. */ #ifndef DCT_EFFECTIF # define DCT_EFFECTIF \ dct \ /* Pour des raisons de compatibilite avec 'v $xrk/rdn_walk.52$K DCT_EFFECTIF'. */ #Aifndef DCT_EFFECTIF #Eifndef DCT_EFFECTIF #define LISTER_LA_PERIODE_DE_LA_LISTE_DES_POINTS(x,y,z) \ Bblock \ CAL2(Prin1("periode=%d" \ ,numero_de_la_periode_courante \ ) \ ); \ \ Test(IL_FAUT(lister_le_temps_lors_de_lister_la_liste_des_points)) \ Bblock \ DEFV(Float,INIT(retard_relativiste \ ,COND(IFEQ(vitesse_de_propagation_des_informations,PROPAGATION_INSTANTANEE_DES_INFORMATIONS) \ ,FZERO \ ,fDIVZ(RdisF3D(COND(IL_FAUT(lister_la_liste_des_points_apres_toutes_les_transformations) \ ,X_PHYSIQUE_DANS_01(X_de_l_observateur_relativiste) \ ,X_de_l_observateur_relativiste \ ) \ ,COND(IL_FAUT(lister_la_liste_des_points_apres_toutes_les_transformations) \ ,Y_PHYSIQUE_DANS_01(Y_de_l_observateur_relativiste) \ ,Y_de_l_observateur_relativiste \ ) \ ,COND(IL_FAUT(lister_la_liste_des_points_apres_toutes_les_transformations) \ ,Z_PHYSIQUE_DANS_01(Z_de_l_observateur_relativiste) \ ,Z_de_l_observateur_relativiste \ ) \ ,X_COORDONNEE_DU_POINT_COURANT(x,y,z) \ ,Y_COORDONNEE_DU_POINT_COURANT(x,y,z) \ ,Z_COORDONNEE_DU_POINT_COURANT(x,y,z) \ ) \ ,vitesse_de_propagation_des_informations \ ) \ ) \ ) \ ); \ /* Calcul d'un eventuel retard "relativiste". L'utilisation de '?_PHYSIQUE_DANS_01(...)' */ \ /* a ete introduit le 19990527091055, c'est-a-dire apres la generation des sequences : */ \ /* */ \ /* xivPdf 6 1 / 003937_004064 */ \ /* xivPdf 6 1 / 004065_004192 */ \ /* */ \ \ Test(IL_FAUT(quantifier_le_temps_lors_de_lister_la_liste_des_points)) \ Bblock \ EGAL(retard_relativiste \ ,fARRI(retard_relativiste \ ,MUL2(facteur_de_quantification_du_temps,DCT_EFFECTIF) \ ) \ ); \ /* Quantification eventuelle du temps... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CAL2(Prin1(" t=%+.^^^",ADD2(temps_courant,retard_relativiste))); \ /* Le 20060105160451, le format "16g" est passe a "^^g" pour plus de souplesse... */ \ /* */ \ /* Le 20091123123512, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Edition de la periode courante et eventuellement du temps (ajoute le 19990510135228) */ \ /* en prevision d'une visualisation de type "relativite restreinte", ou les points ne */ \ /* seraient plus visualises a l'instant 't', mais a l'intant 't+Dt', le retard 'Dt' etant */ \ /* egal au quotient de la distance de ce point a un certain observateur par une certaine */ \ /* celerite... */ #define LISTER_LA_LISTE_DES_COORDONNEES_DES_POINTS(x,y,z) \ Bblock \ CAL2(Prin3(" X=%+.^^^ Y=%+.^^^ Z=%+.^^^" \ ,X_COORDONNEE_DU_POINT_COURANT(x,y,z) \ ,Y_COORDONNEE_DU_POINT_COURANT(x,y,z) \ ,Z_COORDONNEE_DU_POINT_COURANT(x,y,z) \ ) \ ); \ /* ATTENTION, les coordonnees {X,Y,Z} sont dans l'espace tridimensionnel, c'est-a-dire */ \ /* qu'elles ne sont pas projetees dans le plan de l'image... */ \ /* */ \ /* Suite au probleme 'v $xiirs/$Fnota 20040330115702', le 20040410152458, le format "%+.16g" */ \ /* a ete remplace par "%+.18g" afin de montrer d'infimes differences... */ \ /* */ \ /* Le 20060105160451, le format "18g" est conserve a cause de la modification decrite */ \ /* ci-dessus. Finalement, le 20060109092901 le format "18g" est devenu "^^g" suite a la */ \ /* modification 'v $xig/fonct$vv$FON 20060105164504' qui demande par defaut 18 chiffres... */ \ /* */ \ /* Le 20091123123512, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ Eblock \ /* Edition des coordonnees {x,y,z} du point courant. */ DEFV(Local,DEFV(Logical,INIT(la_vitesse_de_la_sphere_courante_a_ete_utilisee_au_moins_une_fois,FAUX))); /* Afin de savoir si l'edition dans 'LISTER_LA_LISTE_DES_VITESSES_DES_POINTS(...)' est */ /* utile... */ #define VITESSE_PAR_DEFAUT_D_UNE_SPHERE \ FZERO DEFV(deltaF_3D,INIS(vitesse_de_la_sphere_courante ,IstructL03(VITESSE_PAR_DEFAUT_D_UNE_SPHERE,VITESSE_PAR_DEFAUT_D_UNE_SPHERE,VITESSE_PAR_DEFAUT_D_UNE_SPHERE) ) ); #define VX_de_la_sphere_courante \ ASD1(vitesse_de_la_sphere_courante,dx) #define VY_de_la_sphere_courante \ ASD1(vitesse_de_la_sphere_courante,dy) #define VZ_de_la_sphere_courante \ ASD1(vitesse_de_la_sphere_courante,dz) /* Vitesse de la sphere courante de visualisation. On voit ainsi que pour les programmes */ /* n'utilisant pas 'DEFINITION_DE_LA_VITESSE_DE_LA_SPHERE_COURANTE(...)' chaque sphere a */ /* meme vitesse {VITESSE_PAR_DEFAUT_D_UNE_SPHERE,VITESSE_PAR_DEFAUT_D_UNE_SPHERE,...}'. */ #define DEFINITION_DE_LA_VITESSE_DE_LA_SPHERE_COURANTE(vx,vy,vz) \ Bblock \ INITIALISATION_ACCROISSEMENT_3D(vitesse_de_la_sphere_courante,vx,vy,vz); \ \ EGAL(la_vitesse_de_la_sphere_courante_a_ete_utilisee_au_moins_une_fois,VRAI); \ Eblock #define LISTER_LA_LISTE_DES_VITESSES_DES_POINTS \ Bblock \ Test(EST_VRAI(la_vitesse_de_la_sphere_courante_a_ete_utilisee_au_moins_une_fois)) \ Bblock \ CAL2(Prin3(" VX=%+.^^^ VY=%+.^^^ VZ=%+.^^^" \ ,VX_de_la_sphere_courante,VY_de_la_sphere_courante,VZ_de_la_sphere_courante \ ) \ ); \ /* Le 20060105160451, le format "16g" est passe a "^^g" pour plus de souplesse... */ \ /* */ \ /* Le 20091123123512, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ CAL2(Prin1(" VITESSE=%+.^^^" \ ,longF3D(vitesse_de_la_sphere_courante) \ ) \ ); \ /* Le 20060105160451, le format "16g" est passe a "^^g" pour plus de souplesse... */ \ /* */ \ /* Le 20091123123512, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Edition des vitesses {vx,vy,vz} du point courant. Cela a ete ajoute le 19980630135924 */ \ /* afin de permettre a des programmes tels 'v $xrk/rdn_walk.41$K' de pouvoir editer l'etat */ \ /* final d'une simulation afin que celui-ci puisse servir de conditions initiales a une */ \ /* autre simulation, par exemple, en ayant modifie la geometrie du milieu. ATTENTION, lors */ \ /* d'une telle utilisation l'etat final d'une simulation 'N' est alors strictement identique */ \ /* a l'etat initial de la suivante 'N+1' (heureusement...) ce qui signifie que la derniere */ \ /* image de la simulation 'N' et la premiere image de la simulation 'N+1' sont identiques et */ \ /* donc, cette premiere image doit etre ignoree ('v _____xivPdf_11_2/$Fnota 017921_018432'). */ #define LISTER_LA_LISTE_DES_ENERGIES_CINETIQUES_DES_POINTS \ Bblock \ Test(EST_VRAI(la_vitesse_de_la_sphere_courante_a_ete_utilisee_au_moins_une_fois)) \ Bblock \ CAL2(Prin1(" ENERGIE_CINETIQUE=%+.^^^" \ ,MOIT(MUL2(masse_de_la_sphere_courante \ ,pytF3D(vitesse_de_la_sphere_courante) \ ) \ ) \ ) \ ); \ /* Le 20060105160451, le format "16g" est passe a "^^g" pour plus de souplesse... */ \ /* */ \ /* Le 20091123123512, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Edition de l'energie cinetique du point courant. Cela a ete ajoute le 19980708175109 */ \ /* car cela peut etre utile dans des simulations de type thermodynamique puisque la */ \ /* temperature est proportionnelle a l'energie cinetique moyenne des particules a un */ \ /* instant donne. */ #define LISTER_LA_LISTE_DES_RAYONS_DES_POINTS(rayon) \ Bblock \ CAL2(Prin1(" RAYON=%.^^^" \ ,rayon \ ) \ ); \ /* Le 20060105160451, le format "16g" est passe a "^^g" pour plus de souplesse... */ \ /* */ \ /* Le 20091123123512, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ Eblock \ /* Edition du rayon du point courant. */ \ /* */ \ /* On notera le 20110712103021 que le resultat de cette edition depend fortement du fait */ \ /* qu'elle a lieu AVANT les transformation (auquel cas on trouve bien 'champ_RAYON', */ \ /* c'est-a-dire les rayons tels qu'ils ont ete specifies en tant qu'arguments des '$X'), */ \ /* alors qu'APRES ils subissent une transformation (c'est 'rayon_reel_absolu')... */ #define LISTER_LA_LISTE_DES_COULEURS_DES_POINTS(rouge,verte,bleue) \ Bblock \ CAL2(Prin3(" ROUGE=%+.^^^ VERTE=%+.^^^ BLEUE=%+.^^^" \ ,F___DENORMALISE_NIVEAU(rouge),F___DENORMALISE_NIVEAU(verte),F___DENORMALISE_NIVEAU(bleue) \ ) \ ); \ /* On notera le '__DENORMALISE_NIVEAU(...)' destine a la compatibilite avec les arguments */ \ /* de '$xrv/particule.10$K' (voir '"LISTE_ROUGE="' par exemple...). On notera de plus que */ \ /* le 19990526102122 a ete ajoute un espace derriere la valeur de "BLEUE=" afin de */ \ /* symetriser la recuperation des composantes chromatiques {ROUGE,VERTE,BLEUE}... */ \ /* */ \ /* Le 20060105160451, le format "16g" est passe a "^^g" pour plus de souplesse... */ \ /* */ \ /* Le 20091123123512, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ Eblock \ /* Edition des couleurs {rouge,verte,bleue} du point courant. */ #define OUVRIR_L_ENTREE_COURANTE_DE_LA_LISTE \ Bblock \ BLOC(VIDE;); \ Eblock #define FERMER_L_ENTREE_COURANTE_DE_LA_LISTE \ Bblock \ CAL2(Prin0(" \n")); \ Eblock /* Introduits le 20210104115459... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A L A L I S T E D E S P O I N T S E T E D I T I O N E V E N T U E L L E */ /* D A N S L ' E S P A C E T R I D I M E N S I O N E L ( N O N P R O J E T E ) : */ /* */ /*************************************************************************************************************************************/ #TestADef GENERATION_DE__liste_des_Z_____COMPATIBILITE_2008030913 \ FAUX DEFV(Local,DEFV(Logical,INIT(generation_de__liste_des_Z_____compatibilite_2008030913 ,GENERATION_DE__liste_des_Z_____COMPATIBILITE_2008030913 ) ) ); /* Afin d'assurer la compatibilite avec les resultats obtenus anterieurement a la date */ /* du 20080309112355... */ #TestADef GENERATION_DE__liste_des_Z_____COMPATIBILITE_20110711 \ FAUX DEFV(Local,DEFV(Logical,INIT(generation_de__liste_des_Z_____compatibilite_20110711 ,GENERATION_DE__liste_des_Z_____COMPATIBILITE_20110711 ) ) ); /* Afin d'assurer la compatibilite avec les resultats obtenus anterieurement a la date */ /* du 20110711174331... */ #define ACCES_LISTE(liste,index) \ gACCES_LISTE(index,liste,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES) \ /* Fonction d'acces a une liste quelconque. */ \ /* */ \ /* ATTENTION a ne pas confondre : */ \ /* */ \ /* 1-'ACCES_LISTE(...)', pour lequel le premier element vaut : */ \ /* */ \ /* PREMIER_POINT_DES_LISTES=PREMIER_POINT=PREMIERE_ITERATION_D_UN_Komp=UN */ \ /* */ \ /* qui est donc adapte a une gestion de type 'Komp(...)' ou le premier element est defini */ \ /* implicitement (et vaut donc 'UN'), et */ \ /* */ \ /* 2-'gELEMENT_DU_FICHIER(...)', pour lequel le premier element vaut : */ \ /* */ \ /* PREMIER_ELEMENT_D_UN_FICHIER=INDEX0=ZERO */ \ /* */ \ /* qui ne peut utiliser 'Komp(...)' et demande donc une gestion de type 'DoIn(...)' en */ \ /* precisant le premier element en tant qu'argument du 'DoIn(...)' (et valant donc 'ZERO'). */ DEFV(Local,DEFV(Float,INIT(minimum_de_la_coordonnee_X,F_INFINI))); DEFV(Local,DEFV(Float,INIT(maximum_de_la_coordonnee_X,F_MOINS_L_INFINI))); DEFV(Local,DEFV(Float,INIT(minimum_de_la_coordonnee_Y,F_INFINI))); DEFV(Local,DEFV(Float,INIT(maximum_de_la_coordonnee_Y,F_MOINS_L_INFINI))); DEFV(Local,DEFV(Float,INIT(minimum_de_la_coordonnee_Z,F_INFINI))); DEFV(Local,DEFV(Float,INIT(maximum_de_la_coordonnee_Z,F_MOINS_L_INFINI))); /* Calcul des extrema de {X,Y,Z} introduit le 20050419141059... */ DEFV(Local,DEFV(Positive,INIT(nombre_de_points_listes_apres_toutes_transformations,ZERO))); /* Compteur introduit le 20131214183150 ('v $xrv/champs_5.26$I 20131214183150') et */ /* deplace ici le 20140823131219 a cause des '$K's de '$xrq'... */ #define MEMORISATION_D_UN_POINT(x,y,z,Arayon,Vrayon,rouge,verte,bleue) \ Bblock \ Test(IFLE(index_de_rangement_dans_la_liste \ ,LSTX(PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES) \ ) \ ) \ /* Le 20070727153348, le 'IFLT(...)' est remplace par un 'IFLE(...)' beaucoup plus */ \ /* logique (meme si l'ecriture anterieure donnait une petite marge de securite -1-)... */ \ Bblock \ Test(IFET(IFET(IZGT(Arayon),IZGT(Vrayon)) \ ,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_les_differentielles) \ ,IFET(IL_FAUT(renormaliser_arbitrairement_les_differentielles) \ ,I3OU(IZNE(rouge),IZNE(verte),IZNE(bleue)) \ ) \ ) \ ) \ ) \ ) \ ) \ /* Le test oublie sur 'renormaliser_arbitrairement_les_differentielles' a ete ajoute */ \ /* le 19980304153153. */ \ /* */ \ /* Le 20030129175316, 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 */ \ /* */ \ /* Le 20030130132442, 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... */ \ 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 : */ \ EGAL(minimum_de_la_coordonnee_X,MIN2(minimum_de_la_coordonnee_X,x)); \ EGAL(maximum_de_la_coordonnee_X,MAX2(maximum_de_la_coordonnee_X,x)); \ EGAL(minimum_de_la_coordonnee_Y,MIN2(minimum_de_la_coordonnee_Y,y)); \ EGAL(maximum_de_la_coordonnee_Y,MAX2(maximum_de_la_coordonnee_Y,y)); \ EGAL(minimum_de_la_coordonnee_Z,MIN2(minimum_de_la_coordonnee_Z,z)); \ EGAL(maximum_de_la_coordonnee_Z,MAX2(maximum_de_la_coordonnee_Z,z)); \ /* Calcul des extrema de {X,Y,Z} introduit le 20050419141059... */ \ \ EGAL(ACCES_LISTE(liste_des_index,index_de_rangement_dans_la_liste) \ ,FLOT(index_de_rangement_dans_la_liste) \ ); \ EGAL(ACCES_LISTE(liste_des_numeros,index_de_rangement_dans_la_liste) \ ,FLOT(numero_de_l_iteration_courante) \ ); \ EGAL(ACCES_LISTE(liste_des_X,index_de_rangement_dans_la_liste),x); \ EGAL(ACCES_LISTE(liste_des_Y,index_de_rangement_dans_la_liste),y); \ EGAL(ACCES_LISTE(liste_des_Z,index_de_rangement_dans_la_liste) \ ,COND(IL_FAUT(generation_de__liste_des_Z_____compatibilite_2008030913) \ ,NEUT(z) \ ,ADD2(z \ ,COND(IL_FAUT(generation_de__liste_des_Z_____compatibilite_20110711) \ ,Arayon \ ,MUL2(mgEPSILON,Arayon) \ ) \ ) \ ) \ ); \ EGAL(ACCES_LISTE(liste_des_GPOND,index_de_rangement_dans_la_liste) \ ,ponderation_du_pseudo_centre_de_gravite_de_la_sphere_courante \ ); \ EGAL(ACCES_LISTE(liste_des_IDENTITE,index_de_rangement_dans_la_liste) \ ,FLOT(identite_de_la_sphere_courante) \ ); \ EGAL(ACCES_LISTE(liste_des_MASSE,index_de_rangement_dans_la_liste),masse_de_la_sphere_courante); \ EGAL(ACCES_LISTE(liste_des_aRAYON,index_de_rangement_dans_la_liste),Arayon); \ EGAL(ACCES_LISTE(liste_des_vRAYON,index_de_rangement_dans_la_liste),Vrayon); \ EGAL(ACCES_LISTE(liste_des_ROUGE,index_de_rangement_dans_la_liste),rouge); \ EGAL(ACCES_LISTE(liste_des_VERTE,index_de_rangement_dans_la_liste),verte); \ EGAL(ACCES_LISTE(liste_des_BLEUE,index_de_rangement_dans_la_liste),bleue); \ /* Rangement du point {x,y,z,Arayon,Vrayon,rouge,verte,bleue) en queue de liste. On notera */ \ /* que l'index de rangement est aussi memorise : cela est destine au tri sur la coordonnee */ \ /* 'Z'. */ \ /* */ \ /* Le 20080309133637, c'est non plus 'z' qui est mis dans le Z-Buffer, mais 'z+Arayon' afin */ \ /* que si deux spheres sont concentriques, la plus grosse est consideree au premier plan... */ \ /* Avant cette date, utiliser donc 'z' introduisait des points aberrants lors du traitement */ \ /* de l'anti-aliasing... */ \ /* */ \ /* Le 20110711172700, je note que la modification du 20080309133637 consistant a memoriser */ \ /* 'z+Arayon' a la place de 'z' ne fonctionne que si les coordonnees {x,y,z} ne sont pas */ \ /* ensuite l'objet d'une rotation. Dans le cas contraire, en supposant, par exemple, une */ \ /* rotation de '$pis4' par rapport a 'OY', la sphere "exterieure" apparaitra decalee vers */ \ /* la droite. Cela s'est vu a cette date avec 'v $xiirs/PROK.41' dans laquelle les barres */ \ /* de jonction materialisant le reseau cubique intersectent de facon incorrecte les grosses */ \ /* boules materialisant les noeuds du reseau... */ \ /* */ \ /* Le 20110711174331, il fut donc decide d'utiliser, par defaut, la coordonnee 'z' */ \ /* translatee d'une petite fraction de 'Arayon' (afin de resoudre les problemes du */ \ /* traitement de l'anti-aliasing evoques le 20080309133637...). */ \ \ Test(IFET(IL_FAUT(lister_la_liste_des_points) \ ,EST_VRAI(lister_la_liste_des_points_apres_toutes_les_transformations) \ ) \ ) \ Bblock \ /* Jusqu'au 20060413125024, il y avait ici : */ \ /* */ \ /* Test(IFEQ(index_de_rangement_dans_la_liste,PREMIER_POINT_DES_LISTES)) */ \ /* Bblock */ \ /* CAL2(Prin0("\n")); */ \ /* Eblock */ \ /* ATes */ \ /* Bblock */ \ /* Eblock */ \ /* ETes */ \ /* */ \ /* mais a caude de 'v $xrs/surfaces.12$I lister_les_coordonnees_u_et_v_des_points', il ne */ \ /* faut plus emettre ce "\n" initial (dont je ne vois d'ailleurs plus l'interet...) car, */ \ /* en effet, il a pour effet de couper la premiere ligne en deux lorsque l'edition des */ \ /* coordonnees {u,v} des surfacest est demande. On notera au passage, que le 'Test(...)' */ \ /* supprime ne pouvait tester 'lister_les_coordonnees_u_et_v_des_points' car cette variable */ \ /* n'existe que pour les '$K' appartenant a '$xrs'... */ \ \ INCR(nombre_de_points_listes_apres_toutes_transformations,I); \ /* Comptage introduit le 20131214183539... */ \ \ OUVRIR_L_ENTREE_COURANTE_DE_LA_LISTE; \ /* Introduit le 20210104115459... */ \ \ LISTER_LA_PERIODE_DE_LA_LISTE_DES_POINTS(x,y,z); \ \ CAL2(Prin1(" point=%d" \ ,index_de_rangement_dans_la_liste \ ) \ ); \ \ LISTER_LA_LISTE_DES_COORDONNEES_DES_POINTS(x,y,z); \ LISTER_LA_LISTE_DES_VITESSES_DES_POINTS; \ \ CAL2(Prin1(" IDENTITE=%d" \ ,identite_de_la_sphere_courante \ ) \ ); \ /* Le 20210104113820, je rapelle qu'ici, on liste les points APRES (voir a ce propos */ \ /* 'v $xrv/champs_5.26$I 20210104114710'). */ \ \ CAL2(Prin1(" MASSE=%.^^^" \ ,masse_de_la_sphere_courante \ ) \ ); \ /* Le 20060105160451, le format "16g" est passe a "^^g" pour plus de souplesse... */ \ /* */ \ /* Le 20091123123512, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ LISTER_LA_LISTE_DES_ENERGIES_CINETIQUES_DES_POINTS; \ \ LISTER_LA_LISTE_DES_RAYONS_DES_POINTS(Arayon); \ /* On notera le 20110712103021 que l'edition des rayons apres toutes les transformations */ \ /* ne donne pas 'champ_RAYON' (c'est-a-dire les rayons tels qu'ils ont ete specifies en */ \ /* tant qu'arguments des '$X') mais 'Arayon' c'est-a-dire 'rayon_reel_absolu' (voir a ce */ \ /* propos 'v $xrv/champs_5.26$I MEMORISATION_D_UN_POINT'). */ \ LISTER_LA_LISTE_DES_COULEURS_DES_POINTS(rouge,verte,bleue); \ \ FERMER_L_ENTREE_COURANTE_DE_LA_LISTE; \ /* Introduit le 20210104115459... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ INCR(index_de_rangement_dans_la_liste,I); \ /* Et preparation du rangement du point suivant... */ \ Eblock \ ATes \ Bblock \ Test(IFET(IZEQ(Arayon),IZEQ(Vrayon))) \ Bblock \ /* A compter du 1995071000, un rayon nul n'est plus une erreur, mais correspond a une */ \ /* demande de non affichage d'un point... */ \ Eblock \ ATes \ Bblock \ /* Un rayon negatif reste, bien entendu, une erreur... */ \ PRINT_ERREUR("la sphere representative du point courant a une composante ou un Rayon negatif"); \ CAL1(Prer3("centre................=(%g,%g,%g)\n",x,y,z)); \ CAL1(Prer1("Rayon Absolu..........=%g\n",Arayon)); \ CAL1(Prer1("Rayon de Visualisation=%g\n",Vrayon)); \ CAL1(Prer3("couleur...............=(%g,%g,%g)\n",rouge,verte,bleue)); \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("trop de points sont a visualiser"); \ CAL1(Prer1("index du point courant=%d\n" \ ,index_de_rangement_dans_la_liste \ ) \ ); \ CAL1(Prer1("index du dernier point autorise=%d\n" \ ,LSTX(PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES) \ ) \ ); \ Eblock \ ETes \ Eblock \ /* Rangement d'un point dans la liste... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R O C E D U R E D E T R I D ' U N E L I S T E D E P O I N T S */ /* F O N C T I O N N A N T E N ' N ' A U C A R R E : */ /* */ /*************************************************************************************************************************************/ #define TRI_D_UNE_LISTE_DE_POINTS_VERSION_N_AU_CARRE(premier_point_de_la_liste,dernier_point_de_la_liste) \ Bblock \ TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE(liste_des_Z \ ,liste_des_index \ ,premier_point_de_la_liste \ ,dernier_point_de_la_liste \ ,ACCES_LISTE \ ); \ Eblock \ /* Tri d'une liste de points avec une methode en 'N' au carre... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R O C E D U R E D E T R I D ' U N E L I S T E D E P O I N T S */ /* F O N C T I O N N A N T E N ' N x L O G ( N ) ' : */ /* */ /*************************************************************************************************************************************/ #define TRI_D_UNE_LISTE_DE_POINTS_VERSION_N_LOG_N(premier_point_de_la_liste,dernier_point_de_la_liste) \ Bblock \ TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_LOG_N(liste_des_Z \ ,liste_des_index \ ,premier_point_de_la_liste \ ,dernier_point_de_la_liste \ ,ACCES_LISTE \ ); \ Eblock \ /* Tri d'une liste de points avec une methode en 'N*log(N)'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R O C E D U R E D E T R I D ' U N E L I S T E D E P O I N T S : */ /* */ /*************************************************************************************************************************************/ #define LISTER_LA_LISTE_DES_POINTS_AVANT_LE_TRI \ FAUX DEFV(Local,DEFV(Logical,INIT(lister_la_liste_des_points_avant_le_tri,LISTER_LA_LISTE_DES_POINTS_AVANT_LE_TRI))); #define LISTER_LA_LISTE_DES_POINTS_APRES_LE_TRI \ FAUX DEFV(Local,DEFV(Logical,INIT(lister_la_liste_des_points_apres_le_tri,LISTER_LA_LISTE_DES_POINTS_APRES_LE_TRI))); /* Ces indicateurs permettent de controler l'edition de la liste avant et/ou apres le tri. */ #define LISTER_LA_LISTE_DES_POINTS_AVANT_ET_OU_APRES_LE_TRI(lister_la_liste,premier_point_de_la_liste,dernier_point_de_la_liste) \ Bblock \ Test(IL_FAUT(lister_la_liste)) \ Bblock \ DEFV(Int,INIT(index_d_edition_de_la_liste,UNDEF)); \ DoIn(index_d_edition_de_la_liste,premier_point_de_la_liste,dernier_point_de_la_liste,I) \ Bblock \ CAL2(Prin5("index=%d point=%g X=%+.^^^ Y=%+.^^^ Z=%+.^^^\n" \ ,index_d_edition_de_la_liste \ ,ACCES_LISTE(liste_des_index,index_d_edition_de_la_liste) \ ,ACCES_LISTE(liste_des_X,ACCES_LISTE(liste_des_index,index_d_edition_de_la_liste)) \ ,ACCES_LISTE(liste_des_Y,ACCES_LISTE(liste_des_index,index_d_edition_de_la_liste)) \ ,ACCES_LISTE(liste_des_Z,ACCES_LISTE(liste_des_index,index_d_edition_de_la_liste)) \ ) \ ); \ /* Suite au probleme 'v $xiirs/$Fnota 20040330115702', le 20040410152458, le format "%+.16g" */ \ /* a ete remplace par "%+.18g" afin de montrer d'infimes differences... */ \ /* */ \ /* Le 20060105160451, le format "18g" est conserve a cause de la modification decrite */ \ /* ci-dessus. Finalement, le 20060109092901 le format "18g" est devenu "^^g" suite a la */ \ /* modification 'v $xig/fonct$vv$FON 20060105164504' qui demande par defaut 18 chiffres... */ \ /* */ \ /* Le 20091123123512, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ Eblock \ EDoI \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Listage des points d'une liste avant et/ou apres le tri (introduit le 20040409155653). */ #define TRI_D_UNE_LISTE_DE_POINTS(premier_point_de_la_liste,dernier_point_de_la_liste) \ Bblock \ LISTER_LA_LISTE_DES_POINTS_AVANT_ET_OU_APRES_LE_TRI(lister_la_liste_des_points_avant_le_tri \ ,premier_point_de_la_liste \ ,dernier_point_de_la_liste \ ); \ \ begin_nouveau_block \ /* Introduit le 20170609083403... */ \ Bblock \ DEFV(Logical,INIT(effectivement__utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE \ ,utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE \ ) \ ); \ /* Introduit le 20170609081838... */ \ \ Test(IL_FAUT(choisir_automatiquement_la_methode_de_tri_d_une_liste_de_points)) \ /* Possibilite introduite le 20170608082613... */ \ Bblock \ Test(IFLE(NBRE(premier_point_de_la_liste,dernier_point_de_la_liste) \ ,NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \ ) \ ) \ Bblock \ EGAL(effectivement__utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE,VRAI); \ /* On peut utiliser le tri suivant la methode 'N*N' */ \ Eblock \ ATes \ Bblock \ EGAL(effectivement__utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE,FAUX); \ /* Il faut utiliser le tri suivant la methode 'N*log(N)' */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(effectivement__utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE)) \ Bblock \ TRI_D_UNE_LISTE_DE_POINTS_VERSION_N_AU_CARRE(premier_point_de_la_liste \ ,dernier_point_de_la_liste \ ); \ /* Tri suivant la methode 'N*N'... */ \ Eblock \ ATes \ Bblock \ TRI_D_UNE_LISTE_DE_POINTS_VERSION_N_LOG_N(premier_point_de_la_liste \ ,dernier_point_de_la_liste \ ); \ /* Tri suivant la methode 'N*log(N)'... */ \ Eblock \ ETes \ Eblock \ end_nouveau_block \ \ LISTER_LA_LISTE_DES_POINTS_AVANT_ET_OU_APRES_LE_TRI(lister_la_liste_des_points_apres_le_tri \ ,premier_point_de_la_liste \ ,dernier_point_de_la_liste \ ); \ Eblock \ /* Tri d'une liste de points. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R O C E D U R E D E C A L C U L D ' U N P S E U D O - C E N T R E D E G R A V I T E */ /* E T D E T R I D ' U N E L I S T E D E P O I N T S */ /* S U R L A C O O R D O N N E E ' Z ' D ' A R R I E R E E N A V A N T */ /* P O U R L U T T E R E F F I C A C E M E N T C O N T R E L ' A L I A S I N G : */ /* */ /*************************************************************************************************************************************/ #define TRIER_LA_LISTE_DES_POINTS \ VRAI DEFV(Local,DEFV(Logical,INIT(trier_la_liste_des_points,TRIER_LA_LISTE_DES_POINTS))); /* Cet indicateur permet de ne pas faire le tri des points par 'Z' croissant, ce qui */ /* permet pour des tests, ou lorsqu'il y a trop de points, de travailler en un temps */ /* raisonnable... */ #define CHOISIR_AUTOMATIQUEMENT_LA_METHODE_DE_TRI_D_UNE_LISTE_DE_POINTS \ FAUX DEFV(Local,DEFV(Logical,INIT(choisir_automatiquement_la_methode_de_tri_d_une_liste_de_points ,CHOISIR_AUTOMATIQUEMENT_LA_METHODE_DE_TRI_D_UNE_LISTE_DE_POINTS ) ) ); /* Cet indicateur introduit le 20170608082613 premet de choisir automatiquement la methode */ /* de tri ('N au carre' ou 'N*log(N)') suivant le nombre d'elements a trier... */ #define UTILISER_LE_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \ VRAI DEFV(Local,DEFV(Logical,INIT(utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE ,UTILISER_LE_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE ) ) ); /* Cet indicateur permet de choisir entre le tri en 'N au carre' (qui conserve l'ordre */ /* des points possedant la meme clef de tri (la coordonnee 'Z')) et le tri en 'N*log(N)' */ /* qui ne conserve pas cet ordre... */ #define CALCUL_DU_PSEUDO_CENTRE_DE_GRAVITE_ET_TRI_D_UNE_LISTE_DE_POINTS \ Bblock \ DECR(index_de_rangement_dans_la_liste,I); \ /* Retour sur le dernier point memorise dans la liste... */ \ \ Test(IL_FAUT(editer_le_pseudo_centre_de_gravite)) \ Bblock \ /* Cas ou il faut editer (et donc calculer) le pseudo-centre de gravite. */ \ DEFV(Int,INIT(index_calcul_du_pseudo_centre_de_gravite,UNDEF)); \ /* Index de calcul du pseudo-centre de gravite. */ \ DEFV(Float,INIT(X_pseudo_centre_de_gravite,FZERO)); \ DEFV(Float,INIT(Y_pseudo_centre_de_gravite,FZERO)); \ DEFV(Float,INIT(Z_pseudo_centre_de_gravite,FZERO)); \ DEFV(Float,INIT(ponderation_pseudo_centre_de_gravite,FZERO)); \ /* Pour calculer les coordonnees {X,Y,Z} du pseudo-centre de gravite. */ \ \ DoIn(index_calcul_du_pseudo_centre_de_gravite,PREMIER_POINT_DES_LISTES,index_de_rangement_dans_la_liste,I) \ Bblock \ DEFV(Float,INIT(ponderation_point_courant \ ,MUL2(ACCES_LISTE(liste_des_GPOND,index_calcul_du_pseudo_centre_de_gravite) \ ,LIZ6(facteur_NEUTRE_du_pseudo_centre_de_gravite \ ,FU \ ,facteur_MASSE_du_pseudo_centre_de_gravite \ ,ACCES_LISTE(liste_des_MASSE,index_calcul_du_pseudo_centre_de_gravite) \ ,facteur_RAYON_du_pseudo_centre_de_gravite \ ,PUI3(ACCES_LISTE(liste_des_aRAYON,index_calcul_du_pseudo_centre_de_gravite)) \ ,facteur_ROUGE_du_pseudo_centre_de_gravite \ ,NEUT(ACCES_LISTE(liste_des_ROUGE,index_calcul_du_pseudo_centre_de_gravite)) \ ,facteur_VERTE_du_pseudo_centre_de_gravite \ ,NEUT(ACCES_LISTE(liste_des_VERTE,index_calcul_du_pseudo_centre_de_gravite)) \ ,facteur_BLEUE_du_pseudo_centre_de_gravite \ ,NEUT(ACCES_LISTE(liste_des_BLEUE,index_calcul_du_pseudo_centre_de_gravite)) \ ) \ ) \ ) \ ); \ /* Ponderation du point courant. */ \ /* */ \ /* Le 20070227143947, 'PUIX(...,TRI_DIMENSIONNEL)' fut remplace par 'PUI3(...)'. */ \ \ INCR(X_pseudo_centre_de_gravite \ ,MUL2(ponderation_point_courant,ACCES_LISTE(liste_des_X,index_calcul_du_pseudo_centre_de_gravite)) \ ); \ INCR(Y_pseudo_centre_de_gravite \ ,MUL2(ponderation_point_courant,ACCES_LISTE(liste_des_Y,index_calcul_du_pseudo_centre_de_gravite)) \ ); \ INCR(Z_pseudo_centre_de_gravite \ ,MUL2(ponderation_point_courant,ACCES_LISTE(liste_des_Z,index_calcul_du_pseudo_centre_de_gravite)) \ ); \ INCR(ponderation_pseudo_centre_de_gravite \ ,NEUT(ponderation_point_courant) \ ); \ /* Calcul "progressif" du pseudo-centre de gravite. */ \ Eblock \ EDoI \ \ EGAL(X_pseudo_centre_de_gravite,DIVZ(X_pseudo_centre_de_gravite,ponderation_pseudo_centre_de_gravite)); \ EGAL(Y_pseudo_centre_de_gravite,DIVZ(Y_pseudo_centre_de_gravite,ponderation_pseudo_centre_de_gravite)); \ EGAL(Z_pseudo_centre_de_gravite,DIVZ(Z_pseudo_centre_de_gravite,ponderation_pseudo_centre_de_gravite)); \ /* Calcul "definitif" du pseudo-centre de gravite. */ \ \ CAL2(Prin1("periode=%d" \ ,numero_de_la_periode_courante \ ) \ ); \ CAL2(Prin3(" CENTRE_DE_GRAVITE=(XG=%+.^^^,YG=%+.^^^,ZG=%+.^^^)" \ ,X_pseudo_centre_de_gravite \ ,Y_pseudo_centre_de_gravite \ ,Z_pseudo_centre_de_gravite \ ) \ ); \ /* Edition du pseudo-centre de gravite, mais ATTENTION, ses coordonnees sont exprimees */ \ /* dans [0,1]x[0,1]x[0,1] et non pas dans l'espace physique qu'on ne connait pratiquement */ \ /* plus ici a cause des transformations diverses et variees. Ensuite, si l'on souhaite */ \ /* visualiser le centre de gravite, on pourra utiliser 'v $xrv/particule.10$K' a condition */ \ /* de choisir judicieusement ses parametres ('v $xrv/particule.10$K coordonnees_dans_0_1'). */ \ /* On notera de plus que grace au programme 'v $xrv/SOUS.11$K', il est possible de placer */ \ /* tout ensemble de particules {X,Y,Z} dans un referentiel lie a leur centre de gravite 'G' */ \ /* {XG,YG,ZG} en visualisant le fichier des {X-XG,Y-YG,Z-ZG}. */ \ /* */ \ /* Le 20060105160451, le format "16g" est passe a "^^g" pour plus de souplesse... */ \ /* */ \ /* Le 20091123123512, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ \ CAL2(Prin0("\n")); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(trier_la_liste_des_points)) \ Bblock \ /* Cas ou il faut trier les points... */ \ Test(IFGT(index_de_rangement_dans_la_liste,PREMIER_POINT_DES_LISTES)) \ Bblock \ /* Cas ou il y a au moins deux points : il faut donc trier... */ \ Test(IL_FAUT(ajuster_automatiquement_profondeur_minimale_et_profondeur_maximale)) \ Bblock \ DEFV(Int,INIT(index_d_ajustement_automatique,UNDEF)); \ /* Index d'ajustement... */ \ EGAL(profondeur_minimale_reelle,F_INFINI); \ EGAL(profondeur_maximale_reelle,F_MOINS_L_INFINI); \ /* Initialisation du processus d'ajustement automatique des extrema de la coordonnee 'Z'. */ \ DoIn(index_d_ajustement_automatique,PREMIER_POINT_DES_LISTES,index_de_rangement_dans_la_liste,I) \ Bblock \ EGAL(profondeur_minimale_reelle \ ,MIN2(profondeur_minimale_reelle \ ,ACCES_LISTE(liste_des_Z,index_d_ajustement_automatique) \ ) \ ); \ EGAL(profondeur_maximale_reelle \ ,MAX2(profondeur_maximale_reelle \ ,ACCES_LISTE(liste_des_Z,index_d_ajustement_automatique) \ ) \ ); \ /* Ajustement automatique des extrema de la coordonnee 'Z'. */ \ /* */ \ /* Je note le 20050419173039 qu'il y a certainement redondance entre ces deux definitions */ \ /* {profondeur_minimale_reelle,profondeur_maximale_reelle} et ce qui fut introduit le */ \ /* 20050419141059 a savoir {minimum_de_la_coordonnee_Z,maximum_de_la_coordonnee_Z}, mais */ \ /* dans le doute, je conserve les deux mecanismes... */ \ Eblock \ EDoI \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ TRI_D_UNE_LISTE_DE_POINTS(PREMIER_POINT_DES_LISTES \ ,index_de_rangement_dans_la_liste \ ); \ /* Tri suivant la methode choisie ('N*N' ou 'N*log(N)'). */ \ Eblock \ ATes \ Bblock \ /* Cas ou il n'y a qu'un point : le tri n'est alors pas vraiment utile... */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ /* Cas ou le tri des points n'est pas demande : gare aux problemes d'aliasing... */ \ Eblock \ ETes \ Eblock \ /* Tri d'une liste de points, pour laquelle on suppose que l'index designant le dernier */ \ /* element (soit 'index_de_rangement_dans_la_liste') pointe sur la premiere entree libre, */ \ /* et non pas sur le dernier element range... */