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