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