/*************************************************************************************************************************************/ /* */ /* V I S U A L I S A T I O N D ' U N E N S E M B L E D E P A R T I C U L E S : */ /* */ /* */ /* ATTENTION : */ /* */ /* Apres le 1995051500, les coordonnees et les */ /* couleurs des points a visualiser doivent etre */ /* definies ainsi en coordonnees cartesiennes : */ /* */ /* x E [0,1] */ /* y E [0,1] */ /* z E [0,1] (l'axe 'OZ' etant dirige vers l'observateur) */ /* */ /* alors qu'avant le 1995051500, les definitions */ /* se faisaient dans : */ /* */ /* x E [0,1] */ /* y E [0,1] */ /* z E [-0.5,+0.5] (l'axe 'OZ' etant dirige vers l'observateur) */ /* */ /* */ /* En coordonnees spheriques, il n'y a pas de */ /* changement (il convient malgre tout de forcer */ /* "AXYZ=1" et "BXYZ=0" comme cela est rappele */ /* ci-apres...) : */ /* */ /* rho E [0,1] */ /* phi E [0,2.pi] */ /* theta E [0,pi] */ /* */ /* (les intervalles de 'x' et 'y' etant choisis pour des raisons de compatibilite */ /* avec les versions anterieures ; en effet, a partir du 1995051500, le facteur */ /* d'homothetie et la translation des coordonnees sont passes des valeurs respectives */ /* 1 et 0 aux valeurs 2 et -1 pour permettre une gestion correcte des formats d'images */ /* quelconques, auquel cas, il est suggere d'utiliser "BZ=0.5") */ /* */ /* RAYON E [0,1] */ /* */ /* ROUGE E [NOIR,BLANC] */ /* VERTE E [NOIR,BLANC] */ /* BLEUE E [NOIR,BLANC] */ /* */ /* en vraies couleurs, et : */ /* */ /* NIVEAU E [NOIR,BLANC] */ /* */ /* ou en option (a compter du 20131204095011) : */ /* */ /* NIVEAU E [0,1] */ /* */ /* en fausses couleurs (lorsque une palette est demandee via 'nom_paletteA'). */ /* */ /* Dans le cas de niveaux normalises, ils sont donc a priori dans [0,1], mais */ /* ce n'est pas une obligation : en effet ils sont en fait traites "modulo" */ /* via '$xrv/particule.51$I __DENORMALISE_NIVEAU_AVEC_MODULO____', ce qui */ /* permet de periodiser des palettes qui ne le sont pas a priori (voir a */ /* ce sujet 'v $xiirv/.GOLD.81.1.$U _____NiveauMaximal')... */ /* */ /* Le calcul des parametres de renormalisation des coordonnees {x,y,z} */ /* pourra se faire a l'aide de 'v $xcg/extrema.01$Z', ou encore a l'aide */ /* de 'v $xrv/extrema.01$K' ou enfin ici en local, grace a l'option */ /* 'ajuster_automatiquement_les_coordonnees_cartesiennes'. */ /* */ /* */ /* Pour visualiser des coordonnees dans [-1,+1] (ce qui est le cas si "cartesiennes=FAUX") : */ /* */ /* Theoriquement, il suffit d'utiliser les */ /* parametres : */ /* */ /* AXYZ=1 BXYZ=0 */ /* */ /* en faisant attention au cas ou un facteur */ /* de zoom different de 1 est utilise (voir */ /* a ce propos ce qui est dit plus bas...). */ /* */ /* */ /* Cadrage automatique d'une structure bidimensionnelle : */ /* */ /* Pour cadrer automatiquement une structure */ /* bidimensionnelle, il conviendra de placer tous */ /* les points dans le plan : */ /* */ /* Z=0.5 */ /* */ /* puis d'utiliser l'option : */ /* */ /* zoom_automatique=VRAI */ /* */ /* et le tour sera joue... */ /* */ /* */ /* Note sur le plan image : */ /* */ /* Pour faire correspondre les coordonnees {X,Y} */ /* du plan image avec les coordonnees {X,Y,Z} projetee */ /* de ce programme, il suffit de choisir : */ /* */ /* Z=0.5 */ /* ZOOM=1 */ /* */ /* Un exemple est donne par 'v $xiird/.ACIN.Z1.2.$U G_Zoom' */ /* ou les coordonnees {X,Y} de 'v $xci/mire$K' et les coordonnees */ /* {X,Y,Z} projetees de 'v $xrv/particule.10$K' correspondent a */ /* epsilon pres. Un meilleur exemple est 'v $xiirv/CARE.11' defini */ /* par 'v $xiirv/$Fnota Debut_listG_CARE_11' qui illustre */ /* parfaitement les principes de cela... */ /* */ /* */ /* Utilisation de '$xrv/particule.10$K' en sortie d'un autre programme : */ /* */ /* Un programme tel 'v $xrr/N_corps.11$K' peut */ /* grace aux options : */ /* */ /* lister_les_points=VRAI */ /* lister_les_points_apres=FAUX */ /* */ /* donner la liste des cordonnees {X,Y,Z} des */ /* corps manipules (plus d'autres informations). */ /* Ces coordonnees peuvent etre reprises par ce */ /* programme '$xrv/particule.10$K' a condition */ /* de lui donner les options suivantes : */ /* */ /* zoom_automatique=FAUX ZOOM=1.0 */ /* coordonnees_dans_0_1=FAUX */ /* AXYZ=1 BXYZ=0 */ /* */ /* l'option "coordonnees_dans_0_1=FAUX" garantit que les */ /* proportions sont conservees ; cela signifie, par */ /* exemple, qu'un cercle reste un cercle alors que */ /* dans le cas 'VRAI', il devient une ellipse de grand */ /* axe vertical. On verra a ce propos : */ /* */ /* xivPdf 9 2 / .NCOR.1.22.$U */ /* */ /* ou cela est utilise... */ /* */ /* Les rayons devant etre ajustes en consequences (en */ /* general, leur valeur devra etre divisee par 2). */ /* Ces parametres sont aussi utilisables lorsque les */ /* coordonnees viennent de 'v $xci/valeurs_albu$K'. */ /* Ceci sera par exemple tres utile pour visualiser */ /* le centre de gravite d'un ensemble de points... */ /* 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}... */ /* */ /* Lorsqu'un facteur de zoom different de 1 est */ /* utilise, on aura plus qu'interet a faire : */ /* */ /* zoom_automatique=FAUX ZOOM=... */ /* coordonnees_dans_0_1=FAUX */ /* AXYZ=1 BXYZ=0 */ /* TRANSLATION_OX=0.5 TRANSLATION_OY=0.5 */ /* */ /* puisque le zoom est "centre" par rapport au */ /* centre {0,0,0} de l'univers et qu'avec des */ /* coordonnees deja dans [0,1], le centre {0,0,0} */ /* devient le coin inferieur gauche. On verra a ce propos : */ /* */ /* xivPdf 9 2 / .NCOR.1.22.$U */ /* */ /* ou cela est utilise... */ /* */ /* */ /* Author of '$xrv/particule.10$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1993??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ @define PRAGMA_CL_____MODULE_NON_OPTIMISABLE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE #include image_image_IMAGESF_EXT /* Introduit le 20150604143255... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E B A S E E T U N I V E R S E L L E S : */ /* */ /*************************************************************************************************************************************/ #include xrv/dimensionnement.01.vv.I" /* Introduit le 20111209173529... */ #include xrk/attractor.11.I" #include xrv/particule.41.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 3 */ /* D E F I N I T I O N D E L ' E S P A C E P H Y S I Q U E D A N S R ( D E B U T ) : */ /* */ /* */ /* Nota : */ /* */ /* Les extrema des coordonnees {x,y,z} */ /* ainsi que ceux de leurs differentielles */ /* {dx,dy,dz} sont fixees un peu arbitrairement */ /* et sans etre parametrees. */ /* */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, les coordonnees des points a visualiser doivent etre definies ainsi : */ /* */ /* x E [0,1] */ /* y E [0,1] */ /* z E [0,1] */ /* */ #define hXmin_ESPACE \ PARE(-1.0) #define hYmin_ESPACE \ PARE(-1.0) #define hZmin_ESPACE \ PARE(-1.0) /* Definition du "coin" inferieur-gauche-arriere de l'espace physique. */ #define hXmax_ESPACE \ PARE(1.0) #define hYmax_ESPACE \ PARE(1.0) #define hZmax_ESPACE \ PARE(1.0) /* Definition du "coin" superieur-droite-avant de l'espace physique. */ /* ATTENTION, les coordonnees des points a visualiser doivent etre definies ainsi : */ /* */ /* x E [0,1] */ /* y E [0,1] */ /* z E [0,1] */ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 3 */ /* D E F I N I T I O N D E L ' E S P A C E P H Y S I Q U E D A N S R ( D E B U T ) : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.12.I" #define dXmin_ESPACE \ PARE(0.0) #define dYmin_ESPACE \ PARE(0.0) #define dZmin_ESPACE \ PARE(0.0) /* Definition des minima des differentielles {dx,dy,dz}. */ #define dXmax_ESPACE \ PARE(1.0) #define dYmax_ESPACE \ PARE(1.0) #define dZmax_ESPACE \ PARE(1.0) /* Definition des maxima des differentielles {dx,dy,dz}. */ #include xrk/attractor.1D.I" /* Formules de renormalisation des differentielles dans [0,1] ; elles sont utilisees lorsque */ /* la production d'images en couleurs est demandee (voir 'visualiser_en_RVB'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S D I F F E R E N T S E S P A C E S E T D E L ' E F F E T D E B R U M E : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.13.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A I D E A U C A D R A G E D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.1C.I" DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES /* Definition des extrema des coordonnees et des derivees. On notera bien l'absence de */ /* point-virgule apres 'DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #define GENERER_DES_POINTS_ISOLES \ VRAI DEFV(Local,DEFV(Logical,INIT(generer_des_points_isoles,GENERER_DES_POINTS_ISOLES))); /* Indique si l'on visualise des points isoles ('VRAI') ou des couples de points ('FAUX') */ /* materialises par une chaine de points interpoles sur toutes les caracteristiques. */ #define JOINDRE_A_UN_CORPS_CENTRAL \ FAUX DEFV(Local,DEFV(Logical,INIT(joindre_a_un_corps_central,JOINDRE_A_UN_CORPS_CENTRAL))); /* Indique lorsque 'IL_FAUT(generer_des_points_isoles)' si ces points isoles doivent etre */ /* malgre tout joints avec le corps de reference ('VRAI') ou etre vraiment isoles ('FAUX') */ /* comme c'etait le cas avant le 19991007145622. */ #define FILTRER_LA_LONGUEUR_DES_SEGMENTS \ FAUX DEFV(Local,DEFV(Logical,INIT(filtrer_la_longueur_des_segments,FILTRER_LA_LONGUEUR_DES_SEGMENTS))); #define BORNE_INFERIEURE_DE_LA_LONGUEUR_DES_SEGMENTS \ FZERO #define BORNE_SUPERIEURE_DE_LA_LONGUEUR_DES_SEGMENTS \ FU DEFV(Local,DEFV(Float,INIT(borne_inferieure_de_la_longueur_des_segments,BORNE_INFERIEURE_DE_LA_LONGUEUR_DES_SEGMENTS))); DEFV(Local,DEFV(Float,INIT(borne_superieure_de_la_longueur_des_segments,BORNE_SUPERIEURE_DE_LA_LONGUEUR_DES_SEGMENTS))); /* Introduit le 20120806100234 afin de pouvoir tracer uniquement les segments dont la */ /* longueur est dans un certain intervalle (introduit pour 'v $xiirf/FRB3.D6.2')... */ #define CHAINER_AUTOMATIQUEMENT_LES_POINTS \ FAUX DEFV(Local,DEFV(Logical,INIT(chainer_automatiquement_les_points,CHAINER_AUTOMATIQUEMENT_LES_POINTS))); /* Lorsque 'IL_NE_FAUT_PAS(generer_des_points_isoles)', indique si l'on genere des suites */ /* de segments du type {A,B,B,...B} ('VRAI') ou du type {{A,B},{A,B},...,{A,B}} ('FAUX') */ /* ce qui correspond au comportement anterieur au 19971127142342... */ /* */ /* Pour etre plus clair, ces deux modes peuvent etre aussi definis par ('Pii' designant */ /* le point de numero 'ii') : */ /* */ /* {A,B,B,...B} = {P01-P02-P03-...-Pnn} */ /* */ /* et ; */ /* */ /* {{A,B},{A,B},...,{A,B}} = {{P01-P02},{P03-P04},...} */ /* */ /* le premier mode chainant automatiquement et le second etant plutot du type "pointilles". */ #define LE_DERNIER_POINT_EST_LE_PREMIER_POINT \ FAUX DEFV(Local,DEFV(Logical,INIT(le_dernier_point_est_le_premier_point,LE_DERNIER_POINT_EST_LE_PREMIER_POINT))); /* Lorsque 'IL_FAUT(chainer_automatiquement_les_points)' indique si le dernier point a */ /* utiliser est en fait le premier. Dans ce cas il y a donc au total un point de plus que */ /* demande. Cette possibilite a ete introduite le 20060808110301... */ #define NOMBRE_ABSOLU_DE_POINTS_SUR_UNE_CHAINE_DE_CONNEXION \ SEIZE DEFV(Local,DEFV(Positive,INIT(nombre_absolu_de_points_sur_une_chaine_de_connexion ,NOMBRE_ABSOLU_DE_POINTS_SUR_UNE_CHAINE_DE_CONNEXION ) ) ); /* Nombre de points (non compris les extremites) destines a materialiser les couples */ /* de points. */ #define AJUSTER_AUTOMATIQUEMENT_LE_NOMBRE_DE_POINTS_SUR_UNE_CHAINE_DE_CONNEXION \ FAUX DEFV(Local,DEFV(Logical,INIT(ajuster_automatiquement_le_nombre_de_points_sur_une_chaine_de_connexion ,AJUSTER_AUTOMATIQUEMENT_LE_NOMBRE_DE_POINTS_SUR_UNE_CHAINE_DE_CONNEXION ) ) ); /* Indique si l'on doit ajuster automatiquement le nombre de points sur une chaine de */ /* connexion ('VRAI') ou bien utiliser 'nombre_absolu_de_points_sur_une_chaine_de_connexion' */ /* ('FAUX'). */ #define FACTEUR_DU_NOMBRE_RELATIF_DE_POINTS_SUR_UNE_CHAINE_DE_CONNEXION \ FU DEFV(Local,DEFV(Float,INIT(facteur_du_nombre_relatif_de_points_sur_une_chaine_de_connexion ,FACTEUR_DU_NOMBRE_RELATIF_DE_POINTS_SUR_UNE_CHAINE_DE_CONNEXION ) ) ); /* En fait facteur multiplicatif permettant de passer de la longueur d'une chaine de */ /* connexion au nombre de points a utiliser. ATTENTION, avant le 19971114085357, la */ /* valeur par defaut de ce parametre etait : */ /* */ /* GRO8(FU) */ /* */ /* mais, le 19971113103239, le calcul du rayon projete des particules ayant ete corrige */ /* (de facon correcte), il a fallu donner a ce parametre sa valeur correcte permettant */ /* un chevauchement correct (sur une longueur d'un rayon) des particules d'une chaine de */ /* connexion... */ #include xrv/champs_5.14.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S G E N E R A L E S R E L A T I V E S A L A V I S U A L I S A T I O N : */ /* */ /*************************************************************************************************************************************/ #define nombre_de_corps \ nombre_d_iterations \ /* ATTENTION, a ne pas confondre : */ \ /* */ \ /* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que */ \ /* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par */ \ /* 'fTRANSFORMAT_31(...)', et */ \ /* */ \ /* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque */ \ /* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la */ \ /* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite */ \ /* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'... */ \ /* */ #define EDITER_LES_MESSAGES_DE_MAUVAIS_ENCADREMENT_DES_NIVEAUX_INTERPOLES \ FAUX \ /* Introduit le 20181227110833 lors de la mise au point de 'v $xrrv/CARR.35' avec */ \ /* "_____DistanceMini=0.050"... */ #include xrk/attractor.14.I" #define NOMBRE_MAXIMAL_DE_POINTS_GERABLES \ MIN2(NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES,NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION) \ /* Cette constante permet de gerer d'une facon homogene les listes de dimension */ \ /* 'nombre_de_periodes_de_la_simulation' comme celles de dimension 'nombre_d_iterations'. */ /* ATTENTION, a ne pas confondre : */ /* */ /* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que */ /* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par */ /* 'fTRANSFORMAT_31(...)', et */ /* */ /* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque */ /* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la */ /* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite */ /* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'... */ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P O S S I B I L I T E D E " C R O S S - S E C T I O N " : */ /* */ /*************************************************************************************************************************************/ #define FAIRE_UNE_CROSS_SECTION \ FAUX DEFV(Local,DEFV(Logical,INIT(faire_une_cross_section,FAIRE_UNE_CROSS_SECTION))); /* Faut-il ou pas faire une "cross-section" (introduit le 20031217151137) ? */ /* */ /* On notera que le centre et les trois demi-axes de l'ellipsoide de "cross-section" sont */ /* choisis de facon a ce que le "trou" creuse par cet ellipsoide ressemble a un diedre */ /* dont l'axe est 'OY' et dont l'angle d'ouverture ('theta') est petit et symetrique par */ /* rapport a l'axe 'OZ', soit : */ /* */ /* */ /* ' */ /* Y /|\ */ /* | */ /* . | */ /* . | */ /* . |. */ /* . | */ /* . | . */ /* . | */ /* . | . */ /* | | */ /* | | . */ /* | | */ /* | | . */ /* | | */ /* | DIE DRE . */ /* | | | */ /* | | | */ /* | | | */ /* | . O-----|------------------------------> */ /* | . / | */ /* | . / . | X */ /* | . / | */ /* | . / . | */ /* | . theta/2 / | */ /* . / . | */ /* / theta/2 | */ /* / . | */ /* / | */ /* / .| */ /* / | */ /* / . */ /* Z / */ /* */ /* */ #define X_CENTRE_ELLIPSOIDE_DE_CROSS_SECTION \ FZERO #define Y_CENTRE_ELLIPSOIDE_DE_CROSS_SECTION \ FZERO #define Z_CENTRE_ELLIPSOIDE_DE_CROSS_SECTION \ FLOT(CENT) DEFV(Local,DEFV(Float,INIT(X_centre_ellipsoide_de_cross_section,X_CENTRE_ELLIPSOIDE_DE_CROSS_SECTION))); DEFV(Local,DEFV(Float,INIT(Y_centre_ellipsoide_de_cross_section,Y_CENTRE_ELLIPSOIDE_DE_CROSS_SECTION))); DEFV(Local,DEFV(Float,INIT(Z_centre_ellipsoide_de_cross_section,Z_CENTRE_ELLIPSOIDE_DE_CROSS_SECTION))); /* Centre de l'ellipsoide de "cross-section". */ #define X_DEMI_AXE_ELLIPSOIDE_DE_CROSS_SECTION \ FDEUX #define Y_DEMI_AXE_ELLIPSOIDE_DE_CROSS_SECTION \ Z_CENTRE_ELLIPSOIDE_DE_CROSS_SECTION #define Z_DEMI_AXE_ELLIPSOIDE_DE_CROSS_SECTION \ Z_CENTRE_ELLIPSOIDE_DE_CROSS_SECTION DEFV(Local,DEFV(Float,INIT(X_demi_axe_ellipsoide_de_cross_section,X_DEMI_AXE_ELLIPSOIDE_DE_CROSS_SECTION))); DEFV(Local,DEFV(Float,INIT(Y_demi_axe_ellipsoide_de_cross_section,Y_DEMI_AXE_ELLIPSOIDE_DE_CROSS_SECTION))); DEFV(Local,DEFV(Float,INIT(Z_demi_axe_ellipsoide_de_cross_section,Z_DEMI_AXE_ELLIPSOIDE_DE_CROSS_SECTION))); /* Demi-axe de l'ellipsoide de "cross-section". */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.16.I" #define RAYON_DE_VISUALISATION \ FRA5(FRA10(FU)) DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation,RAYON_DE_VISUALISATION))); /* Rayon du disque materialisant une iteration. */ #define PUISSANCE_DU_RAYON_DE_VISUALISATION \ UN #include xrv/champs_5.1B.I" /* Afin de generer des spheres dont on maitrise soit le rayon (=1), soit la surface (=2), */ /* soit enfin le volume (=3). */ BFonctionI DEFV(Local,DEFV(FonctionI,memorisation_1_point_07(AXf,AYf,AZf,AdXf,AdYf,AdZf,numero_de_l_iteration_courante))) DEFV(Argument,DEFV(Float,AXf)); DEFV(Argument,DEFV(Float,AYf)); DEFV(Argument,DEFV(Float,AZf)); /* Definition de la position {x,y,z} de l'iteration courante. */ DEFV(Argument,DEFV(Float,AdXf)); DEFV(Argument,DEFV(Float,AdYf)); DEFV(Argument,DEFV(Float,AdZf)); /* Definition des differentielles {dx,dy,dz} de la position de l'iteration courante. */ DEFV(Argument,DEFV(Int,numero_de_l_iteration_courante)); /* Numero de l'iteration courante afin d'attenuer eventuellement la luminance des points */ /* materialisant chaque iteration en fonction de leur numero (les premieres iterations etant */ /* plus sombres, et les dernieres etant plus lumineuses). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xrk/attractor.15.I" DEFV(Logical,INIT(memoriser_le_point_courant,VRAI)); /* A priori, le point courant sera memorise... */ INIT_ERROR; /*..............................................................................................................................*/ Test(IL_FAUT(faire_une_cross_section)) Bblock Test(IFLE(ADD3(EXP2(DIVZ(SOUS(AXf,X_centre_ellipsoide_de_cross_section),X_demi_axe_ellipsoide_de_cross_section)) ,EXP2(DIVZ(SOUS(AYf,Y_centre_ellipsoide_de_cross_section),Y_demi_axe_ellipsoide_de_cross_section)) ,EXP2(DIVZ(SOUS(AZf,Z_centre_ellipsoide_de_cross_section),Z_demi_axe_ellipsoide_de_cross_section)) ) ,FU ) ) Bblock EGAL(memoriser_le_point_courant,FAUX); /* Les points interieurs a l'ellipsoide de "cross-section" ne sont pas visualises... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_FAUT(memoriser_le_point_courant)) /* Ceci a donc ete introduit le 20031217151137... */ Bblock MEMORISATION_DU_POINT_COURANT(X_DERIVEE_DANS_01(AdXf) ,Y_DERIVEE_DANS_01(AdYf) ,Z_DERIVEE_DANS_01(AdZf) ); /* Memorisation du point courant en Noir et Blanc ou en Couleurs, mais uniquement s'il est */ /* visible en fonction des conditions de visualisation... */ Eblock ATes Bblock Eblock ETes RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E V I S U A L I S A T I O N E T D ' I N T E R P O L A T I O N : */ /* */ /*************************************************************************************************************************************/ #define __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND \ /* Afin de permettre la mise en place d'un fond pour chaque image generee (definition */ \ /* deplacee ici le 20030311095504). D'autre part 'PERMETTRE_L_UTILISATION_D_UN_FOND' */ \ /* a ete change en '__VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' le 20030313145928 */ \ /* afin de permettre sa recuperation dans 'v $xcc/cpp$Z _VERSION_'. */ #include xrk/attractor.17.I" #include xrv/particule.31.I" #define LAMBDA_EXTRAPOLATION_A \ FU #define LAMBDA_EXTRAPOLATION_B \ FU DEFV(Local,DEFV(Float,INIT(lambda_extrapolation_A,LAMBDA_EXTRAPOLATION_A))); DEFV(Local,DEFV(Float,INIT(lambda_extrapolation_B,LAMBDA_EXTRAPOLATION_B))); /* Introduit le 20171121134718 afin de permettre l'extrapolation des segments [A,B]... */ /* Les valeurs par defaut devrait garantir la neutralite : */ /* */ /* BARY(B,A,1) = A */ /* BARY(A,B,1) = B */ /* */ /* mais ce n'est malheureusement pas tout a fait vrai a cause des erreurs d'arrondi... */ #define VISUALISATION_D_UN_SEGMENT_VARIABLE(Acx,Acy,Acz,Adcx,Adcy,Adcz,Ar,Bcx,Bcy,Bcz,Bdcx,Bdcy,Bdcz,Br,Adx,Ady,Adz,Bdx,Bdy,Bdz) \ Bblock \ DEFV(Float,INIT(EAcx,Acx)); \ DEFV(Float,INIT(EAcy,Acy)); \ DEFV(Float,INIT(EAcz,Acz)); \ /* Extrapolation du point 'A' neutre par defaut (introduite le 20171121134718)..... */ \ /* */ \ /* On notera que le 'BARY(...)' neutre n'est pas fait ici, apparemment pour des raisons */ \ /* liees a des problemes d'arrondi. Des experiences faites a cette date ont montre que */ \ /* malheureusement : */ \ /* */ \ /* BARY(B,A,1) # A (mais tres legerement...) */ \ /* */ \ DEFV(Float,INIT(EBcx,Bcx)); \ DEFV(Float,INIT(EBcy,Bcy)); \ DEFV(Float,INIT(EBcz,Bcz)); \ /* Extrapolation du point 'B' neutre par defaut (introduite le 20171121134718)... */ \ /* */ \ /* On notera que le 'BARY(...)' neutre n'est pas fait ici, apparemment pour des raisons */ \ /* liees a des problemes d'arrondi. Des experiences faites a cette date ont montre que */ \ /* malheureusement : */ \ /* */ \ /* BARY(A,B,1) # B (mais tres legerement...) */ \ /* */ \ \ DEFV(Int,INIT(nombre_effectif_de_points_sur_une_chaine_de_connexion,UNDEF)); \ /* Nombre de points effectif sur une chaine de connexion. */ \ DEFV(Float,INIT(rayon_de_visualisation_moyen,MOYE(Ar,Br))); \ /* Introduit le 20031220091528 pour le test suivant... */ \ \ Test(IFNE(lambda_extrapolation_A,LAMBDA_EXTRAPOLATION_A)) \ Bblock \ EGAL(EAcx,BARY(Bcx,Acx,lambda_extrapolation_A)); \ EGAL(EAcy,BARY(Bcy,Acy,lambda_extrapolation_A)); \ EGAL(EAcz,BARY(Bcz,Acz,lambda_extrapolation_A)); \ /* Extrapolation du point 'A' (introduite le 20171121134718) : */ \ /* */ \ /* BARY(B,A,lambda) = [(1-lambda).B] + [(lambda-0).A] */ \ /* */ \ /* et pour lambda=1 : */ \ /* */ \ /* BARY(B,A,1) = A (extrapolation par defaut) */ \ /* */ \ /* L'extrapolation a lieu pour lambda>1... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFNE(lambda_extrapolation_B,LAMBDA_EXTRAPOLATION_B)) \ Bblock \ EGAL(EBcx,BARY(Acx,Bcx,lambda_extrapolation_B)); \ EGAL(EBcy,BARY(Acy,Bcy,lambda_extrapolation_B)); \ EGAL(EBcz,BARY(Acz,Bcz,lambda_extrapolation_B)); \ /* Extrapolation du point 'B' (introduite le 20171121134718) : */ \ /* */ \ /* BARY(A,B,lambda) = [(1-lambda).A] + [(lambda-0).B] */ \ /* */ \ /* et pour lambda=1 : */ \ /* */ \ /* BARY(A,B,1) = B (extrapolation par defaut) */ \ /* */ \ /* L'extrapolation a lieu pour lambda>1... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ AIDE_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION \ ( \ Bblock \ CAL2(Prin1(" NombreAbsoluDePoints('points=')=%d\n",nombre_absolu_de_points_sur_une_chaine_de_connexion)); \ Eblock \ ); \ \ Test(IFET(IL_FAUT(ajuster_automatiquement_le_nombre_de_points_sur_une_chaine_de_connexion) \ ,IZNE(rayon_de_visualisation_moyen) \ ) \ ) \ /* Le test de non nullite du rayon moyen a ete introduit le 20031220091528 pour eviter */ \ /* une eventuelle division par 0 ci-apres. On notera au passage que la nullite simultanee */ \ /* de 'Ar' et de 'Br' est une anomalie qui ne peut se produire que si les parametres */ \ /* d'appel de ce programme sont incorrets et/ou incoherents... */ \ Bblock \ AIDE_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION \ ( \ Bblock \ CAL2(Prin1(" Ajustement automatique (facteur('nombreR=')=%f) " \ ,facteur_du_nombre_relatif_de_points_sur_une_chaine_de_connexion \ ) \ ); \ Eblock \ ); \ \ EGAL(nombre_effectif_de_points_sur_une_chaine_de_connexion \ ,TRPU(ARRI(MUL2(facteur_du_nombre_relatif_de_points_sur_une_chaine_de_connexion \ ,DIVI(RdisF3D(EAcx,EAcy,EAcz \ ,EBcx,EBcy,EBcz \ ) \ ,rayon_de_visualisation_moyen \ ) \ ) \ ) \ ) \ ); \ /* Cas ou il y a ajustement automatique du nombre de points : celui-ci est alors fonction */ \ /* de la distance d(A,B) et des rayons de visualisation (sans oublier que ceux-ci sont */ \ /* definis dans [0,1] et non pas dans l'espace physique ; de plus 'lY_PHYSIQUE_DANS_01(...)' */ \ /* est justifie par 'v $xrv/champs_5.26$I rayon_reel_de_visualisation' ou l'on calcule le */ \ /* 'rayon_reel_de_visualisation' a partir de 'Yf_au_pole_nord_de_la_sphere' qui lui-meme */ \ /* procede a un 'Y_PHYSIQUE_DANS_01(ADD2(Yf,RAYON_DU_POINT_COURANT(champ_RAYON)))'). */ \ /* */ \ /* Mais ATTENTION, avant le 19971114085357, la formule utilisee etait : */ \ /* */ \ /* DIVI(DIVI(RdisF3D(Acx,Acy,Acz */ \ /* ,Bcx,Bcy,Bcz */ \ /* ) */ \ /* ,diagonale_ESPACE */ \ /* ) */ \ /* ,lY_PHYSIQUE_DANS_01(MOYE(Ar,Br)) */ \ /* ) */ \ /* */ \ /* mais, le 19971113103239, le calcul du rayon projete des particules ayant ete corrige */ \ /* (de facon correcte), il a fallu donner a cette formule son expression correcte permettant */ \ /* un chevauchement correct (sur une longueur d'un rayon) des particules d'une chaine de */ \ /* connexion... */ \ Eblock \ ATes \ Bblock \ EGAL(nombre_effectif_de_points_sur_une_chaine_de_connexion \ ,nombre_absolu_de_points_sur_une_chaine_de_connexion \ ); \ /* Cas ou il n'y a pas d'ajustement automatique du nombre de points... */ \ Eblock \ ETes \ \ AIDE_A_LA_MISE_AU_POINT_DE__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION \ ( \ Bblock \ CAL2(Prin1(" NombreEffectifDePoints=%d\n",nombre_effectif_de_points_sur_une_chaine_de_connexion)); \ Eblock \ ); \ \ EGAL(nombre_effectif_de_points_sur_une_chaine_de_connexion \ ,MAX2(nombre_effectif_de_points_sur_une_chaine_de_connexion,DEUX) \ ); \ /* Il faut malgre tout visualiser au moins 2 points (les 2 extremites 'A' et 'B'). */ \ \ VISUALISATION_D_UNE_CHAINE_DE_CONNEXION(EAcx,EAcy,EAcz \ ,Adcx,Adcy,Adcz \ ,Ar \ ,EBcx,EBcy,EBcz \ ,Bdcx,Bdcy,Bdcz \ ,Br \ ,nombre_effectif_de_points_sur_une_chaine_de_connexion \ ,numero_des_points \ ,interpoler_les_chaines_de_connexion_par_des_splines_cubiques \ ,Adx,Ady,Adz \ ,Bdx,Bdy,Bdz \ ); \ Eblock \ /* Visualisation d'une chaine de connexion avec ajustement eventuel des parametres... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S D I F F E R E N T E S T R A N S F O R M A T I O N S L I N E A I R E S : */ /* */ /*************************************************************************************************************************************/ #define DONNEES_gFACTEUR_D_HOMOTHETIE_gCONSTANTE_DE_TRANSLATION(ajuster,minimum_3,maximum_3,minimum_1,maximum_1) \ /* Les extrema de type '_1' portent sur une seule des trois composantes (de 'XYZ' ou de */ \ /* 'RVB'), alors que les extrema de type '_3' portent sur les trois composantes (de 'XYZ' */ \ /* ou de 'RVB'). */ \ DEFV(Float,INIT(minimum_effectif \ ,COND(IL_FAUT(ajuster) \ ,minimum_1 \ ,minimum_3 \ ) \ ) \ ); \ DEFV(Float,INIT(maximum_effectif \ ,COND(IL_FAUT(ajuster) \ ,maximum_1 \ ,maximum_3 \ ) \ ) \ ); \ /* Donnees utiles (procedure introduite le 20091027091754). */ #define gFACTEUR_D_HOMOTHETIE(ajuster,facteur_d_homothetie,minimum_3,maximum_3,minimum_1,maximum_1,MINIMUM_1,MAXIMUM_1) \ /* Les extrema de type '_1' portent sur une seule des trois composantes (de 'XYZ' ou de */ \ /* 'RVB'), alors que les extrema de type '_3' portent sur les trois composantes (de 'XYZ' */ \ /* ou de 'RVB'). */ \ Bblock \ DONNEES_gFACTEUR_D_HOMOTHETIE_gCONSTANTE_DE_TRANSLATION(ajuster,minimum_3,maximum_3,minimum_1,maximum_1); \ \ Test(IFNE(minimum_effectif,maximum_effectif)) \ Bblock \ EGAL(facteur_d_homothetie \ ,DIVI(SOUS(MAXIMUM_1,MINIMUM_1) \ ,SOUS(maximum_effectif,minimum_effectif) \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Procedure de calcul d'un facteur d'homothetie (introduite le 20091026182237). */ #define gCONSTANTE_DE_TRANSLATION(ajuster,constante_de_translation,minimum_3,maximum_3,minimum_1,maximum_1,MINIMUM_1,MAXIMUM_1) \ /* Les extrema de type '_1' portent sur une seule des trois composantes (de 'XYZ' ou de */ \ /* 'RVB'), alors que les extrema de type '_3' portent sur les trois composantes (de 'XYZ' */ \ /* ou de 'RVB'). */ \ Bblock \ DONNEES_gFACTEUR_D_HOMOTHETIE_gCONSTANTE_DE_TRANSLATION(ajuster,minimum_3,maximum_3,minimum_1,maximum_1); \ \ Test(IFNE(minimum_effectif,maximum_effectif)) \ Bblock \ EGAL(constante_de_translation \ ,DIVI(DET2(MINIMUM_1,MAXIMUM_1 \ ,minimum_effectif,maximum_effectif \ ) \ ,SOUS(maximum_effectif,minimum_effectif) \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Procedure de calcul d'une constante de translation (introduite le 20091026182237). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M A T I O N S L I N E A I R E S D E S C O O R D O N N E E S : */ /* */ /*************************************************************************************************************************************/ #define UTILISER_LES_COORDONNEES_CARTESIENNES \ VRAI DEFV(Local,DEFV(Logical,INIT(utiliser_les_coordonnees_cartesiennes,UTILISER_LES_COORDONNEES_CARTESIENNES))); /* Indique si l'on doit introduire des coordonnees cartesiennes {X,Y,Z} ('VRAI') ou bien */ /* des coordonnees spheriques {rho,theta,phi} ('FAUX'). On notera que pour faire une */ /* representation bidimensionnelle en coordonnees polaires, il convient de ne pas oublier */ /* que c'est alors 'phi' qui joue le role de 'theta' des veritables coordonnees polaires */ /* ('v $ximD/definit.1$DEF cartesienne_3D') ; de plus, il faudra alors prendre : */ /* */ /* theta=$pis2 */ /* */ /* et donc utiliser : */ /* */ /* {rho,phi} */ /* */ /* ATTENTION, si 'IL_NE_FAUT_PAS(utiliser_les_coordonnees_cartesiennes)', on se retrouve */ /* avec des coordonnees dans [-1,+1], auquel cas, il faut utiliser : */ /* */ /* AXYZ=1 BXYZ=0 */ /* */ #define FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_RHO \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_RHO \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_coordonnee_RHO,FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_RHO))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_coordonnee_RHO,CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_RHO))); #define FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_THETA \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_THETA \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_coordonnee_THETA,FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_THETA))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_coordonnee_THETA,CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_THETA))); #define FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_PHI \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_PHI \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_coordonnee_PHI,FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_PHI))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_coordonnee_PHI,CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_PHI))); /* Une transformation du type 'A.c+B' sera appliquee individuellement a chaque coordonnee */ /* spherique avant toute chose... */ #define FACTEUR_D_HOMOTHETIE_XYZ(facteur_d_homothetie,minimum_3,maximum_3,minimum_1,maximum_1,MINIMUM_1,MAXIMUM_1) \ Bblock \ gFACTEUR_D_HOMOTHETIE(ajuster_automatiquement_les_coordonnees_cartesiennes_independamment_homothetie \ ,facteur_d_homothetie \ ,minimum_3,maximum_3 \ ,minimum_1,maximum_1 \ ,MINIMUM_1,MAXIMUM_1 \ ) \ Eblock \ /* Procedure de calcul d'un facteur d'homothetie. */ #define CONSTANTE_DE_TRANSLATION_XYZ(constante_de_translation,minimum_3,maximum_3,minimum_1,maximum_1,MINIMUM_1,MAXIMUM_1) \ Bblock \ gCONSTANTE_DE_TRANSLATION(ajuster_automatiquement_les_coordonnees_cartesiennes_independamment_translation \ ,constante_de_translation \ ,minimum_3,maximum_3 \ ,minimum_1,maximum_1 \ ,MINIMUM_1,MAXIMUM_1 \ ) \ Eblock \ /* Procedure de calcul d'une constante de translation. */ #define AJUSTER_AUTOMATIQUEMENT_LES_COORDONNEES_CARTESIENNES \ FAUX DEFV(Local,DEFV(Logical,INIT(ajuster_automatiquement_les_coordonnees_cartesiennes ,AJUSTER_AUTOMATIQUEMENT_LES_COORDONNEES_CARTESIENNES ) ) ); /* Indique si les facteurs d'homothetie et de translation specifiques a 'X', 'Y' et 'Z' */ /* doivent etre evalues automatiquement ('VRAI') ou forces ('FAUX'). */ #define AJUSTER_AUTOMATIQUEMENT_LES_COORDONNEES_CARTESIENNES_INDEPENDAMMENT_HOMOTHETIE \ FAUX DEFV(Local,DEFV(Logical,INIT(ajuster_automatiquement_les_coordonnees_cartesiennes_independamment_homothetie ,AJUSTER_AUTOMATIQUEMENT_LES_COORDONNEES_CARTESIENNES_INDEPENDAMMENT_HOMOTHETIE ) ) ); /* Indique si les facteurs d'homothetie specifiques a 'X', 'Y' et 'Z' */ /* doivent etre evalues automatiquement, mais independamment les unes des autres ('VRAI') */ /* ou pas ('FAUX') lorsque 'IL_FAUT(ajuster_automatiquement_les_coordonnees_cartesiennes)' */ /* (introduit le 20020329160656 pour 'v $xu/Felici.M/GenImages.01$Z Acinus_AjusterInd'). */ #define AJUSTER_AUTOMATIQUEMENT_LES_COORDONNEES_CARTESIENNES_INDEPENDAMMENT_TRANSLATION \ FAUX DEFV(Local,DEFV(Logical,INIT(ajuster_automatiquement_les_coordonnees_cartesiennes_independamment_translation ,AJUSTER_AUTOMATIQUEMENT_LES_COORDONNEES_CARTESIENNES_INDEPENDAMMENT_TRANSLATION ) ) ); /* Indique si les facteurs de translation specifiques a 'X', 'Y' et 'Z' */ /* doivent etre evalues automatiquement, mais independamment les unes des autres ('VRAI') */ /* ou pas ('FAUX') lorsque 'IL_FAUT(ajuster_automatiquement_les_coordonnees_cartesiennes)' */ /* (introduit le 20020329160656 pour 'v $xu/Felici.M/GenImages.01$Z Acinus_AjusterInd'). */ #define LISTER_L_AJUSTEMENT_DES_COORDONNEES_CARTESIENNES \ FAUX DEFV(Local,DEFV(Logical,INIT(lister_l_ajustement_des_coordonnees_cartesiennes ,LISTER_L_AJUSTEMENT_DES_COORDONNEES_CARTESIENNES ) ) ); /* Indique si les facteurs d'homothetie apres ajustement automatique doivent etre listes. */ #define SUPER_FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_X \ FU #define FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_X \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_X \ FZERO DEFV(Local,DEFV(Float,INIT(super_facteur_d_homothetie_de_la_coordonnee_X,SUPER_FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_X))); DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_coordonnee_X,FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_X))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_coordonnee_X,CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_X))); #define SUPER_FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_Y \ FU #define FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_Y \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_Y \ FZERO DEFV(Local,DEFV(Float,INIT(super_facteur_d_homothetie_de_la_coordonnee_Y,SUPER_FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_Y))); DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_coordonnee_Y,FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_Y))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_coordonnee_Y,CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_Y))); #define SUPER_FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_Z \ FU #define FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_Z \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_Z \ FZERO DEFV(Local,DEFV(Float,INIT(super_facteur_d_homothetie_de_la_coordonnee_Z,SUPER_FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_Z))); DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_coordonnee_Z,FACTEUR_D_HOMOTHETIE_DE_LA_COORDONNEE_Z))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_coordonnee_Z,CONSTANTE_DE_TRANSLATION_DE_LA_COORDONNEE_Z))); /* Une transformation du type 'A.c+B' sera appliquee individuellement a chaque coordonnee */ /* cartesienne (ou spherique apres conversion en cartesienne) avant toute chose... */ /* */ /* Les 'super_facteur_d_homothetie_de_la_coordonnee_?' ont ete introduits le 20051220213442 */ /* pour 'v $xiirv/.ENTR.61.1.$U sAX='... */ #define FACTEUR_D_HOMOTHETIE_DES_COORDONNEES \ FDEUX #define CONSTANTE_DE_TRANSLATION_DES_COORDONNEES \ NEGA(FU) DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_des_coordonnees,FACTEUR_D_HOMOTHETIE_DES_COORDONNEES))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_des_coordonnees,CONSTANTE_DE_TRANSLATION_DES_COORDONNEES))); /* Une transformation du type 'A.c+B' sera ensuite appliquee globalement aux coordonnees. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E X T E N S I O N D E S C O O R D O N N E E S S P H E R I Q U E S : */ /* */ /*************************************************************************************************************************************/ #define COMPATIBILITE_20211211 \ FAUX DEFV(Logical,INIT(compatibilite_20211211,COMPATIBILITE_20211211)); /* Permet de faire des calculs compatibles a ceux faits anterieurement au 20211211115613... */ #define UTILISER_LES_COORDONNEES_SPHERIQUES_ETENDUES \ FAUX DEFV(Local,DEFV(Logical,INIT(utiliser_les_coordonnees_spheriques_etendues,UTILISER_LES_COORDONNEES_SPHERIQUES_ETENDUES))); /* Indique si l'on doit utiliser les coordonnees spheriques "standard" ('FAUX') ou bien */ /* les etendre ('VRAI'). Ce dispositif a ete introduit le 20150602113353... */ Denumer07(INIS(_EXTENSION_ellipsoid,UN) /* Extension 'v $xrs/ellipsoid.11$I'. */ ,_EXTENSION_hyperboloid /* Extension 'v $xrs/hyperboloid.11$I'. */ ,_EXTENSION_cylindre /* Extension 'v $xrs/cylindre.11$I'. */ ,_EXTENSION_tore /* Extension 'v $xrs/tore.11$I'. */ ,_EXTENSION_Mobius2D /* Extension 'v $xrs/Mobius2D.11$I'. */ ,_EXTENSION_project2D /* Extension 'v $xrs/project2D.11$I'. */ ,DERNIERE_EXTENSION ,nom_des_EXTENSIONS_DES_COORDONNEES_SPHERIQUES ); #define EXTENSION_ellipsoid \ ENUM(_EXTENSION_ellipsoid) #define EXTENSION_hyperboloid \ ENUM(_EXTENSION_hyperboloid) #define EXTENSION_cylindre \ ENUM(_EXTENSION_cylindre) #define EXTENSION_tore \ ENUM(_EXTENSION_tore) #define EXTENSION_Mobius2D \ ENUM(_EXTENSION_Mobius2D) #define EXTENSION_project2D \ ENUM(_EXTENSION_project2D) #define NUMERO_DE_L_EXTENSION_DES_COORDONNEES_SPHERIQUES \ EXTENSION_ellipsoid DEFV(Local,DEFV(Logical,INIT(numero_de_l_extension_des_coordonnees_spheriques,NUMERO_DE_L_EXTENSION_DES_COORDONNEES_SPHERIQUES))); /* Extension par defaut des coordonnees spheriques... */ #define PARAMETRES_DES_EXTENSIONS_DES_COORDONNEES_SPHERIQUES \ FU DEFV(Local,DEFV(Float,INIT(extension_des_coordonnees_spheriques_parametre_01,PARAMETRES_DES_EXTENSIONS_DES_COORDONNEES_SPHERIQUES))); DEFV(Local,DEFV(Float,INIT(extension_des_coordonnees_spheriques_parametre_02,PARAMETRES_DES_EXTENSIONS_DES_COORDONNEES_SPHERIQUES))); DEFV(Local,DEFV(Float,INIT(extension_des_coordonnees_spheriques_parametre_03,PARAMETRES_DES_EXTENSIONS_DES_COORDONNEES_SPHERIQUES))); DEFV(Local,DEFV(Float,INIT(extension_des_coordonnees_spheriques_parametre_04,PARAMETRES_DES_EXTENSIONS_DES_COORDONNEES_SPHERIQUES))); DEFV(Local,DEFV(Float,INIT(extension_des_coordonnees_spheriques_parametre_05,PARAMETRES_DES_EXTENSIONS_DES_COORDONNEES_SPHERIQUES))); DEFV(Local,DEFV(Float,INIT(extension_des_coordonnees_spheriques_parametre_06,PARAMETRES_DES_EXTENSIONS_DES_COORDONNEES_SPHERIQUES))); DEFV(Local,DEFV(Float,INIT(extension_des_coordonnees_spheriques_parametre_07,PARAMETRES_DES_EXTENSIONS_DES_COORDONNEES_SPHERIQUES))); DEFV(Local,DEFV(Float,INIT(extension_des_coordonnees_spheriques_parametre_08,PARAMETRES_DES_EXTENSIONS_DES_COORDONNEES_SPHERIQUES))); DEFV(Local,DEFV(Float,INIT(extension_des_coordonnees_spheriques_parametre_09,PARAMETRES_DES_EXTENSIONS_DES_COORDONNEES_SPHERIQUES))); /* Parametres des differentes fonctions {Fx,Fy,Fz}... */ #include xrs/ellipsoid.11.I" #include xrs/hyperboloid.11.I" #include xrs/cylindre.11.I" #include xrs/tore.11.I" #include xrs/Mobius2D.11.I" #include xrs/project2D.11.I" /* Liste des extensions disponibles a la date du 20150602113353... */ #define MINIMUM_DE_U_THETA \ FZERO #define MAXIMUM_DE_U_THETA \ FU #define MINIMUM_DE_V_PHI \ FZERO #define MAXIMUM_DE_V_PHI \ FU DEFV(Local,DEFV(Float,INIT(minimum_de_u_theta,MINIMUM_DE_U_THETA))); DEFV(Local,DEFV(Float,INIT(maximum_de_u_theta,MAXIMUM_DE_U_THETA))); DEFV(Local,DEFV(Float,INIT(minimum_de_v_phi,MINIMUM_DE_V_PHI))); DEFV(Local,DEFV(Float,INIT(maximum_de_v_phi,MAXIMUM_DE_V_PHI))); /* Donnees specifiques a 'EXTENSION_project2D' (introduites le 20150604211734)... */ /* */ /* A titre d'exemple, pour les projections {Fx,Fy,Fz} definissant une sphere, on utilisera : */ /* */ /* minimum_de_u_theta = 0 */ /* maximum_de_u_theta = $dpi */ /* */ /* minimum_de_v_phi = 0 */ /* maximum_de_v_phi = $dpi */ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M A T I O N S L I N E A I R E S D E S D E R I V E E S : */ /* */ /*************************************************************************************************************************************/ #define FACTEUR_D_HOMOTHETIE_DE_LA_DERIVEE_X \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_DERIVEE_X \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_derivee_X,FACTEUR_D_HOMOTHETIE_DE_LA_DERIVEE_X))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_derivee_X,CONSTANTE_DE_TRANSLATION_DE_LA_DERIVEE_X))); #define FACTEUR_D_HOMOTHETIE_DE_LA_DERIVEE_Y \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_DERIVEE_Y \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_derivee_Y,FACTEUR_D_HOMOTHETIE_DE_LA_DERIVEE_Y))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_derivee_Y,CONSTANTE_DE_TRANSLATION_DE_LA_DERIVEE_Y))); #define FACTEUR_D_HOMOTHETIE_DE_LA_DERIVEE_Z \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_DERIVEE_Z \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_derivee_Z,FACTEUR_D_HOMOTHETIE_DE_LA_DERIVEE_Z))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_derivee_Z,CONSTANTE_DE_TRANSLATION_DE_LA_DERIVEE_Z))); /* Une transformation du type 'A.d+B' sera appliquee individuellement a chaque derivee */ /* avant toute chose... */ #define FACTEUR_D_HOMOTHETIE_DES_DERIVEES \ FU #define CONSTANTE_DE_TRANSLATION_DES_DERIVEES \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_des_derivees,FACTEUR_D_HOMOTHETIE_DES_DERIVEES))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_des_derivees,CONSTANTE_DE_TRANSLATION_DES_DERIVEES))); /* Une transformation du type 'A.c+B' sera ensuite appliquee globalement aux derivees. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M A T I O N S L I N E A I R E S D E S R A Y O N S : */ /* */ /*************************************************************************************************************************************/ #define FACTEUR_D_HOMOTHETIE_DU_RAYON \ FACTEUR_D_HOMOTHETIE_DES_COORDONNEES #define CONSTANTE_DE_TRANSLATION_DU_RAYON \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_du_rayon,FACTEUR_D_HOMOTHETIE_DU_RAYON))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_du_rayon,CONSTANTE_DE_TRANSLATION_DU_RAYON))); /* Une transformation du type 'A.r+B' sera appliquee au rayon... */ /* */ /* ATTENTION, le 19971113103239, la valeur par defaut 'FACTEUR_D_HOMOTHETIE_DU_RAYON' est */ /* passee de 'FU' a 'FACTEUR_D_HOMOTHETIE_DES_COORDONNEES' afin qu'implicitement les */ /* coordonnees et le rayon subissent le meme traitement... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M A T I O N S L I N E A I R E S D E S C O U L E U R S : */ /* */ /*************************************************************************************************************************************/ #define FACTEUR_D_HOMOTHETIE_RVB(facteur_d_homothetie,minimum_3,maximum_3,minimum_1,maximum_1,MINIMUM_1,MAXIMUM_1) \ Bblock \ gFACTEUR_D_HOMOTHETIE(ajuster_automatiquement_les_couleurs_independamment_homothetie \ ,facteur_d_homothetie \ ,minimum_3,maximum_3 \ ,minimum_1,maximum_1 \ ,MINIMUM_1,MAXIMUM_1 \ ) \ Eblock \ /* Procedure de calcul d'un facteur d'homothetie (introduite le 20091024085314). */ #define CONSTANTE_DE_TRANSLATION_RVB(constante_de_translation,minimum_3,maximum_3,minimum_1,maximum_1,MINIMUM_1,MAXIMUM_1) \ Bblock \ gCONSTANTE_DE_TRANSLATION(ajuster_automatiquement_les_couleurs_independamment_translation \ ,constante_de_translation \ ,minimum_3,maximum_3 \ ,minimum_1,maximum_1 \ ,MINIMUM_1,MAXIMUM_1 \ ) \ Eblock \ /* Procedure de calcul d'une constante de translation (introduite le 20091024085314). */ #define AJUSTER_AUTOMATIQUEMENT_LES_COULEURS \ FAUX DEFV(Local,DEFV(Logical,INIT(ajuster_automatiquement_les_couleurs ,AJUSTER_AUTOMATIQUEMENT_LES_COULEURS ) ) ); /* Indique si les facteurs d'homothetie et de translation specifiques a 'X', 'Y' et 'Z' */ /* doivent etre evalues automatiquement ('VRAI') ou forces ('FAUX'). */ #define AJUSTER_AUTOMATIQUEMENT_LES_COULEURS_INDEPENDAMMENT_HOMOTHETIE \ VRAI DEFV(Local,DEFV(Logical,INIT(ajuster_automatiquement_les_couleurs_independamment_homothetie ,AJUSTER_AUTOMATIQUEMENT_LES_COULEURS_INDEPENDAMMENT_HOMOTHETIE ) ) ); /* Indique si les facteurs d'homothetie specifiques a 'X', 'Y' et 'Z' */ /* doivent etre evalues automatiquement, mais independamment les unes des autres ('VRAI') */ /* ou pas ('FAUX') lorsque 'IL_FAUT(ajuster_automatiquement_les_couleurs)'. */ #define AJUSTER_AUTOMATIQUEMENT_LES_COULEURS_INDEPENDAMMENT_TRANSLATION \ VRAI DEFV(Local,DEFV(Logical,INIT(ajuster_automatiquement_les_couleurs_independamment_translation ,AJUSTER_AUTOMATIQUEMENT_LES_COULEURS_INDEPENDAMMENT_TRANSLATION ) ) ); /* Indique si les facteurs de translation specifiques a 'X', 'Y' et 'Z' */ /* doivent etre evalues automatiquement, mais independamment les unes des autres ('VRAI') */ /* ou pas ('FAUX') lorsque 'IL_FAUT(ajuster_automatiquement_les_couleurs)'. */ #define LISTER_L_AJUSTEMENT_DES_COULEURS \ FAUX DEFV(Local,DEFV(Logical,INIT(lister_l_ajustement_des_couleurs ,LISTER_L_AJUSTEMENT_DES_COULEURS ) ) ); /* Indique si les facteurs d'homothetie apres ajustement automatique doivent etre listes. */ #define FACTEUR_D_HOMOTHETIE_DES_COULEURS \ FU #define CONSTANTE_DE_TRANSLATION_DES_COULEURS \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_des_couleurs,FACTEUR_D_HOMOTHETIE_DES_COULEURS))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_des_couleurs,CONSTANTE_DE_TRANSLATION_DES_COULEURS))); /* Une transformation du type 'A.c+B' sera appliquee aux couleurs... */ /* Indique si les facteurs d'homothetie apres ajustement automatique doivent etre listes. */ #define FACTEUR_D_HOMOTHETIE_DE_LA_COULEUR_ROUGE \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_COULEUR_ROUGE \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_couleur_ROUGE,FACTEUR_D_HOMOTHETIE_DE_LA_COULEUR_ROUGE))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_couleur_ROUGE,CONSTANTE_DE_TRANSLATION_DE_LA_COULEUR_ROUGE))); #define FACTEUR_D_HOMOTHETIE_DE_LA_COULEUR_VERTE \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_COULEUR_VERTE \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_couleur_VERTE,FACTEUR_D_HOMOTHETIE_DE_LA_COULEUR_VERTE))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_couleur_VERTE,CONSTANTE_DE_TRANSLATION_DE_LA_COULEUR_VERTE))); #define FACTEUR_D_HOMOTHETIE_DE_LA_COULEUR_BLEUE \ FU #define CONSTANTE_DE_TRANSLATION_DE_LA_COULEUR_BLEUE \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_de_la_couleur_BLEUE,FACTEUR_D_HOMOTHETIE_DE_LA_COULEUR_BLEUE))); DEFV(Local,DEFV(Float,INIT(constante_de_translation_de_la_couleur_BLEUE,CONSTANTE_DE_TRANSLATION_DE_LA_COULEUR_BLEUE))); /* Une transformation du type 'A.c+B' sera appliquee individuellement a chaque couleur */ /* avant toute chose (introduite le 20091024085314)... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S L I S T E S D E S C R I P T I V E S D E S P A R T I C U L E S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, a ne pas confondre : */ /* */ /* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que */ /* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par */ /* 'fTRANSFORMAT_31(...)', et */ /* */ /* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque */ /* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la */ /* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite */ /* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'... */ /* */ #define MINIMUM_DES___X \ COORDONNEE_BARYCENTRIQUE_MINIMALE #define MAXIMUM_DES___X \ COORDONNEE_BARYCENTRIQUE_MAXIMALE #define MINIMUM_DES___Y \ COORDONNEE_BARYCENTRIQUE_MINIMALE #define MAXIMUM_DES___Y \ COORDONNEE_BARYCENTRIQUE_MAXIMALE #define MINIMUM_DES___Z \ NEGA(COORDONNEE_BARYCENTRIQUE_CENTRALE) #define MAXIMUM_DES___Z \ NEUT(COORDONNEE_BARYCENTRIQUE_CENTRALE) #define X_IMPLICITE \ Xcentre_ESPACE #define Y_IMPLICITE \ Ycentre_ESPACE #define Z_IMPLICITE \ hZmin_ESPACE /* Definition des coordonnees cartesiennes implicites. On notera l'utilisation de */ /* 'hZmin_ESPACE' et non pas de 'Zcentre_ESPACE' comme le voudrait la logique ; ceci est */ /* du au fait que cette derniere valeur interferait malheureusement avec la position de */ /* l'observateur dans le cube de visualisation, et rendrait invisible les particules... */ /* */ /* Malgre tout, je note que dans les cas bidimensionnels {OX,OY}, on aura en general */ /* interet a faire : */ /* */ /* LISTE_Z=0.5 (c'est-a-dire 'Zcentre_ESPACE') */ /* */ /* comme c'est le cas, par exemple, de 'v $xiirv/GOLD.21'... */ fTRANSFORMAT_31(fichier_LISTE_X); fTRANSFORMAT_31(fichier_LISTE_Y); fTRANSFORMAT_31(fichier_LISTE_Z); /* Definition des fichiers de listes de coordonnees cartesiennes. */ /* */ /* ATTENTION, les coordonnees cartesiennes des points a visualiser doivent etre definies */ /* ainsi : */ /* */ /* x E [0,1] */ /* y E [0,1] */ /* z E [0,1] */ /* */ #define dX_IMPLICITE \ FZERO #define dY_IMPLICITE \ FZERO #define dZ_IMPLICITE \ FZERO /* Definition des derivees des coordonnees cartesiennes. */ fTRANSFORMAT_31(fichier_LISTE_dX); fTRANSFORMAT_31(fichier_LISTE_dY); fTRANSFORMAT_31(fichier_LISTE_dZ); /* Definition des fichiers de listes des derivees des coordonnees cartesiennes. */ #define RHO_IMPLICITE \ FZERO #define THETA_IMPLICITE \ FZERO #define PHI_IMPLICITE \ FZERO /* Definition des coordonnees spheriques implicites. */ fTRANSFORMAT_31(fichier_LISTE_RHO); fTRANSFORMAT_31(fichier_LISTE_THETA); fTRANSFORMAT_31(fichier_LISTE_PHI); /* Definition des fichiers de listes de coordonnees spheriques. */ /* */ /* ATTENTION, les coordonnees spheriques des points a visualiser doivent etre definies */ /* ainsi : */ /* */ /* rho E [0,1] */ /* phi E [0,2.pi] */ /* theta E [0,pi] */ /* */ #define tX_IMPLICITE \ FZERO #define tY_IMPLICITE \ FZERO #define tZ_IMPLICITE \ FZERO /* Definition des translations implicites des coordonnees. */ fTRANSFORMAT_31(fichier_LISTE_tX); fTRANSFORMAT_31(fichier_LISTE_tY); fTRANSFORMAT_31(fichier_LISTE_tZ); /* Definition des fichiers de listes de translations implicites des coordonnees. */ #define RAYON_IMPLICITE \ RAYON_DE_VISUALISATION \ /* Definition de la valeur implicite du rayon de materialisation. */ fTRANSFORMAT_31(fichier_LISTE_RAYON); /* Definition du fichier de liste des rayons. */ /* */ /* ATTENTION, le rayon est en unite d'ecran... */ #define MINIMUM_DES___ROUGE \ FLOT__NOIR #define MAXIMUM_DES___ROUGE \ FLOT__BLANC #define MINIMUM_DES___VERTE \ FLOT__NOIR #define MAXIMUM_DES___VERTE \ FLOT__BLANC #define MINIMUM_DES___BLEUE \ FLOT__NOIR #define MAXIMUM_DES___BLEUE \ FLOT__BLANC #define ROUGE_IMPLICITE \ FLOT__BLANC #define VERTE_IMPLICITE \ FLOT__BLANC #define BLEUE_IMPLICITE \ FLOT__BLANC /* Definition des composantes chromatiques implicites. */ fTRANSFORMAT_31(fichier_LISTE_ROUGE); fTRANSFORMAT_31(fichier_LISTE_VERTE); fTRANSFORMAT_31(fichier_LISTE_BLEUE); /* Definition des fichiers de listes de vraies couleurs (excluant les fausses). */ /* */ /* ATTENTION, les couleurs des points a visualiser doivent etre definies ainsi : */ /* */ /* ROUGE E [NOIR,BLANC] */ /* VERTE E [NOIR,BLANC] */ /* BLEUE E [NOIR,BLANC] */ /* */ #define LES_NIVEAUX_SONT_DENORMALISES \ VRAI DEFV(Local,DEFV(Logical,INIT(les_niveaux_sont_denormalises,LES_NIVEAUX_SONT_DENORMALISES))); /* Afin de pouvoir introduire des niveaux denormalises. Ceci a ete introduit le */ /* 20131204095011 pour 'v $xiirv/.GOLD.81.1.$U niveaux_denormalises'... */ #define NIVEAU_IMPLICITE \ FLOT__BLANC fTRANSFORMAT_31(fichier_LISTE_NIVEAU); /* Definition du fichier de listes des fausses couleurs (excluant les vraies couleurs). */ /* */ /* ATTENTION, les couleurs des points a visualiser doivent etre definies ainsi : */ /* */ /* NIVEAU E [NOIR,BLANC] */ /* */ #include xrv/particule.22.I" /* Recuperation d'un fichier contenant une liste de type {X,Y,Z} ou {R,V,B}. */ /* ATTENTION, a ne pas confondre : */ /* */ /* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que */ /* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par */ /* 'fTRANSFORMAT_31(...)', et */ /* */ /* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque */ /* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la */ /* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite */ /* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'... */ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L A U T O M A T I Q U E D E S D E R I V E E S : */ /* */ /*************************************************************************************************************************************/ #define CALCULER_AUTOMATIQUEMENT_LES_DERIVEES_PAR_DES_DIFFERENCES \ FAUX DEFV(Local,DEFV(Logical,INIT(calculer_automatiquement_les_derivees_par_des_differences ,CALCULER_AUTOMATIQUEMENT_LES_DERIVEES_PAR_DES_DIFFERENCES ) ) ); /* Afin de permettre le calcul automatique des derivees au point 'N' par des differences */ /* des valeurs des coordonnees aux points 'N-1' et 'N+1'. Ce dispositif fut introduit le */ /* 20060809124105... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U P O I N T D E R E F E R E N C E C O U R A N T : */ /* */ /*************************************************************************************************************************************/ #include xrr/N_corps.11.I" #define CENTRE_REFERENCE(type1,type2) \ COND(IL_FAUT(definir_la_scene_par_rapport_au_centre_de_l_espace) \ ,type1`centre_de_l_espace_pour_la_visualisation \ ,ACCES_LISTE(liste_initiale_des`type1,corps_de_reference) \ ) \ /* Recherche du corps de reference... */ #redefine DECENTRAGE_DES_COORDONNEES(coordonnee,type1,type2) \ SOUS(coordonnee \ ,CENTRE_REFERENCE(type1,type2) \ ) \ /* Fonction de "decentrage" des coordonnees. ATTENTION, on notera un point tres important : */ \ /* le centre de l'espace a pour coordonnees : */ \ /* */ \ /* centre={0,0,0} */ \ /* */ \ /* alors qu'en general, un corps de reference aura des coordonnees de l'ordre de : */ \ /* */ \ /* reference={0.5,0.5,0.5} */ \ /* */ \ /* et en tout cas differente de celles de 'centre'. Dans ce dernier cas, on aura interet */ \ /* a utiliser : */ \ /* */ \ /* TRANSLATION_OX=0.5 TRANSLATION_OY=0.5 */ \ /* */ \ /* pour compenser cette difference. On verra a ce propos : */ \ /* */ \ /* xivPdf 9 2 / .NCOR.1.22.$U */ \ /* */ \ /* cela est utilise... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N E V E N T U E L P O I N T D E J O N C T I O N : */ /* */ /*************************************************************************************************************************************/ #define COMPATIBILITE_20171123 \ FAUX DEFV(Logical,INIT(compatibilite_20171123,COMPATIBILITE_20171123)); /* Permet de faire des calculs compatibles a ceux faits anterieurement au 20171123124237... */ #define DEFINIR_LE_POINT_DE_JONCTION_AVEC_L_UN_DES_CORPS \ VRAI DEFV(Local,DEFV(Logical,INIT(definir_le_point_de_jonction_avec_l_un_des_corps ,DEFINIR_LE_POINT_DE_JONCTION_AVEC_L_UN_DES_CORPS ) ) ); /* Indique si le point de jonction est l'un des corps ('VRAI'), ou bien un point arbitraire */ /* defini ci-apres ('FAUX'). */ #define CORPS_DE_JONCTION \ CORPS_DE_REFERENCE DEFV(Local,DEFV(Int,INIT(corps_de_jonction,CORPS_DE_JONCTION))); /* Indique, si 'definir_le_point_de_jonction_avec_l_un_des_corps' est 'VRAI', le corps */ /* de reference sur lequel faire les jonctions. */ #define POINT_DE_JONCTION(liste,scalaire) \ COND(IL_FAUT(definir_le_point_de_jonction_avec_l_un_des_corps) \ ,ACCES_LISTE(liste,corps_de_jonction) \ ,scalaire \ ) \ /* Recherche du corps de jonction... */ #define X_POINT_DE_JONCTION \ Xcentre_ESPACE #define Y_POINT_DE_JONCTION \ Ycentre_ESPACE #define Z_POINT_DE_JONCTION \ Zcentre_ESPACE DEFV(Local,DEFV(Float,INIT(X_point_de_jonction,X_POINT_DE_JONCTION))); DEFV(Local,DEFV(Float,INIT(Y_point_de_jonction,Y_POINT_DE_JONCTION))); DEFV(Local,DEFV(Float,INIT(Z_point_de_jonction,Z_POINT_DE_JONCTION))); /* Definition des coordonnees cartesiennes d'un eventuel point de jonction, c'est-a-dire */ /* un point auquel seront joints tous les points lorsqu'ils sont isoles et lorsque cela */ /* est demande... */ #define ROUGE_POINT_DE_JONCTION \ FLOT__BLANC #define VERTE_POINT_DE_JONCTION \ FLOT__BLANC #define BLEUE_POINT_DE_JONCTION \ FLOT__BLANC DEFV(Local,DEFV(Float,INIT(ROUGE_point_de_jonction,ROUGE_POINT_DE_JONCTION))); DEFV(Local,DEFV(Float,INIT(VERTE_point_de_jonction,VERTE_POINT_DE_JONCTION))); DEFV(Local,DEFV(Float,INIT(BLEUE_point_de_jonction,BLEUE_POINT_DE_JONCTION))); /* Definition des composantes chromatiques d'un eventuel point de jonction... */ #define RAYON_DE_VISUALISATION_POINT_DE_JONCTION \ RAYON_DE_VISUALISATION DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation_point_de_jonction,RAYON_DE_VISUALISATION_POINT_DE_JONCTION))); /* Rayon du disque materialisant un eventuel point de jonction... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S I N I T I A L I S A T I O N S : */ /* */ /*************************************************************************************************************************************/ /* Jusqu'au 20030311095504, '__VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' etait defini */ /* ici, mais cela est contraire aux tests dont il est l'objet dans */ /* 'v $xrv/champs_5.12$I __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' via */ /* 'v $xrk/attractor.17$I champs_5.12', d'ou son deplacement a cette date... */ #include xrk/attractor.18.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P O U R D E S R A I S O N S D E C O M P A T I B I L I T E : */ /* */ /*************************************************************************************************************************************/ #include xrk/integr.1B.vv.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V I S U A L I S A T I O N D ' U N E N S E M B L E D E P A R T I C U L E S : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_paletteA),NOM_PIPE)); /* Nom de la palette a utiliser en cas de l'utilisation des fausses couleurs. C'est son */ /* absence/presence qui provoque le choix entre les vraies et les fausses couleurs... */ DONNEES_NECESSAIRES_A_L_UTILISATION_D_UN_FOND; gDEFINITION_LISTE(liste_initiale_des_X,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_Y,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_Z,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_dX,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_dY,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_dZ,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_RHO,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_THETA,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_PHI,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_tX,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_tY,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_tZ,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_RAYON,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_ROUGE,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_VERTE,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_BLEUE,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gDEFINITION_LISTE(liste_initiale_des_NIVEAU,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); /* Afin de conserver la valeur initiale des differentes listes... */ #define Image_Fx \ IFmage_ROUGE #define Image_Fy \ IFmage_VERTE #define Image_Fz \ IFmage_BLEUE #include xrs/project2D.1A.I" DEFV(Local,DEFV(Float,INIT(A_Image_Fx,AMPLIFICATEUR_DES_IMAGES))); DEFV(Local,DEFV(Float,INIT(A_Image_Fy,AMPLIFICATEUR_DES_IMAGES))); DEFV(Local,DEFV(Float,INIT(A_Image_Fz,AMPLIFICATEUR_DES_IMAGES))); DEFV(Local,DEFV(Float,INIT(B_Image_Fx,TRANSLATEUR_DES_IMAGES))); DEFV(Local,DEFV(Float,INIT(B_Image_Fy,TRANSLATEUR_DES_IMAGES))); DEFV(Local,DEFV(Float,INIT(B_Image_Fz,TRANSLATEUR_DES_IMAGES))); #include xrs/project2D.1B.I" /* Donnees specifiques au projecteur bidimensionnel (introduites le 20150604145519)... */ /* */ /* Les transformateurs {A,B} des niveaux de {Fx,Fy,Fz} ont ete introduits le 20150605144605. */ /*..............................................................................................................................*/ INITIALISATIONS_GENERALES; /* Initialisations generales faites au tout debut... */ gINITIALISATION_LISTE(liste_initiale_des_X,X_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gINITIALISATION_LISTE(liste_initiale_des_Y,Y_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gINITIALISATION_LISTE(liste_initiale_des_Z,Z_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); /* Initialisation des fichiers de listes de coordonnees cartesiennes. */ gINITIALISATION_LISTE(liste_initiale_des_dX,dX_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gINITIALISATION_LISTE(liste_initiale_des_dY,dY_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gINITIALISATION_LISTE(liste_initiale_des_dZ,dZ_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); /* Initialisation des fichiers de listes des derivees des coordonnees cartesiennes. */ gINITIALISATION_LISTE(liste_initiale_des_RHO,RHO_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gINITIALISATION_LISTE(liste_initiale_des_THETA,THETA_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gINITIALISATION_LISTE(liste_initiale_des_PHI,PHI_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); /* Initialisation des fichiers de listes de coordonnees spheriques. */ gINITIALISATION_LISTE(liste_initiale_des_tX,tX_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gINITIALISATION_LISTE(liste_initiale_des_tY,tY_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gINITIALISATION_LISTE(liste_initiale_des_tZ,tZ_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); /* Initialisation des fichiers de listes de translations implicites des coordonnees. */ gINITIALISATION_LISTE(liste_initiale_des_RAYON,RAYON_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); /* Initialisation du fichier de liste des rayons. */ gINITIALISATION_LISTE(liste_initiale_des_ROUGE,ROUGE_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gINITIALISATION_LISTE(liste_initiale_des_VERTE,VERTE_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); gINITIALISATION_LISTE(liste_initiale_des_BLEUE,BLEUE_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); /* Initialisation des fichiers de listes de vraies couleurs. */ gINITIALISATION_LISTE(liste_initiale_des_NIVEAU,NIVEAU_IMPLICITE,PREMIER_POINT_DES_LISTES,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); /* Initialisation du fichier des listes de fausses couleurs. */ #include xrs/project2D.1C.I" /* Introduit le 20150604143557 pour definir les parametres du projecteur bidimensionnel... */ #include xrv/champs_5.1A.I" #define GET_ARGUMENT_L_____ajuster_automatiquement_les_coordonnees_independamment_homothetie \ "ajuster_independamment_homothetie=""ajuster_h=""ajuster_coordonnees_independamment_homothetie=" #define GET_ARGUMENT_L_____ajuster_automatiquement_les_coordonnees_independamment_translation \ "ajuster_t=""ajuster_independamment_translation=""ajuster_coordonnees_independamment_translation=" /* Afin de raccourcir une ligne suivante (introduit le 20070223142707)... */ GET_ARGUMENTSv(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20171123=",compatibilite_20171123); /* Option introduite le 20171123124237... */ GET_ARGUMENT_L("compatibilite_20211211=",compatibilite_20211211); /* Option introduite le 20211211115613... */ GET_ARGUMENT_L("grossissement_rayon_de_visualisation_____compatibilite_20250215=""compatibilite_20250215=" ,grossissement_du_rayon_de_visualisation_des_points_____compatibilite_20250215 ); /* Option introduite le 20250215122855... */ PROCESS_ARGUMENT_I("nombre_points=""npoints=""iterations=",nombre_d_iterations /* Le 20090128082131 fut introduit "nombre_points=" pour simplifier l'usage... */ ,BLOC(VIDE;) ,BLOC( Bblock PRINT_AVERTISSEMENT("'npoints=''iterations=' doit etre defini avant tout fichier"); Test(IFGT(nombre_d_iterations,NOMBRE_MAXIMAL_DE_POINTS_GERABLES)) Bblock PRINT_ERREUR("le nombre de points a gerer est trop important"); PRINT_ERREUR("il va donc etre seuille"); CAL1(Prer2("Il vaut %d alors que le maximum est de %d.\n" ,nombre_d_iterations ,NOMBRE_MAXIMAL_DE_POINTS_GERABLES ) ); EGAL(nombre_d_iterations,NOMBRE_MAXIMAL_DE_POINTS_GERABLES); /* Et on seuille le nombre de points... */ Eblock ATes Bblock Eblock ETes Eblock ) ); /* ATTENTION : la recuperation de 'nombre_d_iterations' doit preceder les */ /* 'PROCESS_ARGUMENT_C(...)' qui suivent car ils l'utilisent. */ PROCESS_ARGUMENTS_GEOMETRIQUES; PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_12; /* Ces parametres ont ete introduits le 20021104162112 afin de pouvoir etre utilises, si */ /* necessaires, avant chacun des 'PROCESS_ARGUMENT_C(...,BLOC(lTRANSFORMAT_12(...);))' qui */ /* suivent. Par exemple, cela permettra d'utiliser le meme fchier pour 'LISTE_X' et */ /* 'LISTE_Y', mais en les decalant differemment... */ PROCESS_ARGUMENT_FICHIER("LISTE_X=" ,fichier_LISTE_X ,liste_initiale_des_X ,X_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_Y=" ,fichier_LISTE_Y ,liste_initiale_des_Y ,Y_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_Z=" ,fichier_LISTE_Z ,liste_initiale_des_Z ,Z_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_dX=" ,fichier_LISTE_dX ,liste_initiale_des_dX ,dX_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_dY=" ,fichier_LISTE_dY ,liste_initiale_des_dY ,dY_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_dZ=" ,fichier_LISTE_dZ ,liste_initiale_des_dZ ,dZ_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_RHO=" ,fichier_LISTE_RHO ,liste_initiale_des_RHO ,RHO_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_THETA=" ,fichier_LISTE_THETA ,liste_initiale_des_THETA ,THETA_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_PHI=" ,fichier_LISTE_PHI ,liste_initiale_des_PHI ,PHI_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_tX=" ,fichier_LISTE_tX ,liste_initiale_des_tX ,tX_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_tY=" ,fichier_LISTE_tY ,liste_initiale_des_tY ,tY_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_tZ=" ,fichier_LISTE_tZ ,liste_initiale_des_tZ ,tZ_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_RAYON=" ,fichier_LISTE_RAYON ,liste_initiale_des_RAYON ,RAYON_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_ROUGE=" ,fichier_LISTE_ROUGE ,liste_initiale_des_ROUGE ,ROUGE_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_VERTE=" ,fichier_LISTE_VERTE ,liste_initiale_des_VERTE ,VERTE_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENT_FICHIER("LISTE_BLEUE=" ,fichier_LISTE_BLEUE ,liste_initiale_des_BLEUE ,BLEUE_IMPLICITE ,lTRANSFORMAT_12 ); GET_ARGUMENT_C("paletteA=""palette=""pA=""p=",nom_paletteA); GET_ARGUMENT_L("niveaux_denormalises=""ndn=",les_niveaux_sont_denormalises); GET_ARGUMENT_N("niveaux_normalises=""nn=",les_niveaux_sont_denormalises); /* Cette option fut introduite le 20131204095011... */ PROCESS_ARGUMENT_FICHIER("LISTE_NIVEAU=" ,fichier_LISTE_NIVEAU ,liste_initiale_des_NIVEAU ,NIVEAU_IMPLICITE ,lTRANSFORMAT_12 ); PROCESS_ARGUMENTS_DE_VISUALISATION; PROCESS_ARGUMENTS_DE_VISUALISATION_DES_AXES_DE_COORDONNEES; GET_ARGUMENT_L("isoles=",generer_des_points_isoles); GET_ARGUMENT_N("apparies=""paires=",generer_des_points_isoles); /* Cette option 'GET_ARGUMENT_N(...)' fut introduite le 20081108181251... */ GET_ARGUMENT_L("joindre_central=""joindre=",joindre_a_un_corps_central); GET_ARGUMENT_L("jonction_a_un_corps=",definir_le_point_de_jonction_avec_l_un_des_corps); GET_ARGUMENT_I("corps_de_jonction=",corps_de_jonction); GET_ARGUMENT_F("Xjonction=",X_point_de_jonction); GET_ARGUMENT_F("Yjonction=",Y_point_de_jonction); GET_ARGUMENT_F("Zjonction=",Z_point_de_jonction); GET_ARGUMENT_F("Rjonction=",ROUGE_point_de_jonction); GET_ARGUMENT_F("Vjonction=",VERTE_point_de_jonction); GET_ARGUMENT_F("Bjonction=",BLEUE_point_de_jonction); GET_ARGUMENT_F("rayon_jonction=",rayon_de_visualisation_point_de_jonction); GET_ARGUMENT_L("chainer=",chainer_automatiquement_les_points); GET_ARGUMENT_L("dernier_premier=""d_p=",le_dernier_point_est_le_premier_point); /* Cette option fut introduite le 20060808110301... */ GET_ARGUMENT_F("lambda_extrapolation_A=""lambdaA=""lA=",lambda_extrapolation_A); GET_ARGUMENT_F("lambda_extrapolation_B=""lambdaB=""lB=",lambda_extrapolation_B); /* Les options "lambda?="s ont ete introduites le 20171121134718... */ GET_ARGUMENT_L("filtrer_longueur_segments=""fls=",filtrer_la_longueur_des_segments); GET_ARGUMENT_F("borne_inferieure_longueur_segments=""bils=",borne_inferieure_de_la_longueur_des_segments); GET_ARGUMENT_F("borne_superieure_longueur_segments=""bsls=",borne_superieure_de_la_longueur_des_segments); /* Ces options furent introduites le 20120806100234... */ GET_ARGUMENT_L("ajuster_points=""Pajuster=" ,ajuster_automatiquement_le_nombre_de_points_sur_une_chaine_de_connexion ); GET_ARGUMENT_L("equidistance=",garantir_l_equidistance_des_points_successifs_d_une_chaine_de_connexion); /* Cette option fut introduite le 20051213135932... */ GET_ARGUMENT_L("equidistance_chaine_connexion_____compatibilite_20051230=""compatibilite_20051230=" ,equidistance_des_points_successifs_d_une_chaine_de_connexion_____compatibilite_20051230 ); /* Cette option fut introduite le 20051230131157... */ GET_ARGUMENT_L("equidistance_chaine_connexion_____compatibilite_20081109=""compatibilite_20081109=" ,equidistance_des_points_successifs_d_une_chaine_de_connexion_____compatibilite_20081109 ); /* Cette option fut introduite le 20081109113459... */ GET_ARGUMENT_F("dm=""distance_minimale=""distance=" ,distance_minimale_entre_deux_points_successifs_d_une_chaine_de_connexion ); GET_ARGUMENT_F("amelioration_lambda=""al=",facteur_d_amelioration_du_lambda_d_une_chaine_de_connexion); /* Les deux options relatives a l'amelioration iterative du "lambda" ont ete introduits */ /* le 20051213095218. */ GET_ARGUMENT_L("aide_mise_au_point_CHAINE_DE_CONNEXION=""ampCC=" ,aider_a_la_mise_au_point_de__VISUALISATION_D_UNE_CHAINE_DE_CONNEXION ); /* Cette option fut introduite le 20230130125104... */ GET_ARGUMENT_I("points=""nombreA=""Apoints=",nombre_absolu_de_points_sur_une_chaine_de_connexion); GET_ARGUMENT_F("nombreR=""Rpoints=",facteur_du_nombre_relatif_de_points_sur_une_chaine_de_connexion); GET_ARGUMENT_F("grossissement=",grossissement_du_rayon_de_visualisation_des_points); GET_ARGUMENT_F("epsilon_grossissement=",epsilon_de_grossissement_du_rayon_de_visualisation_des_points); /* Cette option fut introduite le 20250215122855... */ GET_ARGUMENT_F("lmin=""lambda_minimal=",lambda_minimal_d_une_chaine_de_connexion); GET_ARGUMENT_F("lmax=""lambda_maximal=",lambda_maximal_d_une_chaine_de_connexion); GET_ARGUMENT_L("cubique=",interpoler_les_chaines_de_connexion_par_des_splines_cubiques); GET_ARGUMENT_N("lineaire=",interpoler_les_chaines_de_connexion_par_des_splines_cubiques); /* Synonyme "complementaire" introduit le 20060808114728... */ GET_ARGUMENT_I("methode_modulation_lambda=""mml=",choix_de_la_methode_de_modulation_du_lambda_des_derivees); GET_ARGUMENT_F("facteur_lambda=""fl=",facteur_du_lambda_des_derivees); GET_ARGUMENT_F("translation_lambda=""tl=",translation_du_lambda_des_derivees); GET_ARGUMENT_F("facteur_modulation_lambda=""fml=",facteur_modulation_du_lambda_des_derivees); GET_ARGUMENT_F("translation_modulation_lambda=""tml=",translation_modulation_du_lambda_des_derivees); /* Ces options furent introduites le 20180528101030... */ PROCESS_ARGUMENTS_DE_DEFINITION_DU_RAYON_DES_SPHERES_REPRESENTATIVES; GET_ARGUMENT_L("cartesiennes=""cartesienne=",utiliser_les_coordonnees_cartesiennes); GET_ARGUMENT_N("spheriques=""spherique=",utiliser_les_coordonnees_cartesiennes); /* Les options "spherique"s ont ete introduites le 20031215165636 afin d'etre */ /* utilisees dans 'v $xiMo/graphes$vv$Z spheriques='. */ GET_ARGUMENT_L("coordonnees_spheriques_etendues=""spheriques_etendues=""spherique_etendue=""se=" ,utiliser_les_coordonnees_spheriques_etendues ); GET_ARGUMENT_I("extension_coordonnees_spheriques=""extension_spheriques=""extension_spherique=""es=" ,numero_de_l_extension_des_coordonnees_spheriques ); GET_ARGUMENT_F("parametre_01=""P01=",extension_des_coordonnees_spheriques_parametre_01); GET_ARGUMENT_F("parametre_02=""P02=",extension_des_coordonnees_spheriques_parametre_02); GET_ARGUMENT_F("parametre_03=""P03=",extension_des_coordonnees_spheriques_parametre_03); GET_ARGUMENT_F("parametre_04=""P04=",extension_des_coordonnees_spheriques_parametre_04); GET_ARGUMENT_F("parametre_05=""P05=",extension_des_coordonnees_spheriques_parametre_05); GET_ARGUMENT_F("parametre_06=""P06=",extension_des_coordonnees_spheriques_parametre_06); GET_ARGUMENT_F("parametre_07=""P07=",extension_des_coordonnees_spheriques_parametre_07); GET_ARGUMENT_F("parametre_08=""P08=",extension_des_coordonnees_spheriques_parametre_08); GET_ARGUMENT_F("parametre_09=""P09=",extension_des_coordonnees_spheriques_parametre_09); /* L'extension des coordonnees spheriques a ete introduite le 20150602113353... */ ENTREE_DE_LA_DEFINITION_DES_IMAGES_Fx_Fy_Fz; /* Introduit le 20150604145519 afin de definir les arguments du projecteur bidimensionnel. */ GET_ARGUMENT_F("aFx=",A_Image_Fx); GET_ARGUMENT_F("tFx=""bFx=",B_Image_Fx); GET_ARGUMENT_F("aFy=",A_Image_Fy); GET_ARGUMENT_F("tFy=""bFy=",B_Image_Fy); GET_ARGUMENT_F("aFz=",A_Image_Fz); GET_ARGUMENT_F("tFz=""bFz=",B_Image_Fz); /* Introduit le 20150605144605... */ GET_ARGUMENT_F("mtheta=""mt=",minimum_de_u_theta); GET_ARGUMENT_F("Mtheta=""Mt=",maximum_de_u_theta); GET_ARGUMENT_F("mphi=""mp=",minimum_de_v_phi); GET_ARGUMENT_F("Mphi=""Mp=",maximum_de_v_phi); /* Introduit le 20150604211734... */ GET_ARGUMENT_L("lineaire2D=""bilineaire2D=" ,FFload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire ); GET_ARGUMENT_N("cubique2D=""bicubique2D=" ,FFload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire ); /* Introduit hors de 'ENTREE_DE_LA_DEFINITION_DES_IMAGES_Fx_Fy_Fz' afin d'eviter des doubles */ /* definitions avec 'v $xrs/project2D.11$K ENTREE_DE_LA_DEFINITION_DES_IMAGES_Fx_Fy_Fz'. */ GET_ARGUMENT_F("ARHO=",facteur_d_homothetie_de_la_coordonnee_RHO); GET_ARGUMENT_F("BRHO=",constante_de_translation_de_la_coordonnee_RHO); GET_ARGUMENT_F("ATHETA=",facteur_d_homothetie_de_la_coordonnee_THETA); GET_ARGUMENT_F("BTHETA=",constante_de_translation_de_la_coordonnee_THETA); GET_ARGUMENT_F("APHI=",facteur_d_homothetie_de_la_coordonnee_PHI); GET_ARGUMENT_F("BPHI=",constante_de_translation_de_la_coordonnee_PHI); GET_ARGUMENT_L("coordonnees_dans_0_1=",mettre_les_coordonnees_XYZ_dans_0_1); PROCESS_ARGUMENT_N("adapter_coordonnees_format_image=""acfi=" ,super_echelle_____utiliser_le_mode_rectangulaire ,BLOC(VIDE;) ,BLOC(Bblock CHOIX_DE_LA_SUPER_ECHELLE(NOTL(super_echelle_____utiliser_le_mode_rectangulaire) ,NOTL(super_echelle_____utiliser_le_mode_carre__grand_carre) ); Eblock ) ); /* Introduit le 20090128090632 pour permettre, par exemple au carre : */ /* */ /* {{0,0},{1,0},{1,1},{0,1}} */ /* */ /* d'apparaitre sous la forme d'un rectangle dont les proportions sont celles de l'image. */ /* On notera que cela intervient dans 'v $xrv/champs_5.26$I _PHYSIQUE_DANS_01' via */ /* 'v $xrq/nucleon.L4$I ANTI_SUPER_ECHELLE_O'. Cela "inverse" donc en quelque sorte ce */ /* qui est fait dans 'v $xrk/attractor.12$I _HOMOTHETIE' lors du "reformatage" de l'espace */ /* physique (pour lui donner selon 'OX' et 'OY' les proportions de '$formatI'). C'est cette */ /* inversion qui justifie que l'usage de 'super_echelle_____utiliser_le_mode_rectangulaire' */ /* soit l'inverse de ce que la logique laisserait supposer. Cela explique que cette option */ /* fut introduite pour ne pas a avoir a utiliser 'v $xig/fonct$vv$DEF carree=' avec un */ /* argument 'VRAI/FAUX' inverse de ce que l'on veut faire en realite... */ /* */ /* L'usage de 'NOTL(...)' est du a celui de 'PROCESS_ARGUMENT_N(...)' car, en effet, lorsque */ /* 'CHOIX_DE_LA_SUPER_ECHELLE(...)' est execute, le parametre logique en cours de traitement */ /* est alors inverse ('v $xig/fonct$vv$DEF NOTL.valeur_L_par_defaut'). Evidemment ce */ /* 'NOTL(...)' ne porte que sur 'super_echelle_____utiliser_le_mode_rectangulaire' qui est */ /* le parametre qui est en train de faire l'objet du 'PROCESS_ARGUMENT_N(...)', alors que */ /* 'super_echelle_____utiliser_le_mode_carre__grand_carre' est un indicateur que l'on ne */ /* fait que tester ici (via 'CHOIX_DE_LA_SUPER_ECHELLE(...)') et qui ne fait donc que */ /* l'objet d'un 'NEUL(...)'... */ PROCESS_ARGUMENT_N("adapter_grandement_coordonnees_format_image=""agcfi=" ,super_echelle_____utiliser_le_mode_carre__grand_carre ,BLOC(VIDE;) ,BLOC(Bblock CHOIX_DE_LA_SUPER_ECHELLE(NOTL(super_echelle_____utiliser_le_mode_rectangulaire) ,NOTL(super_echelle_____utiliser_le_mode_carre__grand_carre) ); /* L'usage de 'NOTL(...)' est du a celui de 'PROCESS_ARGUMENT_N(...)' car, en effet, lorsque */ /* 'CHOIX_DE_LA_SUPER_ECHELLE(...)' est execute, le parametre logique en cours de traitement */ /* est alors inverse ('v $xig/fonct$vv$DEF NOTL.valeur_L_par_defaut'). */ Eblock ) ); /* Introduit le 20090128110234 a la suite de "adapter_coordonnees_format_image=" avec les */ /* memes remarques concernant les "inversions" de conventions... */ GET_ARGUMENT_L("ajuster_coordonnees=""ajuster=",ajuster_automatiquement_les_coordonnees_cartesiennes); GET_ARGUMENT_L(GET_ARGUMENT_L_____ajuster_automatiquement_les_coordonnees_independamment_homothetie ,ajuster_automatiquement_les_coordonnees_cartesiennes_independamment_homothetie ); GET_ARGUMENT_L(GET_ARGUMENT_L_____ajuster_automatiquement_les_coordonnees_independamment_translation ,ajuster_automatiquement_les_coordonnees_cartesiennes_independamment_translation ); GET_ARGUMENT_L("lister=",lister_l_ajustement_des_coordonnees_cartesiennes); GET_ARGUMENT_F("sAX=",super_facteur_d_homothetie_de_la_coordonnee_X); GET_ARGUMENT_F("AX=",facteur_d_homothetie_de_la_coordonnee_X); GET_ARGUMENT_F("BX=",constante_de_translation_de_la_coordonnee_X); GET_ARGUMENT_F("sAY=",super_facteur_d_homothetie_de_la_coordonnee_Y); GET_ARGUMENT_F("AY=",facteur_d_homothetie_de_la_coordonnee_Y); GET_ARGUMENT_F("BY=",constante_de_translation_de_la_coordonnee_Y); GET_ARGUMENT_F("sAZ=",super_facteur_d_homothetie_de_la_coordonnee_Z); GET_ARGUMENT_F("AZ=",facteur_d_homothetie_de_la_coordonnee_Z); GET_ARGUMENT_F("BZ=",constante_de_translation_de_la_coordonnee_Z); GET_ARGUMENT_F("AXYZ=",facteur_d_homothetie_des_coordonnees); GET_ARGUMENT_F("BXYZ=",constante_de_translation_des_coordonnees); GET_ARGUMENT_L("derivees_automatiques=""da=",calculer_automatiquement_les_derivees_par_des_differences); /* Cette option fut introduite le 20060809124105... */ GET_ARGUMENT_F("AdX=",facteur_d_homothetie_de_la_derivee_X); GET_ARGUMENT_F("BdX=",constante_de_translation_de_la_derivee_X); GET_ARGUMENT_F("AdY=",facteur_d_homothetie_de_la_derivee_Y); GET_ARGUMENT_F("BdY=",constante_de_translation_de_la_derivee_Y); GET_ARGUMENT_F("AdZ=",facteur_d_homothetie_de_la_derivee_Z); GET_ARGUMENT_F("BdZ=",constante_de_translation_de_la_derivee_Z); GET_ARGUMENT_F("AdXYZ=",facteur_d_homothetie_des_derivees); GET_ARGUMENT_F("BdXYZ=",constante_de_translation_des_derivees); GET_ARGUMENT_F("cpX=",coefficient_de_la_pente_X_des_chaines_de_connexion); GET_ARGUMENT_F("cpY=",coefficient_de_la_pente_Y_des_chaines_de_connexion); GET_ARGUMENT_F("cpZ=",coefficient_de_la_pente_Z_des_chaines_de_connexion); GET_ARGUMENT_F("cpXYZ=",coefficient_des_pente_XYZ_des_chaines_de_connexion); /* Arguments introduits le 20180702101313... */ GET_ARGUMENT_L("ajuster_couleurs=""ajusterC=",ajuster_automatiquement_les_couleurs); GET_ARGUMENT_L("ajusterC_h=""ajuster_couleurs_independamment_homothetie=" ,ajuster_automatiquement_les_couleurs_independamment_homothetie ); GET_ARGUMENT_L("ajusterC_t=""ajuster_couleurs_independamment_translation=" ,ajuster_automatiquement_les_couleurs_independamment_translation ); GET_ARGUMENT_L("lister_ajustement_couleurs=""listerC=",lister_l_ajustement_des_couleurs); /* Arguments introduits le 20091024085314... */ GET_ARGUMENT_F("AR=",facteur_d_homothetie_de_la_couleur_ROUGE); GET_ARGUMENT_F("BR=",constante_de_translation_de_la_couleur_ROUGE); GET_ARGUMENT_F("AV=",facteur_d_homothetie_de_la_couleur_VERTE); GET_ARGUMENT_F("BV=",constante_de_translation_de_la_couleur_VERTE); GET_ARGUMENT_F("AB=",facteur_d_homothetie_de_la_couleur_BLEUE); GET_ARGUMENT_F("BB=",constante_de_translation_de_la_couleur_BLEUE); /* Arguments introduits le 20091024085314... */ GET_ARGUMENT_F("ARVB=",facteur_d_homothetie_des_couleurs); GET_ARGUMENT_F("BRVB=",constante_de_translation_des_couleurs); GET_ARGUMENT_F("Ar=",facteur_d_homothetie_du_rayon); /* Je rappelle le 20180515134531 que la valeur par defaut de 'facteur_d_homothetie_du_rayon' */ /* est 2 (et non pas 1...). Ce fut la la cause du probleme rencontre lors des evolutions */ /* de 'v $xiirv/.GPS2.11.1.$U 20180515134240'... */ GET_ARGUMENT_F("Br=",constante_de_translation_du_rayon); GET_ARGUMENT_L("centrer=",definir_la_scene_par_rapport_au_centre_de_l_espace); GET_ARGUMENT_F("Xcentre=",X_centre_de_l_espace_pour_la_visualisation); GET_ARGUMENT_F("Ycentre=",Y_centre_de_l_espace_pour_la_visualisation); GET_ARGUMENT_F("Zcentre=",Z_centre_de_l_espace_pour_la_visualisation); GET_ARGUMENT_I("reference=",corps_de_reference); GET_ARGUMENT_L("cs=""cross_section=",faire_une_cross_section); GET_ARGUMENT_F("Xcs=""Xcross_section=",X_centre_ellipsoide_de_cross_section); GET_ARGUMENT_F("Ycs=""Ycross_section=",Y_centre_ellipsoide_de_cross_section); GET_ARGUMENT_F("Zcs=""Zcross_section=",Z_centre_ellipsoide_de_cross_section); GET_ARGUMENT_F("DXcs=""DXcross_section=",X_demi_axe_ellipsoide_de_cross_section); GET_ARGUMENT_F("DYcs=""DYcross_section=",Y_demi_axe_ellipsoide_de_cross_section); GET_ARGUMENT_F("DZcs=""DZcross_section=",Z_demi_axe_ellipsoide_de_cross_section); PROCESS_ARGUMENTS_DE_GESTION_DE_LA_RELATIVITE_RESTREINTE; ) ); #undef GET_ARGUMENT_L_____ajuster_automatiquement_les_coordonnees_independamment_homothetie #undef GET_ARGUMENT_L_____ajuster_automatiquement_les_coordonnees_independamment_translation #include xrv/champs_5.19.I" /* Pour eviter le message : */ /* */ /* Static function is not referenced. */ /* */ /* sur 'SYSTEME_ES9000_AIX_CC'... */ #include xrk/attractor.19.I" /* Validations et definition de l'espace physique. */ INITIALISATION_DU_ZOOM_AUTOMATIQUE; /* Introduit le 20131114165814... */ Test(IL_FAUT(utiliser_les_coordonnees_cartesiennes)) Bblock Eblock ATes Bblock Test(IL_NE_FAUT_PAS(utiliser_les_coordonnees_spheriques_etendues)) Bblock Eblock ATes Bblock /* Sequence introduite le 20150604143255 afin de faire d'eventuelles initialisations */ /* specifiques... */ Choi(numero_de_l_extension_des_coordonnees_spheriques) Bblock Ca1e(EXTENSION_ellipsoid) Bblock Eblock ECa1 Ca1e(EXTENSION_hyperboloid) Bblock Eblock ECa1 Ca1e(EXTENSION_cylindre) Bblock Eblock ECa1 Ca1e(EXTENSION_tore) Bblock Eblock ECa1 Ca1e(EXTENSION_Mobius2D) Bblock Eblock ECa1 Ca1e(EXTENSION_project2D) Bblock Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(Image_Fx,nom_imageFx)))) Bblock Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(Image_Fy,nom_imageFy)))) Bblock Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(Image_Fz,nom_imageFz)))) Bblock Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Test(PAS_D_ERREUR(CODE_ERREUR)) Bblock Eblock ATes Bblock PRINT_ATTENTION("a cause des erreurs, le mode 'coordonnees spheriques etendues' est inhibe"); EGAL(utiliser_les_coordonnees_spheriques_etendues,FAUX); Eblock ETes Eblock ECa1 Defo Bblock PRINT_ATTENTION("l'extension des cordonnees spheriques demandee n'existe pas -2-"); CAL1(Prer1("cette extension a le numero %d\n",numero_de_l_extension_des_coordonnees_spheriques)); PRINT_ATTENTION("le mode 'coordonnees spheriques etendues' est donc inhibe"); EGAL(utiliser_les_coordonnees_spheriques_etendues,FAUX); Eblock EDef Eblock ECho Eblock ETes Eblock ETes Test(IFET(IFET(IL_NE_FAUT_PAS(generer_des_points_isoles) ,IL_NE_FAUT_PAS(chainer_automatiquement_les_points) ) ,EST_IMPAIR(nombre_de_corps) ) ) Bblock PRINT_ATTENTION("dans le mode de jonction des points deux a deux, le nombre de points doit etre pair"); CAL1(Prer1("il vaut %d et le dernier point sera donc ignore\n",nombre_de_corps)); Eblock ATes Bblock Eblock ETes Test(IFET(IL_FAUT(generer_des_points_isoles) ,IL_FAUT(chainer_automatiquement_les_points) ) ) /* Test introduit le 20060808105004... */ Bblock PRINT_ATTENTION("les options 'isoles=' et 'chainer=' ne sont pas utilisees correctement"); CAL1(Prer2("(l'utilisation de 'isoles=%s' implique 'chainer=%s' qui est donc force)\n" ,ETAT_LOGIQUE(NEUL(generer_des_points_isoles)) ,ETAT_LOGIQUE(NOTL(chainer_automatiquement_les_points)) ) ); EGAL(chainer_automatiquement_les_points,FAUX); Eblock ATes Bblock Eblock ETes Test(IFET(IL_FAUT(generer_des_points_isoles) ,EST_VRAI(le_dernier_point_est_le_premier_point) ) ) /* Test introduit le 20060808110301... */ Bblock PRINT_ATTENTION("les options 'isoles=' et 'dernier_premier=' ne sont pas utilisees correctement"); CAL1(Prer2("(l'utilisation de 'isoles=%s' implique 'dernier_premier=%s' qui est donc force)\n" ,ETAT_LOGIQUE(NEUL(generer_des_points_isoles)) ,ETAT_LOGIQUE(NOTL(le_dernier_point_est_le_premier_point)) ) ); EGAL(le_dernier_point_est_le_premier_point,FAUX); Eblock ATes Bblock Eblock ETes Test(IFET(IL_NE_FAUT_PAS(definir_la_scene_par_rapport_au_centre_de_l_espace) ,NINCff(corps_de_reference,PREMIER_POINT_DES_LISTES,nombre_de_corps) ) ) Bblock PRINT_ATTENTION("le corps de reference demande n'existe pas, on lui substitue la valeur par defaut"); EGAL(corps_de_reference,CORPS_DE_REFERENCE); Eblock ATes Bblock Eblock ETes Test(IFET(IL_FAUT(definir_le_point_de_jonction_avec_l_un_des_corps) ,NINCff(corps_de_jonction,PREMIER_POINT_DES_LISTES,nombre_de_corps) ) ) Bblock PRINT_ATTENTION("le corps de jonction demande n'existe pas, on lui substitue la valeur par defaut"); EGAL(corps_de_jonction,CORPS_DE_REFERENCE); Eblock ATes Bblock Eblock ETes Test(IFET(IL_NE_FAUT_PAS(definir_la_scene_par_rapport_au_centre_de_l_espace) ,IL_NE_FAUT_PAS(utiliser_les_coordonnees_cartesiennes) ) ) Bblock PRINT_ATTENTION("le centrage de la scene par rapport a l'un des corps n'est fait qu'en coordonnees cartesiennes"); Eblock ATes Bblock Eblock ETes #include xrv/particule.51.I" /* Gestion des fausses couleurs via 'nom_paletteA'. */ Test(IL_FAUT(ajuster_automatiquement_les_coordonnees_cartesiennes)) Bblock Test(IL_FAUT(utiliser_les_coordonnees_cartesiennes)) Bblock DEFV(Float,INIT(minimum_des_X,F_INFINI)); DEFV(Float,INIT(maximum_des_X,F_MOINS_L_INFINI)); DEFV(Float,INIT(minimum_des_Y,F_INFINI)); DEFV(Float,INIT(maximum_des_Y,F_MOINS_L_INFINI)); DEFV(Float,INIT(minimum_des_Z,F_INFINI)); DEFV(Float,INIT(maximum_des_Z,F_MOINS_L_INFINI)); DEFV(Float,INIT(minimum_des_XYZ,FLOT__UNDEF)); DEFV(Float,INIT(maximum_des_XYZ,FLOT__UNDEF)); /* Pour calculer les extrema... */ Komp(numero_des_points,nombre_d_iterations) Bblock EGAL(minimum_des_X,MIN2(ACCES_LISTE(liste_initiale_des_X,numero_des_points),minimum_des_X)); EGAL(maximum_des_X,MAX2(ACCES_LISTE(liste_initiale_des_X,numero_des_points),maximum_des_X)); EGAL(minimum_des_Y,MIN2(ACCES_LISTE(liste_initiale_des_Y,numero_des_points),minimum_des_Y)); EGAL(maximum_des_Y,MAX2(ACCES_LISTE(liste_initiale_des_Y,numero_des_points),maximum_des_Y)); EGAL(minimum_des_Z,MIN2(ACCES_LISTE(liste_initiale_des_Z,numero_des_points),minimum_des_Z)); EGAL(maximum_des_Z,MAX2(ACCES_LISTE(liste_initiale_des_Z,numero_des_points),maximum_des_Z)); /* Calcul des extrema specifiques a 'X', 'Y' et 'Z'. */ Eblock EKom EGAL(minimum_des_XYZ,MIN3(minimum_des_X,minimum_des_Y,minimum_des_Z)); EGAL(maximum_des_XYZ,MAX3(maximum_des_X,maximum_des_Y,maximum_des_Z)); /* Calcul des extrema globaux... */ Test(IFLT(minimum_des_XYZ,maximum_des_XYZ)) Bblock FACTEUR_D_HOMOTHETIE_XYZ(facteur_d_homothetie_de_la_coordonnee_X ,minimum_des_XYZ,maximum_des_XYZ ,minimum_des_X,maximum_des_X ,MINIMUM_DES___X,MAXIMUM_DES___X ); CONSTANTE_DE_TRANSLATION_XYZ(constante_de_translation_de_la_coordonnee_X ,minimum_des_XYZ,maximum_des_XYZ ,minimum_des_X,maximum_des_X ,MINIMUM_DES___X,MAXIMUM_DES___X ); /* Ajustement des coordonnees 'X'. */ FACTEUR_D_HOMOTHETIE_XYZ(facteur_d_homothetie_de_la_coordonnee_Y ,minimum_des_XYZ,maximum_des_XYZ ,minimum_des_Y,maximum_des_Y ,MINIMUM_DES___Y,MAXIMUM_DES___Y ); CONSTANTE_DE_TRANSLATION_XYZ(constante_de_translation_de_la_coordonnee_Y ,minimum_des_XYZ,maximum_des_XYZ ,minimum_des_Y,maximum_des_Y ,MINIMUM_DES___Y,MAXIMUM_DES___Y ); /* Ajustement des coordonnees 'Y'. */ FACTEUR_D_HOMOTHETIE_XYZ(facteur_d_homothetie_de_la_coordonnee_Z ,minimum_des_XYZ,maximum_des_XYZ ,minimum_des_Z,maximum_des_Z ,MINIMUM_DES___Z,MAXIMUM_DES___Z ); CONSTANTE_DE_TRANSLATION_XYZ(constante_de_translation_de_la_coordonnee_Z ,minimum_des_XYZ,maximum_des_XYZ ,minimum_des_Z,maximum_des_Z ,MINIMUM_DES___Z,MAXIMUM_DES___Z ); /* Ajustement des coordonnees 'Z'. */ Eblock ATes Bblock PRINT_ATTENTION("les extrema des coordonnees sont egaux ou 'inverses', les valeurs par defaut sont conservees"); Eblock ETes Test(IL_FAUT(lister_l_ajustement_des_coordonnees_cartesiennes)) Bblock /* ATTENTION : le 20020331121348, je suis passe de 'CAL2(Prin?(...))' a 'CAL3(Prme?(...))' */ /* pour faciliter la mise au point des parametres de 'v $xu/Felici.M/GenImages.01$Z'... */ CALS(Fsauts_de_lignes(UN)); CAL3(Prme2("X E [%+f,%+f]\n",minimum_des_X,maximum_des_X)); CAL3(Prme2("Y E [%+f,%+f]\n",minimum_des_Y,maximum_des_Y)); CAL3(Prme2("Z E [%+f,%+f]\n",minimum_des_Z,maximum_des_Z)); CALS(Fsauts_de_lignes(UN)); CAL3(Prme2("(X,Y,Z) E [%+f,%+f]\n",minimum_des_XYZ,maximum_des_XYZ)); CAL3(Prme1("AX=%+f\n",facteur_d_homothetie_de_la_coordonnee_X)); CAL3(Prme1("BX=%+f\n",constante_de_translation_de_la_coordonnee_X)); CAL3(Prme1("AY=%+f\n",facteur_d_homothetie_de_la_coordonnee_Y)); CAL3(Prme1("BY=%+f\n",constante_de_translation_de_la_coordonnee_Y)); CAL3(Prme1("AZ=%+f\n",facteur_d_homothetie_de_la_coordonnee_Z)); CAL3(Prme1("BZ=%+f\n",constante_de_translation_de_la_coordonnee_Z)); CALS(Fsauts_de_lignes(UN)); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock PRINT_ATTENTION("l'ajustement automatique des coordonnees ne peut avoir lieu qu'en coordonnees cartesiennes"); Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_FAUT(ajuster_automatiquement_les_couleurs)) /* Sequence introduite le 20091024085314... */ Bblock DEFV(genere_Float,INIT(minimum_des_ROUGE,F_INFINI)); DEFV(genere_Float,INIT(maximum_des_ROUGE,F_MOINS_L_INFINI)); DEFV(genere_Float,INIT(minimum_des_VERTE,F_INFINI)); DEFV(genere_Float,INIT(maximum_des_VERTE,F_MOINS_L_INFINI)); DEFV(genere_Float,INIT(minimum_des_BLEUE,F_INFINI)); DEFV(genere_Float,INIT(maximum_des_BLEUE,F_MOINS_L_INFINI)); DEFV(genere_Float,INIT(minimum_des_RVB,FLOT__NIVEAU_UNDEF)); DEFV(genere_Float,INIT(maximum_des_RVB,FLOT__NIVEAU_UNDEF)); /* Pour calculer les extrema... */ /* */ /* Le 20091026102351, les 'Float's ont ete remplaces par des 'genere_Float's plus logiques. */ Komp(numero_des_points,nombre_d_iterations) Bblock EGAL(minimum_des_ROUGE,MIN2(ACCES_LISTE(liste_initiale_des_ROUGE,numero_des_points),minimum_des_ROUGE)); EGAL(maximum_des_ROUGE,MAX2(ACCES_LISTE(liste_initiale_des_ROUGE,numero_des_points),maximum_des_ROUGE)); EGAL(minimum_des_VERTE,MIN2(ACCES_LISTE(liste_initiale_des_VERTE,numero_des_points),minimum_des_VERTE)); EGAL(maximum_des_VERTE,MAX2(ACCES_LISTE(liste_initiale_des_VERTE,numero_des_points),maximum_des_VERTE)); EGAL(minimum_des_BLEUE,MIN2(ACCES_LISTE(liste_initiale_des_BLEUE,numero_des_points),minimum_des_BLEUE)); EGAL(maximum_des_BLEUE,MAX2(ACCES_LISTE(liste_initiale_des_BLEUE,numero_des_points),maximum_des_BLEUE)); /* Calcul des extrema specifiques a 'X', 'Y' et 'Z'. */ Eblock EKom EGAL(minimum_des_RVB,MIN3(minimum_des_ROUGE,minimum_des_VERTE,minimum_des_BLEUE)); EGAL(maximum_des_RVB,MAX3(maximum_des_ROUGE,maximum_des_VERTE,maximum_des_BLEUE)); /* Calcul des extrema globaux... */ Test(IFLT(minimum_des_RVB,maximum_des_RVB)) Bblock FACTEUR_D_HOMOTHETIE_RVB(facteur_d_homothetie_de_la_couleur_ROUGE ,minimum_des_RVB,maximum_des_RVB ,minimum_des_ROUGE,maximum_des_ROUGE ,MINIMUM_DES___ROUGE,MAXIMUM_DES___ROUGE ); CONSTANTE_DE_TRANSLATION_RVB(constante_de_translation_de_la_couleur_ROUGE ,minimum_des_RVB,maximum_des_RVB ,minimum_des_ROUGE,maximum_des_ROUGE ,MINIMUM_DES___ROUGE,MAXIMUM_DES___ROUGE ); /* Ajustement des couleurs 'ROUGE'. */ FACTEUR_D_HOMOTHETIE_RVB(facteur_d_homothetie_de_la_couleur_VERTE ,minimum_des_RVB,maximum_des_RVB ,minimum_des_VERTE,maximum_des_VERTE ,MINIMUM_DES___VERTE,MAXIMUM_DES___VERTE ); CONSTANTE_DE_TRANSLATION_RVB(constante_de_translation_de_la_couleur_VERTE ,minimum_des_RVB,maximum_des_RVB ,minimum_des_VERTE,maximum_des_VERTE ,MINIMUM_DES___VERTE,MAXIMUM_DES___VERTE ); /* Ajustement des couleurs 'VERTE'. */ FACTEUR_D_HOMOTHETIE_RVB(facteur_d_homothetie_de_la_couleur_BLEUE ,minimum_des_RVB,maximum_des_RVB ,minimum_des_BLEUE,maximum_des_BLEUE ,MINIMUM_DES___BLEUE,MAXIMUM_DES___BLEUE ); CONSTANTE_DE_TRANSLATION_RVB(constante_de_translation_de_la_couleur_BLEUE ,minimum_des_RVB,maximum_des_RVB ,minimum_des_BLEUE,maximum_des_BLEUE ,MINIMUM_DES___BLEUE,MAXIMUM_DES___BLEUE ); /* Ajustement des couleurs 'BLEUE'. */ Eblock ATes Bblock PRINT_ATTENTION("les extrema des couleurs sont egaux ou 'inverses', les valeurs par defaut sont conservees"); Eblock ETes Test(IL_FAUT(lister_l_ajustement_des_couleurs)) Bblock CALS(Fsauts_de_lignes(UN)); CAL3(Prme2("R E [%+f,%+f]\n",minimum_des_ROUGE,maximum_des_ROUGE)); CAL3(Prme2("V E [%+f,%+f]\n",minimum_des_VERTE,maximum_des_VERTE)); CAL3(Prme2("B E [%+f,%+f]\n",minimum_des_BLEUE,maximum_des_BLEUE)); CALS(Fsauts_de_lignes(UN)); CAL3(Prme2("(R,V,B) E [%+f,%+f]\n",minimum_des_RVB,maximum_des_RVB)); CAL3(Prme1("AR=%+f\n",facteur_d_homothetie_de_la_couleur_ROUGE)); CAL3(Prme1("BR=%+f\n",constante_de_translation_de_la_couleur_ROUGE)); CAL3(Prme1("AV=%+f\n",facteur_d_homothetie_de_la_couleur_VERTE)); CAL3(Prme1("BV=%+f\n",constante_de_translation_de_la_couleur_VERTE)); CAL3(Prme1("AB=%+f\n",facteur_d_homothetie_de_la_couleur_BLEUE)); CAL3(Prme1("BB=%+f\n",constante_de_translation_de_la_couleur_BLEUE)); CALS(Fsauts_de_lignes(UN)); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Komp(numero_des_points,nombre_d_iterations) Bblock EGAL(ACCES_LISTE(liste_initiale_des_X,numero_des_points) ,AXPB(facteur_d_homothetie_des_coordonnees ,AXPB(facteur_d_homothetie_de_la_coordonnee_X ,ADD2(ACCES_LISTE(liste_initiale_des_X,numero_des_points) ,ACCES_LISTE(liste_initiale_des_tX,numero_des_points) ) ,constante_de_translation_de_la_coordonnee_X ) ,constante_de_translation_des_coordonnees ) ); EGAL(ACCES_LISTE(liste_initiale_des_Y,numero_des_points) ,AXPB(facteur_d_homothetie_des_coordonnees ,AXPB(facteur_d_homothetie_de_la_coordonnee_Y ,ADD2(ACCES_LISTE(liste_initiale_des_Y,numero_des_points) ,ACCES_LISTE(liste_initiale_des_tY,numero_des_points) ) ,constante_de_translation_de_la_coordonnee_Y ) ,constante_de_translation_des_coordonnees ) ); EGAL(ACCES_LISTE(liste_initiale_des_Z,numero_des_points) ,AXPB(facteur_d_homothetie_des_coordonnees ,AXPB(facteur_d_homothetie_de_la_coordonnee_Z ,ADD2(ACCES_LISTE(liste_initiale_des_Z,numero_des_points) ,ACCES_LISTE(liste_initiale_des_tZ,numero_des_points) ) ,constante_de_translation_de_la_coordonnee_Z ) ,constante_de_translation_des_coordonnees ) ); /* Ajustement definitif des coordonnees. */ EGAL(ACCES_LISTE(liste_initiale_des_dX,numero_des_points) ,AXPB(facteur_d_homothetie_des_derivees ,AXPB(facteur_d_homothetie_de_la_derivee_X ,ACCES_LISTE(liste_initiale_des_dX,numero_des_points) ,constante_de_translation_de_la_derivee_X ) ,constante_de_translation_des_derivees ) ); EGAL(ACCES_LISTE(liste_initiale_des_dY,numero_des_points) ,AXPB(facteur_d_homothetie_des_derivees ,AXPB(facteur_d_homothetie_de_la_derivee_Y ,ACCES_LISTE(liste_initiale_des_dY,numero_des_points) ,constante_de_translation_de_la_derivee_Y ) ,constante_de_translation_des_derivees ) ); EGAL(ACCES_LISTE(liste_initiale_des_dZ,numero_des_points) ,AXPB(facteur_d_homothetie_des_derivees ,AXPB(facteur_d_homothetie_de_la_derivee_Z ,ACCES_LISTE(liste_initiale_des_dZ,numero_des_points) ,constante_de_translation_de_la_derivee_Z ) ,constante_de_translation_des_derivees ) ); /* Ajustement definitif des derivees. */ EGAL(ACCES_LISTE(liste_initiale_des_ROUGE,numero_des_points) ,______NORMALISE_NIVEAU(AXPB(facteur_d_homothetie_des_couleurs ,AXPB(facteur_d_homothetie_de_la_couleur_ROUGE ,ACCES_LISTE(liste_initiale_des_ROUGE,numero_des_points) ,constante_de_translation_de_la_couleur_ROUGE ) ,constante_de_translation_des_couleurs ) ) ); EGAL(ACCES_LISTE(liste_initiale_des_VERTE,numero_des_points) ,______NORMALISE_NIVEAU(AXPB(facteur_d_homothetie_des_couleurs ,AXPB(facteur_d_homothetie_de_la_couleur_VERTE ,ACCES_LISTE(liste_initiale_des_VERTE,numero_des_points) ,constante_de_translation_de_la_couleur_VERTE ) ,constante_de_translation_des_couleurs ) ) ); EGAL(ACCES_LISTE(liste_initiale_des_BLEUE,numero_des_points) ,______NORMALISE_NIVEAU(AXPB(facteur_d_homothetie_des_couleurs ,AXPB(facteur_d_homothetie_de_la_couleur_BLEUE ,ACCES_LISTE(liste_initiale_des_BLEUE,numero_des_points) ,constante_de_translation_de_la_couleur_BLEUE ) ,constante_de_translation_des_couleurs ) ) ); /* Ajustement definitif des couleurs. */ EGAL(ACCES_LISTE(liste_initiale_des_RAYON,numero_des_points) ,AXPB(facteur_d_homothetie_du_rayon ,ACCES_LISTE(liste_initiale_des_RAYON,numero_des_points) ,constante_de_translation_du_rayon ) ); /* Ajustement definitif des rayons. */ Eblock EKom Test(IL_FAUT(compatibilite_20171123)) Bblock Eblock ATes Bblock EGAL(rayon_de_visualisation_point_de_jonction ,AXPB(facteur_d_homothetie_du_rayon ,rayon_de_visualisation_point_de_jonction ,constante_de_translation_du_rayon ) ); /* Ajustement definitif de l'eventuel rayon du point de jonction (introduit le */ /* 20171123123513 et cela manquait depuis bien longtemps..). */ Eblock ETes Komp(numero_des_points,nombre_d_iterations) Bblock EGAL(ACCES_LISTE(liste_initiale_des_X,numero_des_points) ,MUL2(super_facteur_d_homothetie_de_la_coordonnee_X,ACCES_LISTE(liste_initiale_des_X,numero_des_points)) ); EGAL(ACCES_LISTE(liste_initiale_des_Y,numero_des_points) ,MUL2(super_facteur_d_homothetie_de_la_coordonnee_Y,ACCES_LISTE(liste_initiale_des_Y,numero_des_points)) ); EGAL(ACCES_LISTE(liste_initiale_des_Z,numero_des_points) ,MUL2(super_facteur_d_homothetie_de_la_coordonnee_Z,ACCES_LISTE(liste_initiale_des_Z,numero_des_points)) ); /* Mise a l'echelle des coordonnees introduite le 20051220135738. Le 20051220214952, je */ /* note qu'il est impossible d'utiliser ici 'SUPER_ECHELLE_O?(...)' car, en effet, les */ /* procedures 'ANTI_SUPER_ECHELLE_O?(...)', complementaires des precedentes, sont utilisees */ /* dans la fonction 'memorisation_1_point_07(...)' via 'MEMORISATION_DU_POINT_COURANT(...)' */ /* et annuleraient ainsi leurs effets... */ Eblock EKom RE_INITIALISATION_DE_L_HORLOGE; /* Depuis que le 19990512152305 a ete mis en place un : */ /* */ /* INCREMENTATION_DE_L_HORLOGE(dct); */ /* */ /* apres chaque image, l'initialisation de l'horloge ne doit plus etre faite pour chaque */ /* image, mais une seul fois, au tout debut... */ Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation) Bblock DEFV(Int,INIT(numero_des_points,UNDEF)); /* Pour manipuler les listes... */ DEFV(Float,INIT(Acx,FLOT__UNDEF)); DEFV(Float,INIT(Acy,FLOT__UNDEF)); DEFV(Float,INIT(Acz,FLOT__UNDEF)); DEFV(Float,INIT(Adx,FLOT__UNDEF)); DEFV(Float,INIT(Ady,FLOT__UNDEF)); DEFV(Float,INIT(Adz,FLOT__UNDEF)); DEFV(Float,INIT(Adcx,FLOT__UNDEF)); DEFV(Float,INIT(Adcy,FLOT__UNDEF)); DEFV(Float,INIT(Adcz,FLOT__UNDEF)); DEFV(Float,INIT(Arayon_de_visualisation,FLOT__UNDEF)); /* Pour sauvegarder les caracteristiques du point 'A' : */ /* */ /* {Acx,Acy,Acz} : coordonnees du point 'A', */ /* {Adx,Ady,Adz} : derivees au point 'A' dans le cas de l'interpolation cubique, */ /* {Adcx,Adcy,Adcz} : couleur du point 'A'. */ /* */ DEFV(Float,INIT(Bcx,FLOT__UNDEF)); DEFV(Float,INIT(Bcy,FLOT__UNDEF)); DEFV(Float,INIT(Bcz,FLOT__UNDEF)); DEFV(Float,INIT(Bdx,FLOT__UNDEF)); DEFV(Float,INIT(Bdy,FLOT__UNDEF)); DEFV(Float,INIT(Bdz,FLOT__UNDEF)); DEFV(Float,INIT(Bdcx,FLOT__UNDEF)); DEFV(Float,INIT(Bdcy,FLOT__UNDEF)); DEFV(Float,INIT(Bdcz,FLOT__UNDEF)); DEFV(Float,INIT(Brayon_de_visualisation,FLOT__UNDEF)); /* Pour sauvegarder les caracteristiques du point 'B' : */ /* */ /* {Bcx,Bcy,Bcz} : coordonnees du point 'B', */ /* {Bdx,Bdy,Bdz} : derivees au point 'B' dans le cas de l'interpolation cubique, */ /* {Bdcx,Bdcy,Bdcz} : couleur du point 'B'. */ /* */ DEFV(Logical,INIT(visualiser_le_point_courant,COND(IL_FAUT(generer_des_points_isoles),VRAI,FAUX))); /* Indique si le point courant de la boucle qui suit est a visualiser... */ /* ATTENTION, jusqu'au 19990512152305, il y avait ici : */ /* */ /* RE_INITIALISATION_DE_L_HORLOGE; */ /* */ /* mais, depuis que l'on fait apres chaque image : */ /* */ /* INCREMENTATION_DE_L_HORLOGE(dct); */ /* */ /* cette initialisation n'a plus de sens... */ INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante); /* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image. */ Komp(numero_des_points ,COND(EST_FAUX(le_dernier_point_est_le_premier_point) ,NEUT(nombre_d_iterations) ,SUCC(nombre_d_iterations) ) ) Bblock DEFV(Int,INIT(numero_effectif_des_points ,COND(EST_FAUX(le_dernier_point_est_le_premier_point) ,NEUT(numero_des_points) ,MODU(numero_des_points,PREMIERE_ITERATION_D_UN_Komp,nombre_d_iterations) ) ) ); /* Introduit le 20060808110301... */ DEFV(Float,INIT(dx,FLOT__UNDEF)); DEFV(Float,INIT(dy,FLOT__UNDEF)); DEFV(Float,INIT(dz,FLOT__UNDEF)); /* Pour manipuler les derivees utiles lors des interpolations cubiques... */ Test(IL_FAUT(utiliser_les_coordonnees_cartesiennes)) Bblock DEFV(Float,INIT(cx_eventuellement_decentree,FLOT__UNDEF)); DEFV(Float,INIT(cy_eventuellement_decentree,FLOT__UNDEF)); DEFV(Float,INIT(cz_eventuellement_decentree,FLOT__UNDEF)); /* Coordonnees eventuellement decentrees... */ EGAL(cx,ACCES_LISTE(liste_initiale_des_X,numero_effectif_des_points)); EGAL(cy,ACCES_LISTE(liste_initiale_des_Y,numero_effectif_des_points)); EGAL(cz,ACCES_LISTE(liste_initiale_des_Z,numero_effectif_des_points)); /* Recuperation du point courant (cx,cy,cz) en coordonnees cartesiennes. */ EGAL(cx_eventuellement_decentree,DECENTRAGE_DES_COORDONNEES(cx,X,x)); EGAL(cy_eventuellement_decentree,DECENTRAGE_DES_COORDONNEES(cy,Y,y)); EGAL(cz_eventuellement_decentree,DECENTRAGE_DES_COORDONNEES(cz,Z,z)); EGAL(cx,cx_eventuellement_decentree); EGAL(cy,cy_eventuellement_decentree); EGAL(cz,cz_eventuellement_decentree); /* Et decentrage eventuel... */ Eblock ATes Bblock DEFV(Float,INIT(rho,ACCES_LISTE(liste_initiale_des_RHO,numero_effectif_des_points))); DEFV(Float,INIT(theta,ACCES_LISTE(liste_initiale_des_THETA,numero_effectif_des_points))); DEFV(Float,INIT(phi,ACCES_LISTE(liste_initiale_des_PHI,numero_effectif_des_points))); /* Recuperation du point courant (cx,cy,cz) en coordonnees spheriques. */ EGAL(rho,AXPB(facteur_d_homothetie_de_la_coordonnee_RHO,rho,constante_de_translation_de_la_coordonnee_RHO)); EGAL(theta,AXPB(facteur_d_homothetie_de_la_coordonnee_THETA,theta,constante_de_translation_de_la_coordonnee_THETA)); EGAL(phi,AXPB(facteur_d_homothetie_de_la_coordonnee_PHI,phi,constante_de_translation_de_la_coordonnee_PHI)); /* Puis "homothetie"... */ Test(IL_NE_FAUT_PAS(utiliser_les_coordonnees_spheriques_etendues)) /* Test introduit le 20150602113353... */ Bblock EGAL(cx,Xcartesienne_3D(rho,phi,theta)); EGAL(cy,Ycartesienne_3D(rho,phi,theta)); EGAL(cz,Zcartesienne_3D(rho,phi,theta)); /* Et conversion en coordonnees cartesiennes. */ /* */ /* On notera que cela equivaut a l'equation de la sphere : */ /* */ /* */ /* F (theta,phi) = rho.sin(theta).cos(phi) */ /* x */ /* */ /* F (theta,phi) = rho.sin(theta).sin(phi) */ /* y */ /* */ /* F (theta,phi) = rho.cos(theta) */ /* z */ /* */ /* avec : */ /* */ /* theta E [ 0 , pi ] */ /* */ /* phi E [ 0 , 2.pi ] */ /* */ Eblock ATes Bblock /* On rappelle les correspondances : */ /* */ /* u <--> theta */ /* v <--> phi */ /* */ Choi(numero_de_l_extension_des_coordonnees_spheriques) Bblock Ca1e(EXTENSION_ellipsoid) Bblock #define parametre_a \ rho #define parametre_b \ extension_des_coordonnees_spheriques_parametre_01 #define parametre_c \ extension_des_coordonnees_spheriques_parametre_02 /* Equation de l'ellipsoide : */ /* */ /* */ /* F (theta,phi) = rho.sin(theta).cos(phi) */ /* x */ /* */ /* F (theta,phi) = P01.sin(theta).sin(phi) */ /* y */ /* */ /* F (theta,phi) = P02.cos(theta) */ /* z */ /* */ /* avec : */ /* */ /* theta E [ 0 , pi ] */ /* */ /* phi E [ 0 , 2.pi ] */ /* */ EGAL(cx,Fx_Ellipsoide_1(theta,phi)); EGAL(cy,Fy_Ellipsoide_1(theta,phi)); EGAL(cz,Fz_Ellipsoide_1(theta,phi)); /* Et conversion en coordonnees cartesiennes. */ #undef parametre_c #undef parametre_b #undef parametre_a Eblock ECa1 Ca1e(EXTENSION_hyperboloid) Bblock #define parametre_a \ rho #define parametre_b \ extension_des_coordonnees_spheriques_parametre_01 #define parametre_c \ extension_des_coordonnees_spheriques_parametre_02 /* Equation de l'hyperboloide : */ /* */ /* */ /* F (theta,phi) = rho.ch(theta).cos(phi) */ /* x */ /* */ /* F (theta,phi) = P01.ch(theta).sin(phi) */ /* y */ /* */ /* F (theta,phi) = P02.sh(theta) */ /* z */ /* */ /* avec : */ /* */ /* theta E ] -infini , +infini [ */ /* */ /* phi E [ 0 , 2.pi ] */ /* */ EGAL(cx,Fx_Hyperboloide_1(theta,phi)); EGAL(cy,Fy_Hyperboloide_1(theta,phi)); EGAL(cz,Fz_Hyperboloide_1(theta,phi)); /* Et conversion en coordonnees cartesiennes. */ #undef parametre_c #undef parametre_b #undef parametre_a Eblock ECa1 Ca1e(EXTENSION_cylindre) Bblock #define parametre_r \ rho /* Equation du cylindre : */ /* */ /* */ /* F (theta,phi) = rho.cos(phi) */ /* x */ /* */ /* F (theta,phi) = rho.sin(phi) */ /* y */ /* */ /* F (theta,phi) = theta */ /* z */ /* */ /* avec : */ /* */ /* theta E [ -1 , +1 ] */ /* */ /* phi E [ 0 , 2.pi ] */ /* */ EGAL(cx,Fx_Cylindre_1(theta,phi)); EGAL(cy,Fy_Cylindre_1(theta,phi)); EGAL(cz,Fz_Cylindre_1(theta,phi)); /* Et conversion en coordonnees cartesiennes. */ #undef parametre_r Eblock ECa1 Ca1e(EXTENSION_tore) Bblock #define parametre_R1 \ extension_des_coordonnees_spheriques_parametre_01 #define parametre_R2 \ rho /* Equation du tore : */ /* */ /* */ /* F (theta,phi) = [P01+rho.cos(theta)].cos(phi) */ /* x */ /* */ /* F (theta,phi) = [P01+rho.cos(theta)].sin(phi) */ /* y */ /* */ /* F (theta,phi) = rho.sin(theta) */ /* z */ /* */ /* avec : */ /* */ /* theta E [ 0 , 2.pi ] */ /* */ /* phi E [ 0 , 2.pi ] */ /* */ /* */ /* Ainsi, la coordonnee 'theta' decrit le petit cercle (de rayon 'rho') et 'phi' decrit le */ /* grand cercle (de rayon 'P01'). */ EGAL(cx,Fx_Tore_1(theta,phi)); EGAL(cy,Fy_Tore_1(theta,phi)); EGAL(cz,Fz_Tore_1(theta,phi)); /* Et conversion en coordonnees cartesiennes. */ #undef parametre_R2 #undef parametre_R1 Eblock ECa1 Ca1e(EXTENSION_Mobius2D) Bblock #define parametre_a \ rho #define parametre_b \ extension_des_coordonnees_spheriques_parametre_01 #define parametre_c \ extension_des_coordonnees_spheriques_parametre_02 #define parametre_d \ extension_des_coordonnees_spheriques_parametre_03 #define parametre_e \ extension_des_coordonnees_spheriques_parametre_04 #define parametre_f \ extension_des_coordonnees_spheriques_parametre_05 /* Equation du ruban de Mobius : */ /* */ /* */ /* F (theta,phi) = BARY[rho.cos(theta)+P03,(rho-P01).cos(2.theta)+P03+P04,phi] */ /* x */ /* */ /* F (theta,phi) = BARY[rho.sin(theta)+P03,(rho-P01).sin(2.theta)+P03,phi] */ /* y */ /* */ /* theta pi theta pi */ /* F (theta,phi) = BARY[P02.sin(------ - ----)+P05,P02.sin(------- + ----)+P05,phi] */ /* z 2 2 2 2 */ /* */ /* avec : */ /* */ /* theta E [ 0 , 2.pi ] */ /* */ /* phi E [ 0 , 1 ] */ /* */ EGAL(cx,Fx_Mobius2D_1(theta,phi)); EGAL(cy,Fy_Mobius2D_1(theta,phi)); EGAL(cz,Fz_Mobius2D_1(theta,phi)); /* Et conversion en coordonnees cartesiennes. */ #undef parametre_f #undef parametre_e #undef parametre_d #undef parametre_c #undef parametre_b #undef parametre_a Eblock ECa1 Ca1e(EXTENSION_project2D) Bblock #define Image_Fx_amplificateur \ MUL2(rho,A_Image_Fx) #define Image_Fy_amplificateur \ MUL2(rho,A_Image_Fy) #define Image_Fz_amplificateur \ MUL2(rho,A_Image_Fz) #define Image_Fx_translateur \ B_Image_Fx #define Image_Fy_translateur \ B_Image_Fy #define Image_Fz_translateur \ B_Image_Fz /* Equation de la projection : */ /* */ /* */ /* F (theta,phi) = [rho.A .ImageX(u,v)] + T */ /* x x x */ /* */ /* F (theta,phi) = [rho.A .ImageY(u,v)] + T */ /* y y y */ /* */ /* F (theta,phi) = [rho.A .ImageZ(u,v)] + T */ /* z z z */ /* */ /* avec : */ /* */ /* theta E [ 0 , 1 ] */ /* */ /* phi E [ 0 , 1 ] */ /* */ DEFV(Float,INIT(theta_effectif ,NORM(TRON(theta,minimum_de_u_theta,maximum_de_u_theta) ,minimum_de_u_theta ,maximum_de_u_theta ) ) ); DEFV(Float,INIT(phi_effectif ,NORM(TRON(phi,minimum_de_v_phi,maximum_de_v_phi) ,minimum_de_v_phi ,maximum_de_v_phi ) ) ); /* Cette normalisation est destinee a faciliter des utilisations compatibles a */ /* 'v $xrs/surfaces.12$I u_NORMALISEE'... */ EGAL(cx,Fx_Projector2D_1(theta_effectif,phi_effectif)); EGAL(cy,Fy_Projector2D_1(theta_effectif,phi_effectif)); EGAL(cz,Fz_Projector2D_1(theta_effectif,phi_effectif)); /* Et conversion en coordonnees cartesiennes. */ #undef Image_Fz_translateur #undef Image_Fy_translateur #undef Image_Fx_translateur #undef Image_Fz_amplificateur #undef Image_Fy_amplificateur #undef Image_Fx_amplificateur Eblock ECa1 Defo Bblock PRINT_ATTENTION("l'extension des cordonnees spheriques demandee n'existe pas -1-"); CAL1(Prer1("cette extension a le numero %d\n",numero_de_l_extension_des_coordonnees_spheriques)); EGAL(cx,Xcartesienne_3D(rho,phi,theta)); EGAL(cy,Ycartesienne_3D(rho,phi,theta)); EGAL(cz,Zcartesienne_3D(rho,phi,theta)); /* Et conversion en coordonnees cartesiennes. */ Eblock EDef Eblock ECho Eblock ETes EGAL(cx ,AXPB(facteur_d_homothetie_des_coordonnees ,AXPB(facteur_d_homothetie_de_la_coordonnee_X ,ADD2(cx ,ACCES_LISTE(liste_initiale_des_tX,numero_effectif_des_points) ) ,constante_de_translation_de_la_coordonnee_X ) ,constante_de_translation_des_coordonnees ) ); EGAL(cy ,AXPB(facteur_d_homothetie_des_coordonnees ,AXPB(facteur_d_homothetie_de_la_coordonnee_Y ,ADD2(cy ,ACCES_LISTE(liste_initiale_des_tY,numero_effectif_des_points) ) ,constante_de_translation_de_la_coordonnee_Y ) ,constante_de_translation_des_coordonnees ) ); EGAL(cz ,AXPB(facteur_d_homothetie_des_coordonnees ,AXPB(facteur_d_homothetie_de_la_coordonnee_Z ,ADD2(cz ,ACCES_LISTE(liste_initiale_des_tZ,numero_effectif_des_points) ) ,constante_de_translation_de_la_coordonnee_Z ) ,constante_de_translation_des_coordonnees ) ); /* Mise du point courant (cx,cy,cz) dans le bon systeme de coordonnees... */ Test(IL_FAUT(compatibilite_20211211)) /* Test introduit le 20211211115613... */ Bblock Eblock ATes Bblock /* Cette possibilite introduite le 20211211115613 permet d'outrepasser 'cx' et/ou 'cy' */ /* et/ou 'cz' calculees en coordonnees spheriques, avec les eventuelles listes cartesiennes */ /* si elles sont presentes... */ Test(IFNE_chaine(fichier_LISTE_X,NOM_PIPE_Local)) Bblock EGAL(cx,ACCES_LISTE(liste_initiale_des_X,numero_effectif_des_points)); Eblock ATes Bblock Eblock ETes Test(IFNE_chaine(fichier_LISTE_Y,NOM_PIPE_Local)) Bblock EGAL(cy,ACCES_LISTE(liste_initiale_des_Y,numero_effectif_des_points)); Eblock ATes Bblock Eblock ETes Test(IFNE_chaine(fichier_LISTE_Z,NOM_PIPE_Local)) Bblock EGAL(cz,ACCES_LISTE(liste_initiale_des_Z,numero_effectif_des_points)); Eblock ATes Bblock Eblock ETes Eblock ETes Eblock ETes EGAL(dx,ACCES_LISTE(liste_initiale_des_dX,numero_effectif_des_points)); EGAL(dy,ACCES_LISTE(liste_initiale_des_dY,numero_effectif_des_points)); EGAL(dz,ACCES_LISTE(liste_initiale_des_dZ,numero_effectif_des_points)); /* Recuperation des derivees {dx,dy,dz} au point courant. */ Test(IL_FAUT(calculer_automatiquement_les_derivees_par_des_differences)) Bblock /* Test introduit le 20060809124105... */ EGAL(dx ,MUL2(dx ,SOUS(ACCES_LISTE(liste_initiale_des_X ,MODU(SUCC(numero_effectif_des_points),PREMIERE_ITERATION_D_UN_Komp,nombre_d_iterations) ) ,ACCES_LISTE(liste_initiale_des_X ,MODU(PRED(numero_effectif_des_points),PREMIERE_ITERATION_D_UN_Komp,nombre_d_iterations) ) ) ) ); EGAL(dy ,MUL2(dy ,SOUS(ACCES_LISTE(liste_initiale_des_Y ,MODU(SUCC(numero_effectif_des_points),PREMIERE_ITERATION_D_UN_Komp,nombre_d_iterations) ) ,ACCES_LISTE(liste_initiale_des_Y ,MODU(PRED(numero_effectif_des_points),PREMIERE_ITERATION_D_UN_Komp,nombre_d_iterations) ) ) ) ); EGAL(dz ,MUL2(dz ,SOUS(ACCES_LISTE(liste_initiale_des_Z ,MODU(SUCC(numero_effectif_des_points),PREMIERE_ITERATION_D_UN_Komp,nombre_d_iterations) ) ,ACCES_LISTE(liste_initiale_des_Z ,MODU(PRED(numero_effectif_des_points),PREMIERE_ITERATION_D_UN_Komp,nombre_d_iterations) ) ) ) ); /* Calcul automatique des derivees au point 'N' par des differences finies des coordonnees */ /* aux points 'N-1' et 'N+1'... */ Eblock ATes Bblock Eblock ETes EGAL(dcx,ACCES_LISTE(liste_initiale_des_ROUGE,numero_effectif_des_points)); EGAL(dcy,ACCES_LISTE(liste_initiale_des_VERTE,numero_effectif_des_points)); EGAL(dcz,ACCES_LISTE(liste_initiale_des_BLEUE,numero_effectif_des_points)); /* Recuperation des couleurs (dcx,dcy,dcz) au point courant. */ Test(IFNE_chaine(fichier_LISTE_RAYON,NOM_PIPE_Local)) Bblock EGAL(rayon_de_visualisation ,RAYON_DES_SPHERES_REPRESENTATIVES(FU ,ACCES_LISTE(liste_initiale_des_RAYON,numero_effectif_des_points) ) ); /* Recuperation eventuelle du rayon de chaque point... */ Eblock ATes Bblock Test(IFET(IFEQ(numero_de_la_periode_courante_de_la_simulation,PREMIERE_ITERATION_D_UN_Komp) ,IFEQ(numero_des_points,PREMIERE_ITERATION_D_UN_Komp) ) ) Bblock EGAL(rayon_de_visualisation ,RAYON_DES_SPHERES_REPRESENTATIVES(FU ,AXPB(facteur_d_homothetie_du_rayon ,rayon_de_visualisation ,constante_de_translation_du_rayon ) ) ); /* Transformation du rayon lorsqu'il est commun a toutes les particules, mais cela n'etant */ /* fait qu'une seule fois evidemment... */ Eblock ATes Bblock Eblock ETes Eblock ETes Test(IL_FAUT(generer_des_points_isoles)) Bblock /* Cas de la visualisation de points isoles : */ Test(IL_NE_FAUT_PAS(joindre_a_un_corps_central)) Bblock CALS(memorisation_1_point_07(SOUS(cx,Xcentre_ESPACE) ,SOUS(cy,Ycentre_ESPACE) ,SOUS(cz,Zcentre_ESPACE) ,dcx ,dcy ,dcz ,numero_des_points ) ); /* Memorisation du point courant lors d'un trace de points isoles. */ Eblock ATes Bblock Test(IFET(IFEQ(numero_de_la_periode_courante_de_la_simulation,PREMIERE_ITERATION_D_UN_Komp) ,IFEQ(numero_des_points,PREMIERE_ITERATION_D_UN_Komp) ) ) Bblock EGAL(ROUGE_point_de_jonction ,POINT_DE_JONCTION(liste_initiale_des_ROUGE,______NORMALISE_NIVEAU(ROUGE_point_de_jonction)) ); EGAL(VERTE_point_de_jonction ,POINT_DE_JONCTION(liste_initiale_des_VERTE,______NORMALISE_NIVEAU(VERTE_point_de_jonction)) ); EGAL(BLEUE_point_de_jonction ,POINT_DE_JONCTION(liste_initiale_des_BLEUE,______NORMALISE_NIVEAU(BLEUE_point_de_jonction)) ); /* Normalisation des couleurs du point de jonction, mais cela n'etant fait qu'une seule */ /* fois evidemment. On notera qu'il ne faut surtout pas appliquer les differents facteurs */ /* d'homothetie et les constantes de translation aux coordonnees du point de jonction afin */ /* de le rendre autonome... */ Eblock ATes Bblock Eblock ETes EGAL(Acx,DECENTRAGE_DES_COORDONNEES(POINT_DE_JONCTION(liste_initiale_des_X,X_point_de_jonction),X,x)); EGAL(Acy,DECENTRAGE_DES_COORDONNEES(POINT_DE_JONCTION(liste_initiale_des_Y,Y_point_de_jonction),Y,y)); EGAL(Acz,DECENTRAGE_DES_COORDONNEES(POINT_DE_JONCTION(liste_initiale_des_Z,Z_point_de_jonction),Z,z)); EGAL(Adx,dx); EGAL(Ady,dy); EGAL(Adz,dz); EGAL(Adcx,ROUGE_point_de_jonction); EGAL(Adcy,VERTE_point_de_jonction); EGAL(Adcz,BLEUE_point_de_jonction); EGAL(Arayon_de_visualisation ,POINT_DE_JONCTION(liste_initiale_des_RAYON,rayon_de_visualisation_point_de_jonction) ); /* Memorisation du point 'A'... */ EGAL(Bcx,cx); EGAL(Bcy,cy); EGAL(Bcz,cz); EGAL(Bdx,dx); EGAL(Bdy,dy); EGAL(Bdz,dz); EGAL(Bdcx,dcx); EGAL(Bdcy,dcy); EGAL(Bdcz,dcz); EGAL(Brayon_de_visualisation,rayon_de_visualisation); /* Memorisation du point 'B'... */ VISUALISATION_D_UN_SEGMENT_VARIABLE(Acx,Acy,Acz ,Adcx,Adcy,Adcz ,Arayon_de_visualisation ,Bcx,Bcy,Bcz ,Bdcx,Bdcy,Bdcz ,Brayon_de_visualisation ,Adx,Ady,Adz ,Bdx,Bdy,Bdz ); /* Memorisation du point courant lors d'une jonction ; on notera que les derivees au point */ /* de jonction sont choisies egales a celles du point courant {dx,dy,dz} car il est */ /* difficile de faire mieux (en effet, il faudrait avoir un jeu de {dx,dy,dz} par point */ /* courant..). De plus, le passage par les points 'A' et 'B' intermediaires est rendu */ /* necessaire pour eviter des problemes de pre-processing avec les noms de certaines */ /* variables... */ Eblock ETes Eblock ATes Bblock /* Cas de la visualisation de couples de points : */ Test(IL_FAUT(visualiser_le_point_courant)) Bblock DEFV(Logical,INIT(tracer_le_segment_courant,VRAI)); /* A priori, le segment courant sera trace... */ EGAL(Bcx,cx); EGAL(Bcy,cy); EGAL(Bcz,cz); EGAL(Bdx,dx); EGAL(Bdy,dy); EGAL(Bdz,dz); EGAL(Bdcx,dcx); EGAL(Bdcy,dcy); EGAL(Bdcz,dcz); EGAL(Brayon_de_visualisation,rayon_de_visualisation); /* Memorisation du point 'B'... */ Test(IL_FAUT(filtrer_la_longueur_des_segments)) Bblock DEFV(Float,INIT(longueur_du_segment_courant,RdisF3D(Acx,Acy,Acz,Bcx,Bcy,Bcz))); Test(IFEXff(longueur_du_segment_courant ,borne_inferieure_de_la_longueur_des_segments ,borne_superieure_de_la_longueur_des_segments ) ) Bblock EGAL(tracer_le_segment_courant,FAUX); /* Un segment dont la longueur n'est pas dans [inf,sup] n'est pas trace (cette possibilite */ /* fut introduite le 20120806100234...). */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_FAUT(tracer_le_segment_courant)) Bblock VISUALISATION_D_UN_SEGMENT_VARIABLE(Acx,Acy,Acz ,Adcx,Adcy,Adcz ,Arayon_de_visualisation ,Bcx,Bcy,Bcz ,Bdcx,Bdcy,Bdcz ,Brayon_de_visualisation ,Adx,Ady,Adz ,Bdx,Bdy,Bdz ); /* Visualisation du segment 'AB'. */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(chainer_automatiquement_les_points)) Bblock EGAL(Acx,Bcx); EGAL(Acy,Bcy); EGAL(Acz,Bcz); EGAL(Adx,Bdx); EGAL(Ady,Bdy); EGAL(Adz,Bdz); EGAL(Adcx,Bdcx); EGAL(Adcy,Bdcy); EGAL(Adcz,Bdcz); EGAL(Arayon_de_visualisation,Brayon_de_visualisation); /* Memorisation du point 'A' qui est en fait le point 'B' courant... */ EGAL(visualiser_le_point_courant,NOTL(visualiser_le_point_courant)); /* Afin d'inverser dans ce cas ('IL_FAUT(chainer_automatiquement_les_points)') deux fois */ /* de suite 'visualiser_le_point_courant' et ce afin de ne plus positionner le point 'A' */ /* ci-apres... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock EGAL(Acx,cx); EGAL(Acy,cy); EGAL(Acz,cz); EGAL(Adx,dx); EGAL(Ady,dy); EGAL(Adz,dz); EGAL(Adcx,dcx); EGAL(Adcy,dcy); EGAL(Adcz,dcz); EGAL(Arayon_de_visualisation,rayon_de_visualisation); /* Memorisation du point 'A'... */ Eblock ETes EGAL(visualiser_le_point_courant,NOTL(visualiser_le_point_courant)); /* "Inversion" des conditions de visualisation... */ Eblock ETes RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; /* On notera que cette recherche n'est pas conditionnee par 'editer_les_extrema', car les */ /* extrema pourraient etre utilises pour la visualisation... */ Eblock EKom #include xrk/attractor.1A.I" VISUALISATION_DES_AXES_DE_COORDONNEES; /* Visualisation si necessaire des trois axes de coordonnees. */ GENERATION_D_UNE_IMAGE_ET_PASSAGE_A_LA_SUIVANTE(BLOC(VIDE;)); /* Generation de l'image courante... */ INCREMENTATION_DE_L_HORLOGE(dct); /* Simulation d'un temps arbitraire (introduit le 19990512094356). */ Eblock EKom EDITION_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; /* Edition facultative des extrema des coordonnees et des derivees. */ RETU_Commande; Eblock ECommande