/*************************************************************************************************************************************/
/* */
/* C A L C U L D ' U N E F O N C T I O N D E D E N S I T E D E F I N I E P A R */
/* U N E N S E M B L E D E P O I N T S { X , Y , Z } */
/* E T E L L I P S E G E N E R A L I S E E S : */
/* */
/* */
/* Nota : */
/* */
/* Pour la notion d'ellipses generalisees, */
/* on verra 'v $xrv/densite.01$I 20030228091429' */
/* avec profit. On utilisera alors plus de 2 points */
/* donnant ainsi naissance a des "ellipses" a plus */
/* de 2 foyers... */
/* */
/* */
/* Author of '$xrv/densite.01$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20000911084827). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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_CPP_____AUTORISER_LE_GooF
/* Ceci a ete introduit le 20070727155719. */
#define PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
/* Ceci a ete introduit le 20070727155719. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F I C H I E R S D ' I N C L U D E S : */
/* */
/*************************************************************************************************************************************/
#include INCLUDES_BASE
#include image_image_DI_ALBUM_EXT
/* Introduit le 20100504154039... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* V A L E U R S I M P L I C I T E S D E S P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#include xci/sequence.01.I"
/* ATTENTION, on definit ainsi le symbole 'DERNIERE_IMAGE' qui ne sert a rien ici, puisque */
/* c'est en effet 'Zmax' qui joue ce role (introduit le 20100504105806). */
#define VISUALISER_EN_MODE_RECTANGULAIRE \
FAUX
#define CENTRER_LES_COORDONNEES_NORMALISEES \
VRAI
#include xci/coordonne.01.I"
/* Afin qu'un carre reste un carre... */
#define GENERER_UNE_IMAGE_UNIQUE \
VRAI \
/* Faut-il generer une image unique ('VRAI') ou un album ('FAUX'). Cette possibilite a */ \
/* ete introduite le 20100504104717, la valeur par defaut garantissant la compatibilite */ \
/* anterieure... */
#define TRANCHE_VERTICALE \
FZorigine \
/* Tranche verticale a priori correspondant a l'Image generee... */
#define L_ESPACE_EST_TORIQUE \
FAUX \
/* L'espace est-il torique et donc periodique ('VRAI') ou non periodique ('FAUX') ? */
#define L_ESPACE_EST_TORIQUE_EN_X \
VRAI
#define L_ESPACE_EST_TORIQUE_EN_Y \
VRAI
#define L_ESPACE_EST_TORIQUE_EN_Z \
VRAI
/* Si 'EST_VRAI(l_espace_est_torique)' controle individuellement les trois axes {X,Y,Z}. */
/* Ceci fut introduit le 20070418130650, en particulier pour permettre d'optimiser les */
/* cas bidimensionnels (ou la coordonnee 'Z' est inutile...). */
#define FACTEUR_AXI \
FU
#define FACTEUR_BXI \
FZERO
#define FACTEUR_AYI \
FU
#define FACTEUR_BYI \
FZERO
#define FACTEUR_AZI \
FU
#define FACTEUR_BZI \
FZERO
/* Transformation des coordonnees Image. */
#define FACTEUR_AXF \
FU
#define FACTEUR_BXF \
FZERO
#define FACTEUR_AYF \
FU
#define FACTEUR_BYF \
FZERO
#define FACTEUR_AZF \
FU
#define FACTEUR_BZF \
FZERO
/* Transformation des coordonnees Fichier. */
#define X_MINIMUM \
COORDONNEE_BARYCENTRIQUE_MINIMALE
#define X_MAXIMUM \
COORDONNEE_BARYCENTRIQUE_MAXIMALE
/* Extrema a priori de la coordonnee 'X' normalisee (introduit le 20100827205253). */
#define Y_MINIMUM \
COORDONNEE_BARYCENTRIQUE_MINIMALE
#define Y_MAXIMUM \
COORDONNEE_BARYCENTRIQUE_MAXIMALE
/* Extrema a priori de la coordonnee 'Y' normalisee (introduit le 20100827205253). */
#define Z_MINIMUM \
COORDONNEE_BARYCENTRIQUE_MINIMALE
#define Z_MAXIMUM \
COORDONNEE_BARYCENTRIQUE_MAXIMALE
/* Extrema a priori de la coordonnee 'Z' normalisee (introduit le 20100827205253). */
#define EDITER_LES_PARAMETRES_EVENTUELLEMENT_VARIABLES \
FAUX \
/* Faut-il editer 'facteur_de_la_distance_dans_l_exponentielle' de meme que les extrema des */ \
/* coordonnees normalisees ('VRAI') ou pas ('FAUX') ? */
#define CALCULER_DES_DISTANCES_ETENDUES \
FAUX \
/* Faut-il utiliser calculer des distances "etendues" -via l'arithmetique etendue- ('VRAI') */ \
/* ou pas ('FAUX') ? Ceci fut introduit le 20070727155719, la valeur par defaut assurant */ \
/* la compatibilite anterieure... */
#define PONDERATION_DE_LA_DISTANCE_EUCLIDIENNE \
FU
#define PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_INFERIEURE \
FZERO
#define PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_SUPERIEURE \
FZERO
#define PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_CUMULEE \
FZERO
#define PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_MULTIPLIEE \
FZERO
/* Ponderation des differentes distances calculables (introduit le 20070715110705). */
#define IGNORER_LES_GRANDES_DISTANCES \
FAUX
#define SEUIL_DE_DEFINITION_DES_GRANDES_DISTANCES \
F_INFINI
/* Le 20070514102133 fut introduit la possibilite d'oublier purement et simplement les */
/* grandes distances et ce dans le but d'accelerer les calculs. A titre d'exemple, les */
/* images 'v $xiirk/DIFS.21.Densite' et 'v $xiirk/DIFS.22.Densite' demandent environ */
/* 06:00 sur '$LACT15 et $LACT17 respectivement. Les tests effectues montrent qu'avec */
/* un seuil de 0.1, l'image 'v $xiirk/DIFS.11.Densite' n'est pas affectee, alors que */
/* le temps de calcul etait divise par 4.2... */
/* */
/* Le 20070515105215 des tests ont ete faits relativement a 'v $xiirk/DIFS.21.Densite'. */
/* Sur '$LACT15' le calcul a demande environ 06:00:00 sur '$LACT15', alors que sur '$LACT16' */
/* (sans oublier le rapport de performances entre les deux MACHINEs -environ 1.5-), ce temps */
/* est passe a 00:54:20 avec un seuil egal a 0.1 et la densite calculee etant identique */
/* (en mode "standard=VRAI"). Par contre avec un seuil de 0.03, alors que le temps de */
/* calcul etait passe a 00:49:50, la densite calculee etait differente pour, qui plus est, */
/* un gain en temps de calcul faible (de 54 a 50 minutes...). Enfin, avec un seuil de 0.01 */
/* le temps de calcul est passe a 00:49:30 avec evidemment une degradation plus forte... */
/* Il semblerait donc qu'un "bon" seuil sur les grandes distances soit 0.1 qui donne donc */
/* un gain de temps de ((06:00:00)/1.5)/(00:54:20) (environ 4) ; au passage le rapport de */
/* performances entre '$LACT15' et '$LACT16' est donne par 'v $xt/$Fnota 20040227102626'... */
#define MINIMUM_DE_LA_DISTANCE \
FZERO
#define MAXIMUM_DE_LA_DISTANCE \
F_INFINI
/* Le 20070506183223, 'SEUIL_DE_LA_DISTANCE' a ete remplace par quelque chose de plus */
/* general [MINIMUM_DE_LA_DISTANCE,MAXIMUM_DE_LA_DISTANCE]. On ne garde donc que les */
/* distances qui sont dans ce segment. On notera qu'evidemment 'SEUIL_DE_LA_DISTANCE' */
/* valait 'F_INFINI'... */
#define VALEUR_DE_LA_DISTANCE_AU_MINIMUM_DE_LA_DISTANCE \
MINIMUM_DE_LA_DISTANCE
#define VALEUR_DE_LA_DISTANCE_AU_MAXIMUM_DE_LA_DISTANCE \
MAXIMUM_DE_LA_DISTANCE
/* Valeurs a forcer pour la distance lorsqu'il y filtrage. Ceci fut introduit le */
/* 20070508090851 avec des valeurs assurant la compatibilite anterieure... */
#define AJUSTER_AUTOMATIQUEMENT_LE_FACTEUR_DE_LA_DISTANCE_DANS_L_EXPONENTIELLE \
FAUX \
/* Faut-il ajuster automatiquement 'facteur_de_la_distance_dans_l_exponentielle' ('VRAI') */ \
/* ou lui laisser sa valeur courante ('FAUX') ? */
#define FACTEUR_DE_LA_DISTANCE \
FU \
/* Facteur de la distance apres son calcul "euclidien"... */
#define FACTEUR_DE_LA_DISTANCE_DANS_L_EXPONENTIELLE \
FLOT(SEIZE) \
/* Facteur multiplicatif de la distance apres son elevation a */ \
/* 'EXPOSANT_DE_LA_DISTANCE_DANS_L_EXPONENTIELLE'. */
#define EXPOSANT_DE_LA_DISTANCE_DANS_L_EXPONENTIELLE \
FDEUX \
/* Exposant de la distance dans l'exponentielle (a priori, on va utiliser des gaussiennes). */
#define MODULER_L_EXPONENTIELLE \
FAUX \
/* Faut-il moduler l'exponentielle ('VRAI') ou l'utiliser tel quel ('FAUX') ? */
#define FACTEUR_DE_L_EXPONENTIELLE \
FU \
/* Facteur de l'exponentielle si 'IL_NE_FAUT_PAS(MODULER_L_EXPONENTIELLE)'. Ceci fut */ \
/* introduit le 20100831160725... */
#define FACTEUR_DU_MONOME \
FU \
/* Facteur du monome... */
#define EXPOSANT_DE_LA_DISTANCE_DANS_LE_MONOME \
FU \
/* Exposant de la distance dans le monome... */
#define FACTEUR_DU_COSINUS \
FU \
/* Facteur du cosinus... */
#define EXPOSANT_DE_LA_DISTANCE_DANS_LE_COSINUS \
FU \
/* Exposant de la distance dans le cosinus... */
#define OMEGA_DU_COSINUS \
FU
#define PHI_DU_COSINUS \
FZERO
/* Pulsation "omega" et phase "phi" du cosinus. */
#define CALCULER_LA_DENSITE_PAR_SOMMATION \
VRAI \
/* Faut-il calculer la densite par sommation ('VRAI') ou par maximisation ('FAUX') ? Cette */ \
/* possibilite fut introduite le 20070517103803 afin de pouvoir faire de la percolation */ \
/* "continue" ou les particules ponctuelles sont remplacees par des disques. Il suffira */ \
/* donc, pour cela, de calculer la densite par maximisation, puis de "binariser" le resultat */ \
/* ce qui transformera donc les gaussiennes en disques. Dans ce cas, il faudra utiliser les */ \
/* options : */ \
/* */ \
/* rectangulaire=FAUX grand_carre=FAUX */ \
/* */ \
/* afin que les proportions (la "circularite") soient respectees... */
#define RENORMALISER_LES_DENSITES \
FAUX \
/* Faut-il renormaliser ('VRAI') ou pas ('FAUX') les densites ? Ceci a ete introduit */ \
/* le 20100504145037, la valeur par defaut garantissant la compatibilite anterieure... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E S F I C H I E R S : */
/* */
/*************************************************************************************************************************************/
#include xrv/ARITHMET.1d.I"
/* Passage a l'allocation dynamique le 20060214185901... */
#include xrv/ARITHMET.21.I"
#include xrv/champs_5.41.I"
#define X_IMPLICITE \
FZERO
#define Y_IMPLICITE \
FZERO
#define Z_IMPLICITE \
FZERO
gGENERATION_D_UN_FICHIER(fichier_LISTE_X,liste_initiale_des_X);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Y,liste_initiale_des_Y);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Z,liste_initiale_des_Z);
/* Definition en memoire des fichiers de coordonnees cartesiennes. */
#define ELEMENT_DU_FICHIER_LISTE_X(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_X,index)
#define ELEMENT_DU_FICHIER_LISTE_Y(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_Y,index)
#define ELEMENT_DU_FICHIER_LISTE_Z(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_Z,index)
/* Acces a un element courant des fichiers de coordonnees cartesiennes. */
#define MODULATION_DU_FACTEUR_DE_LA_DISTANCE_DANS_L_EXPONENTIELLE_IMPLICITE \
FU
gGENERATION_D_UN_FICHIER(fichier_LISTE_MODULATION_DU_FACTEUR_DE_LA_DISTANCE,liste_initiale_des_MODULATION_DU_FACTEUR_DE_LA_DISTANCE);
#define ELEMENT_DU_FICHIER_LISTE_MODULATION_DU_FACTEUR_DE_LA_DISTANCE(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_MODULATION_DU_FACTEUR_DE_LA_DISTANCE,index)
/* "Modulateur" de la distance dans l'exponentielle. */
#define MODULATION_DE_OMEGA_IMPLICITE \
FU
gGENERATION_D_UN_FICHIER(fichier_LISTE_MODULATION_DE_OMEGA,liste_initiale_des_MODULATION_DE_OMEGA);
#define ELEMENT_DU_FICHIER_LISTE_MODULATION_DE_OMEGA(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_MODULATION_DE_OMEGA,index)
/* "Modulateur" de "omega" dans le cosinus. */
#define MODULATION_DE_PHI_IMPLICITE \
FU
gGENERATION_D_UN_FICHIER(fichier_LISTE_MODULATION_DE_PHI,liste_initiale_des_MODULATION_DE_PHI);
#define ELEMENT_DU_FICHIER_LISTE_MODULATION_DE_PHI(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_MODULATION_DE_PHI,index)
/* "Modulateur" de "phi" dans le cosinus. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E L A P E R I O D I C I T E D E L ' E S P A C E : */
/* */
/*************************************************************************************************************************************/
#define LONGUEUR_DES_TROIS_DIMENSIONS \
CHOY(_____lNORMALISE_OX(dimX) \
,_____lNORMALISE_OY(dimY) \
,_____lNORMALISE_OZ(dimZ) \
) \
/* Longueur commune des trois dimensions (l'espace est un cube 1x1x1). */ \
/* */ \
/* ATTENTION : jusqu'au 20070416120500, il y avait {dimXN,dimYN,dimZN} par erreur ci-dessus. */
#define TRANSLATION_NEGATIVE_DES_COORDONNEES(l_axe_est_torique) \
COND(IFET(EST_VRAI(l_espace_est_torique),EST_VRAI(l_axe_est_torique)) \
,NEGA(LONGUEUR_DES_TROIS_DIMENSIONS) \
,FZERO \
)
#define TRANSLATION_POSITIVE_DES_COORDONNEES(l_axe_est_torique) \
COND(IFET(EST_VRAI(l_espace_est_torique),EST_VRAI(l_axe_est_torique)) \
,NEUT(LONGUEUR_DES_TROIS_DIMENSIONS) \
,FZERO \
)
/* Translation "negative" et "positive" des trois coordonnees... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D U " R A P P O R T " E N T R E ' OX ' E T ' OY ' : */
/* */
/*************************************************************************************************************************************/
#define TRANSFORMATION_COORDONNEEE_X(x) \
TRANS_SUPER_cNORMALISE_OX(x,translation_des_X_normalisees)
#define TRANSFORMATION_COORDONNEEE_Y(y) \
TRANS_SUPER_cNORMALISE_OY(y,translation_des_Y_normalisees)
/* Transformation des coordonnees 'X' et 'Y'... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D E L A D E N S I T E : */
/* */
/*************************************************************************************************************************************/
#include xrv/densite.01.I"
/* Introduit le 20111213102619 a cause de 'v $xcc/cpp$Z 20111129084103'... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D ' U N E F O N C T I O N D E D E N S I T E D E F I N I E P A R */
/* U N E N S E M B L E D E P O I N T S { X , Y , Z } */
/* E T E L L I P S E G E N E R A L I S E E S : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
#include xci/coordonne.02.I"
#include xrv/ARITHMET.22.I"
DEFV(Logical,INIT(generer_une_image_unique,GENERER_UNE_IMAGE_UNIQUE));
/* Faut-il generer une image unique ('VRAI') ou un album ('FAUX'). Cette possibilite a */
/* ete introduite le 20100504104717, la valeur par defaut garantissant la compatibilite */
/* anterieure... */
DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_postfixe),NOM_UNDEF_VIDE));
/* Nom d'un eventuel postfixe a placer derriere <nom_albumA><numero> (par exemple '$ROUGE'). */
DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE));
/* Numero de la premiere image, */
DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES));
/* Pas de passage d'un numero d'image a une autre. */
DEFV(Int,INIT(nombre_de_chiffres,NOMBRE_DE_CHIFFRES));
/* Nombre de chiffres codant le numero des images de la serie... */
DEFV(Float,INIT(tranche_Z,TRANCHE_VERTICALE));
/* Definition de la troisieme coordonnee 'Z' correspondant a l'Image generee. */
DEFV(Logical,INIT(l_espace_est_torique,L_ESPACE_EST_TORIQUE));
/* L'espace est-il torique et donc periodique ('VRAI') ou non periodique ('FAUX') ? */
DEFV(Logical,INIT(l_espace_est_torique_en_X,L_ESPACE_EST_TORIQUE_EN_X));
DEFV(Logical,INIT(l_espace_est_torique_en_Y,L_ESPACE_EST_TORIQUE_EN_Y));
DEFV(Logical,INIT(l_espace_est_torique_en_Z,L_ESPACE_EST_TORIQUE_EN_Z));
/* Si 'EST_VRAI(l_espace_est_torique)' controle individuellement les trois axes {X,Y,Z}. */
/* Ceci fut introduit le 20070418130650, en particulier pour permettre d'optimiser les */
/* cas bidimensionnels (ou la coordonnee 'Z' est inutile...). */
DEFV(Float,INIT(facteur_AXI,FACTEUR_AXI));
DEFV(Float,INIT(facteur_BXI,FACTEUR_BXI));
DEFV(Float,INIT(facteur_AYI,FACTEUR_AYI));
DEFV(Float,INIT(facteur_BYI,FACTEUR_BYI));
DEFV(Float,INIT(facteur_AZI,FACTEUR_AZI));
DEFV(Float,INIT(facteur_BZI,FACTEUR_BZI));
/* Transformation des coordonnees Image. */
DEFV(Float,INIT(facteur_AXF,FACTEUR_AXF));
DEFV(Float,INIT(facteur_BXF,FACTEUR_BXF));
DEFV(Float,INIT(facteur_AYF,FACTEUR_AYF));
DEFV(Float,INIT(facteur_BYF,FACTEUR_BYF));
DEFV(Float,INIT(facteur_AZF,FACTEUR_AZF));
DEFV(Float,INIT(facteur_BZF,FACTEUR_BZF));
/* Transformation des coordonnees Fichier. */
DEFV(Float,INIT(X_minimum,X_MINIMUM));
DEFV(Float,INIT(X_maximum,X_MAXIMUM));
/* Extrema a priori de la coordonnee 'X' normalisee (introduit le 20100827205253). */
DEFV(Float,INIT(Y_minimum,Y_MINIMUM));
DEFV(Float,INIT(Y_maximum,Y_MAXIMUM));
/* Extrema a priori de la coordonnee 'Y' normalisee (introduit le 20100827205253). */
DEFV(Float,INIT(Z_minimum,Z_MINIMUM));
DEFV(Float,INIT(Z_maximum,Z_MAXIMUM));
/* Extrema a priori de la coordonnee 'Z' normalisee (introduit le 20100827205253). */
DEFV(Logical,INIT(editer_les_parametres_eventuellement_variables
,EDITER_LES_PARAMETRES_EVENTUELLEMENT_VARIABLES
)
);
/* Faut-il editer 'facteur_de_la_distance_dans_l_exponentielle' de meme que les extrema des */
/* coordonnees normalisees ('VRAI') ou pas ('FAUX') ? */
DEFV(Logical,INIT(calculer_des_distances_etendues,CALCULER_DES_DISTANCES_ETENDUES));
/* Faut-il utiliser l'arithmetique etendue ('VRAI') ou pas ('FAUX') ? Ceci fut introduit */
/* le 20070727155719, la valeur par defaut assurant la compatibilite anterieure... */
DEFV(Float,INIT(ponderation_de_la_distance_euclidienne
,PONDERATION_DE_LA_DISTANCE_EUCLIDIENNE
)
);
DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure
,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_INFERIEURE
)
);
DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_superieure
,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_SUPERIEURE
)
);
DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee
,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_CUMULEE
)
);
DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee
,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_MULTIPLIEE
)
);
/* Ponderation des differentes distances calculables (introduit le 20070715110705). */
DEFV(Logical,INIT(ignorer_les_grandes_distances,IGNORER_LES_GRANDES_DISTANCES));
DEFV(Float,INIT(seuil_de_definition_des_grandes_distances,SEUIL_DE_DEFINITION_DES_GRANDES_DISTANCES));
/* Le 20070514102133 fut introduit la possibilite d'oublier purement et simplement les */
/* grandes distances et ce dans le but d'accelerer les calculs. A titre d'exemple, les */
/* images 'v $xiirk/DIFS.21.Densite' et 'v $xiirk/DIFS.22.Densite' demandent environ */
/* 06:00 sur '$LACT15 et $LACT17 respectivement. Les tests effectues montrent qu'avec */
/* un seuil de 0.1, l'image 'v $xiirk/DIFS.11.Densite' n'est pas affectee, alors que */
/* le temps de calcul etait divise par 4.2... */
/* */
/* Le 20070515105215 des tests ont ete faits relativement a 'v $xiirk/DIFS.21.Densite'. */
/* Sur '$LACT15' le calcul a demande environ 06:00:00 sur '$LACT15', alors que sur '$LACT16' */
/* (sans oublier le rapport de performances entre les deux MACHINEs -environ 1.5-), ce temps */
/* est passe a 00:54:20 avec un seuil egal a 0.1 et la densite calculee etant identique */
/* (en mode "standard=VRAI"). Par contre avec un seuil de 0.03, alors que le temps de */
/* calcul etait passe a 00:49:50, la densite calculee etait differente pour, qui plus est, */
/* un gain en temps de calcul faible (de 54 a 50 minutes...). Enfin, avec un seuil de 0.01 */
/* le temps de calcul est passe a 00:49:30 avec evidemment une degradation plus forte... */
/* Il semblerait donc qu'un "bon" seuil sur les grandes distances soit 0.1 qui donne donc */
/* un gain de temps de ((06:00:00)/1.5)/(00:54:20) (environ 4) ; au passage le rapport de */
/* performances entre '$LACT15' et '$LACT16' est donne par 'v $xt/$Fnota 20040227102626'... */
DEFV(Float,INIT(minimum_de_la_distance,MINIMUM_DE_LA_DISTANCE));
DEFV(Float,INIT(maximum_de_la_distance,MAXIMUM_DE_LA_DISTANCE));
/* Le 20070506183223, 'SEUIL_DE_LA_DISTANCE' a ete remplace par quelque chose de plus */
/* general [MINIMUM_DE_LA_DISTANCE,MAXIMUM_DE_LA_DISTANCE]. On ne garde donc que les */
/* distances qui sont dans ce segment. On notera qu'evidemment 'seuil_de_la_distance' */
/* valait 'F_INFINI' par defaut... */
DEFV(Float,INIT(valeur_de_la_distance_au_minimum_de_la_distance,VALEUR_DE_LA_DISTANCE_AU_MINIMUM_DE_LA_DISTANCE));
DEFV(Float,INIT(valeur_de_la_distance_au_maximum_de_la_distance,VALEUR_DE_LA_DISTANCE_AU_MAXIMUM_DE_LA_DISTANCE));
/* Valeurs a forcer pour la distance lorsqu'il y filtrage. Ceci fut introduit le */
/* 20070508090851 avec des valeurs assurant la compatibilite anterieure... */
DEFV(Logical,INIT(ajuster_automatiquement_le_facteur_de_la_distance_dans_l_exponentielle
,AJUSTER_AUTOMATIQUEMENT_LE_FACTEUR_DE_LA_DISTANCE_DANS_L_EXPONENTIELLE
)
);
/* Faut-il ajuster automatiquement 'facteur_de_la_distance_dans_l_exponentielle' ('VRAI') */
/* ou lui laisser sa valeur courante ('FAUX') ? */
DEFV(Float,INIT(facteur_de_la_distance,FACTEUR_DE_LA_DISTANCE));
/* Facteur de la distance apres son calcul "euclidien"... */
DEFV(Float,INIT(facteur_de_la_distance_dans_l_exponentielle,FACTEUR_DE_LA_DISTANCE_DANS_L_EXPONENTIELLE));
/* Facteur multiplicatif de la distance apres son elevation a */
/* 'exposant_de_la_distance_dans_l_exponentielle'. On notera que plus ce facteur est grand, */
/* plus les gaussiennes sont resserrees (ce qui est logique a cause du 'NEGA(...)' qui */
/* intervient dans le calcul de 'fonction_de_la_distance_courante'). */
DEFV(Float,INIT(exposant_de_la_distance_dans_l_exponentielle,EXPOSANT_DE_LA_DISTANCE_DANS_L_EXPONENTIELLE));
/* Exposant de la distance dans l'exponentielle (a priori, on va utiliser des gaussiennes). */
DEFV(Logical,INIT(moduler_l_exponentielle,MODULER_L_EXPONENTIELLE));
/* Faut-il moduler l'exponentielle ('VRAI') ou l'utiliser tel quel ('FAUX') ? */
DEFV(Float,INIT(facteur_de_l_exponentielle,FACTEUR_DE_L_EXPONENTIELLE));
/* Facteur de l'exponentielle si 'IL_NE_FAUT_PAS(MODULER_L_EXPONENTIELLE)'. Ceci fut */
/* introduit le 20100831160725... */
DEFV(Float,INIT(facteur_du_monome,FACTEUR_DU_MONOME));
/* Facteur du monome... */
DEFV(Float,INIT(exposant_de_la_distance_dans_le_monome,EXPOSANT_DE_LA_DISTANCE_DANS_LE_MONOME));
/* Exposant de la distance dans le monome... */
DEFV(Float,INIT(facteur_du_cosinus,FACTEUR_DU_COSINUS));
/* Facteur du cosinus... */
DEFV(Float,INIT(exposant_de_la_distance_dans_le_cosinus,EXPOSANT_DE_LA_DISTANCE_DANS_LE_COSINUS));
/* Exposant de la distance dans le cosinus... */
DEFV(Float,INIT(omega_du_cosinus,OMEGA_DU_COSINUS));
DEFV(Float,INIT(phi_du_cosinus,PHI_DU_COSINUS));
/* Pulsation "omega" et phase "phi" du cosinus. */
DEFV(Logical,INIT(calculer_la_densite_par_sommation,CALCULER_LA_DENSITE_PAR_SOMMATION));
/* Faut-il calculer la densite par sommation ('VRAI') ou par maximisation ('FAUX') ? Cette */
/* possibilite fut introduite le 20070517103803 afin de pouvoir faire de la percolation */
/* "continue" ou les particules ponctuelles sont remplacees par des disques. Il suffira */
/* donc, pour cela, de calculer la densite par maximisation, puis de "binariser" le resultat */
/* ce qui transformera donc les gaussiennes en disques. Dans ce cas, il faudra utiliser les */
/* options : */
/* */
/* rectangulaire=FAUX grand_carre=FAUX */
/* */
/* afin que les proportions (la "circularite") soient respectees... */
DEFV(Logical,INIT(renormaliser_les_densites,RENORMALISER_LES_DENSITES));
/* Faut-il renormaliser ('VRAI') ou pas ('FAUX') les exponentielles ? Ceci a ete introduit */
/* le 20100504145037, la valeur par defaut garantissant la compatibilite anterieure... */
/*..............................................................................................................................*/
#include xci/coordonne.04.I"
/* Ceci a ete introduit le 20051218183919, ainsi que les 'PROCESS_ARGUMENT_?(...)' qui */
/* suivent... */
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements
,BLOC(VIDE;)
,BLOC(Bblock
PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers");
Eblock
)
);
PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01;
PROKESF_ARGUMENT_FICHIER("LISTE_X="
,fichier_LISTE_X
,liste_initiale_des_X
,X_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_Y="
,fichier_LISTE_Y
,liste_initiale_des_Y
,Y_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_Z="
,fichier_LISTE_Z
,liste_initiale_des_Z
,Z_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_MODULATION_DISTANCE="
,fichier_LISTE_MODULATION_DU_FACTEUR_DE_LA_DISTANCE
,liste_initiale_des_MODULATION_DU_FACTEUR_DE_LA_DISTANCE
,MODULATION_DU_FACTEUR_DE_LA_DISTANCE_DANS_L_EXPONENTIELLE_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_MODULATION_OMEGA="
,fichier_LISTE_MODULATION_DE_OMEGA
,liste_initiale_des_MODULATION_DE_OMEGA
,MODULATION_DE_OMEGA_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_MODULATION_PHI="
,fichier_LISTE_MODULATION_DE_PHI
,liste_initiale_des_MODULATION_DE_PHI
,MODULATION_DE_PHI_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
GET_ARGUMENT_L("image_unique=""image=",generer_une_image_unique);
GET_ARGUMENT_N("album=",generer_une_image_unique);
/* Arguments introduits le 20100504104717... */
GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_C("postfixe=",nom_postfixe);
GET_ARGUMENT_I("premiere=",premiere_image);
GET_ARGUMENT_I("pas=",pas_des_images);
GET_ARGUMENT_I("chiffres=",nombre_de_chiffres);
/* Arguments introduits le 20100504104717... */
GET_ARGUMENT_L("centrer=",centrer_les_coordonnees_normalisees);
GET_ARGUMENT_F("z=""Z=",tranche_Z);
GET_ARGUMENT_L("torique=""periodique=",l_espace_est_torique);
GET_ARGUMENT_L("toriqueX=""periodiqueX=",l_espace_est_torique_en_X);
GET_ARGUMENT_L("toriqueY=""periodiqueY=",l_espace_est_torique_en_Y);
GET_ARGUMENT_L("toriqueZ=""periodiqueZ=",l_espace_est_torique_en_Z);
/* Le controle individuel des trois axes {X,Y,Z} fut introduit le 20070418130650... */
GET_ARGUMENT_F("AXI=",facteur_AXI);
GET_ARGUMENT_F("BXI=",facteur_BXI);
GET_ARGUMENT_F("AYI=",facteur_AYI);
GET_ARGUMENT_F("BYI=",facteur_BYI);
GET_ARGUMENT_F("AZI=",facteur_AZI);
GET_ARGUMENT_F("BZI=",facteur_BZI);
GET_ARGUMENT_F("AXF=",facteur_AXF);
GET_ARGUMENT_F("BXF=",facteur_BXF);
GET_ARGUMENT_F("AYF=",facteur_AYF);
GET_ARGUMENT_F("BYF=",facteur_BYF);
GET_ARGUMENT_F("AZF=",facteur_AZF);
GET_ARGUMENT_F("BZF=",facteur_BZF);
GET_ARGUMENT_F("FXmin=",X_minimum);
GET_ARGUMENT_F("FXmax=",X_maximum);
GET_ARGUMENT_F("FYmin=",Y_minimum);
GET_ARGUMENT_F("FYmax=",Y_maximum);
GET_ARGUMENT_F("FZmin=",Z_minimum);
GET_ARGUMENT_F("FZmax=",Z_maximum);
/* Introduits le 20100827205253... */
GET_ARGUMENT_L("editer=",editer_les_parametres_eventuellement_variables);
GET_ARGUMENT_L("distances_etendues=""de=",calculer_des_distances_etendues);
/* Introduit le 20070727155719... */
GET_ARGUMENT_F("sphere=""euclidienne=""euclide=",ponderation_de_la_distance_euclidienne);
GET_ARGUMENT_F("tmin=""tinf=""taxi_minimum=""taxi_inferieur="
,ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure
);
GET_ARGUMENT_F("tsup=""tmax=""taxi_maximum=""taxi_superieur="
,ponderation_de_la_distance_du_chauffeur_de_taxi_superieure
);
GET_ARGUMENT_F("tcum=""taxi_cumul=""tadd=",ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee);
GET_ARGUMENT_F("tmul=""taxi_multiplication=",ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee);
/* Parametres introduits le 20070715110705... */
GET_ARGUMENT_L("igd=""ignorer_grandes_distances=",ignorer_les_grandes_distances);
GET_ARGUMENT_F("sgd=""seuil_grandes_distances=",seuil_de_definition_des_grandes_distances);
/* Parametres introduits le 20070514102133... */
GET_ARGUMENT_F("minimum=""min=",minimum_de_la_distance);
GET_ARGUMENT_F("seuil=""s=""maximum=""max=",maximum_de_la_distance);
/* {minimum_de_la_distance,maximum_de_la_distance} ont remplace 'seuil_de_la_distance' */
/* le 20070506183223. Malgre tout, "seuil=" et ""s=" sont conserves pour des raisons de */
/* compatibilite anterieure... */
GET_ARGUMENT_F("vmin=""valeur_minimale=",valeur_de_la_distance_au_minimum_de_la_distance);
GET_ARGUMENT_F("vmax=""valeur_maximale=",valeur_de_la_distance_au_maximum_de_la_distance);
/* Les parametres ""valeur_minimale=" et "valeur_maximale=" ont ete introduits le */
/* 20070508090851... */
GET_ARGUMENT_L("ajuster=",ajuster_automatiquement_le_facteur_de_la_distance_dans_l_exponentielle);
GET_ARGUMENT_F("k=""facteur=""f=",facteur_de_la_distance);
GET_ARGUMENT_F("Ek=""Efacteur=""Ef=",facteur_de_la_distance_dans_l_exponentielle);
GET_ARGUMENT_F("Eexposant=""Ee=",exposant_de_la_distance_dans_l_exponentielle);
GET_ARGUMENT_L("moduler=",moduler_l_exponentielle);
GET_ARGUMENT_F("Fe=""Fexponentielle=",facteur_de_l_exponentielle);
/* Parametre introduit le 20100831160725... */
GET_ARGUMENT_F("Mk=""Mfacteur=""Mf=",facteur_du_monome);
GET_ARGUMENT_F("Mexposant=""Me=",exposant_de_la_distance_dans_le_monome);
GET_ARGUMENT_F("Ck=""Cfacteur=""Cf=",facteur_du_cosinus);
GET_ARGUMENT_F("Cexposant=""Ce=",exposant_de_la_distance_dans_le_cosinus);
GET_ARGUMENT_F("omega=",omega_du_cosinus);
GET_ARGUMENT_F("phi=",phi_du_cosinus);
GET_ARGUMENT_L("sommation=""somme=",calculer_la_densite_par_sommation);
GET_ARGUMENT_N("maximisation=""maximise=",calculer_la_densite_par_sommation);
/* Parametres introduits le 20070517103803... */
GET_ARGUMENTS2_F("amplitude_nullite=""nullite="
,IFnormalisation_____amplitude_des_extrema_en_deca_de_laquelle_il_y_a_nullite
,AFnormalisation_____amplitude_des_extrema_en_deca_de_laquelle_il_y_a_nullite
);
GET_ARGUMENTS2_F("origine=""o="
,IFnormalisation_____niveau_origine___de_normalisation
,AFnormalisation_____niveau_origine___de_normalisation
);
GET_ARGUMENTS2_F("extremite=""e="
,IFnormalisation_____niveau_extremite_de_normalisation
,AFnormalisation_____niveau_extremite_de_normalisation
);
GET_ARGUMENTS2_L("zero="
,IFnormalisation_____conserver_le_zero
,AFnormalisation_____conserver_le_zero
);
/* Parametres introduits le 20100504152652... */
GET_ARGUMENT_L("rn=""renormaliser=",renormaliser_les_densites);
/* Parametres introduits le 20100504145037... */
)
);
#include xci/coordonne.03.I"
Test(IFET(IL_FAUT(ajuster_automatiquement_le_facteur_de_la_distance_dans_l_exponentielle)
,IFLE(nombre_d_elements,UN)
)
)
Bblock
PRINT_ATTENTION("pas assez d'elements pour ajuster automatiquement le facteur de la distance dans l'exponentielle");
Eblock
ATes
Bblock
Eblock
ETes
Test(IFET(IL_FAUT(ajuster_automatiquement_le_facteur_de_la_distance_dans_l_exponentielle)
,IFGT(nombre_d_elements,UN)
)
)
Bblock
DEFV(Int,INIT(indexI,UNDEF));
DEFV(Int,INIT(indexJ,UNDEF));
/* Index des elements courants dans les fichiers pour calculer les distances {I,J}. */
DEFV(Float,INIT(distance_IJ_minimale,F_INFINI));
DEFV(Float,INIT(distance_IJ_maximale,F_MOINS_L_INFINI));
/* Extrema de toutes les distances 2 a 2. On notera que 'distance_IJ_maximale' ne sert */
/* a rien, mais on ne sait jamais (plus tard...). */
DoIn(indexI
,PREMIER_ELEMENT_D_UN_FICHIER
,DERNIER_ELEMENT_D_UN_FICHIER
,I
)
Bblock
DEFV(Float,INIT(coordonnee_XI,ELEMENT_DU_FICHIER_LISTE_X(indexI)));
DEFV(Float,INIT(coordonnee_YI,ELEMENT_DU_FICHIER_LISTE_Y(indexI)));
DEFV(Float,INIT(coordonnee_ZI,ELEMENT_DU_FICHIER_LISTE_Z(indexI)));
/* Recuperation des coordonnees {X,Y,Z} courantes dans les fichiers. */
DoIn(indexJ
,PREMIER_ELEMENT_D_UN_FICHIER
,DERNIER_ELEMENT_D_UN_FICHIER
,I
)
Bblock
DEFV(Float,INIT(coordonnee_XJ,ELEMENT_DU_FICHIER_LISTE_X(indexJ)));
DEFV(Float,INIT(coordonnee_YJ,ELEMENT_DU_FICHIER_LISTE_Y(indexJ)));
DEFV(Float,INIT(coordonnee_ZJ,ELEMENT_DU_FICHIER_LISTE_Z(indexJ)));
/* Recuperation des coordonnees {X,Y,Z} courantes dans les fichiers. */
Test(IFNE(indexI,indexJ))
Bblock
DEFV(Float,INIT(distance_IJ
,RdisF3D(coordonnee_XI,coordonnee_YI,coordonnee_ZI
,coordonnee_XJ,coordonnee_YJ,coordonnee_ZJ
)
)
);
/* Calcul de la distance des points {I,J} pour I#J. */
EGAL(distance_IJ_minimale,MIN2(distance_IJ_minimale,distance_IJ));
EGAL(distance_IJ_maximale,MAX2(distance_IJ_maximale,distance_IJ));
/* Recherche des extrema de toutes les distances 2 a 2... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
EDoI
Eblock
EDoI
Test(IZGT(distance_IJ_minimale))
Bblock
EGAL(facteur_de_la_distance_dans_l_exponentielle
,DIVI(facteur_de_la_distance_dans_l_exponentielle,distance_IJ_minimale)
);
/* Ainsi, plus la distance minimale est petite, plus le facteur est grand et ce de facon */
/* a limiter la portee des points a grande distance. */
Eblock
ATes
Bblock
PRINT_ATTENTION("la distance minimale est nulle,");
PRINT_ATTENTION("le facteur de la distance dans l'exponentielle ne peut donc etre ajuste");
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(editer_les_parametres_eventuellement_variables))
Bblock
CAL2(Prin4("espace XxY normalise : [%f,%f]x[%f,%f]\n\n"
,TRANSFORMATION_COORDONNEEE_X(Xmin)
,TRANSFORMATION_COORDONNEEE_X(Xmax)
,TRANSFORMATION_COORDONNEEE_Y(Ymin)
,TRANSFORMATION_COORDONNEEE_Y(Ymax)
)
);
CAL2(Prin1("facteur effectif de la distance dans l'exponentielle : %.^^^\n\n"
,facteur_de_la_distance_dans_l_exponentielle
)
);
/* Le 20060105161108, le format "16g" est passe a "^^g" pour plus de souplesse... */
/* */
/* Le 20091123123522, le format "^^g" est passe a "^^^" pour plus de souplesse... */
Eblock
ATes
Bblock
Eblock
ETes
begin_nouveau_block
Bblock
DEFV(Float,INIT(minimum_des_densites,F_INFINI));
DEFV(Float,INIT(maximum_des_densites,F_MOINS_L_INFINI));
/* Definition des extrema de l'ensemble des densites (introduit le 20100504145037). */
DEFV(Float,INIT(densite_courante,FLOT__UNDEF));
/* Definition de la densite courante au point {X,Y,Z} de l'image. */
Test(IL_FAUT(generer_une_image_unique))
/* Test introduit le 20100504104717... */
Bblock
BDEFV(imageF,fonction_de_densite);
/* Definition de la fonction de densite. */
CALi(IFinitialisation(fonction_de_densite,FZERO));
/* Initialisation de la fonction de densite. */
begin_image
Bblock
CALCUL_DE_LA_DENSITE(tranche_Z);
storeF_point(densite_courante,fonction_de_densite,X,Y);
/* Rangement de la densite courante au point {X,Y,Z} de l'Image. */
Eblock
end_image
Test(IL_FAUT(renormaliser_les_densites))
/* Test introduit le 20100504145037... */
Bblock
CALS(IFnormalisation(fonction_de_densite,fonction_de_densite,minimum_des_densites,maximum_des_densites));
/* Et renormalisation... */
Eblock
ATes
Bblock
Eblock
ETes
CALi(IupdateF_image(nom_imageR,fonction_de_densite));
EDEFV(imageF,fonction_de_densite);
/* Definition de la fonction de densite. */
Eblock
ATes
Bblock
#define nom_albumR \
nom_imageR
BDEFV(albumF,fonction_de_densite);
/* Definition de la fonction de densite. */
CALS(dAFinitialisation(fonction_de_densite,FZERO));
/* Initialisation de la fonction de densite. */
begin_album
Bblock
CALCUL_DE_LA_DENSITE(_____cNORMALISE_OZ(Z));
AstoreF_point(densite_courante,fonction_de_densite,X,Y,Z);
Eblock
end_album
Test(IL_FAUT(renormaliser_les_densites))
/* Test introduit le 20100504145037... */
Bblock
CALS(AFnormalisation(fonction_de_densite,fonction_de_densite,minimum_des_densites,maximum_des_densites));
/* Et renormalisation... */
Eblock
ATes
Bblock
Eblock
ETes
CALi(dAupdateF_album(nom_albumR
,nom_postfixe
,premiere_image
,pas_des_images
,fonction_de_densite
,nombre_de_chiffres
,FAUX
)
);
/* L'argument 'Inv' ('FAUX') a ete introduit le 20100624091948... */
EDEFV(albumF,fonction_de_densite);
/* Definition de la fonction de densite. */
#undef nom_albumR
Eblock
ETes
Eblock
end_nouveau_block
lGENERATION_D_UN_FICHIER(liste_initiale_des_MODULATION_DE_PHI,MODULATION_DE_PHI_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_MODULATION_DE_OMEGA,MODULATION_DE_OMEGA_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_MODULATION_DU_FACTEUR_DE_LA_DISTANCE
,MODULATION_DU_FACTEUR_DE_LA_DISTANCE_DANS_L_EXPONENTIELLE_IMPLICITE
);
lGENERATION_D_UN_FICHIER(liste_initiale_des_Z,Z_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_Y,Y_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_X,X_IMPLICITE);
RETU_Commande;
Eblock
ECommande
Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.