/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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 }  :                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/densite.01$I' :                                                                                            */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20111213102502).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E   L A   D E N S I T E  :                                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   RENORMALISER_XYZ(coordonnee,minimum,maximum,minimum_par_defaut,maximum_par_defaut)                                            \
                    EGAL(coordonnee                                                                                                     \
                        ,COND(IFET(IFEQ(minimum,minimum_par_defaut),IFEQ(maximum,maximum_par_defaut))                                   \
                             ,coordonnee                                                                                                \
                             ,HOMO(coordonnee,minimum_par_defaut,maximum_par_defaut,minimum,maximum)                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* Renormalisation des coordonnees (introduite le 20100827205253).                           */ \
                                        /*                                                                                           */ \
                                        /* On notera qu'a priori le 'COND(...)' est inutile parce que par definition 'HOMO(...)'     */ \
                                        /* doit etre neutre lorsque les extrema sont egaux a leur valeur par defaut. Mais afin       */ \
                                        /* d'etre sur de garantir la compatibilite anterieure, il est plus prudent de mettre le      */ \
                                        /* 'COND(...)'.                                                                              */

#define   CALCUL_DE_LA_DENSITE(tranche_Z)                                                                                               \
                    Bblock                                                                                                              \
                    DEFV(Float,INIT(coordonnee_XI,AXPB(facteur_AXI,TRANSFORMATION_COORDONNEEE_X(X),facteur_BXI)));                      \
                    DEFV(Float,INIT(coordonnee_YI,AXPB(facteur_AYI,TRANSFORMATION_COORDONNEEE_Y(Y),facteur_BYI)));                      \
                    DEFV(Float,INIT(coordonnee_ZI,AXPB(facteur_AZI,tranche_Z,facteur_BZI)));                                            \
                                        /* Recuperation des coordonnees {X,Y,Z} courantes de l'image.                                */ \
                                                                                                                                        \
                    DEFV(Float,INIT(increment_de_la_densite_courante,FZERO));                                                           \
                                        /* Definition l'increment de la densite courante au point {X,Y,Z} de l'image.                */ \
                                                                                                                                        \
                    RENORMALISER_XYZ(coordonnee_XI,X_minimum,X_maximum,X_MINIMUM,X_MAXIMUM);                                            \
                    RENORMALISER_XYZ(coordonnee_YI,Y_minimum,Y_maximum,Y_MINIMUM,Y_MAXIMUM);                                            \
                    RENORMALISER_XYZ(coordonnee_ZI,Z_minimum,Z_maximum,Z_MINIMUM,Z_MAXIMUM);                                            \
                                        /* Renormalisation eventuelle des coordonnees (introduite le 20100827205253).                */ \
                                                                                                                                        \
                    CLIR(densite_courante);                                                                                             \
                                        /* Initialisation de la densite courante au point {X,Y,Z} de l'image.                        */ \
                                                                                                                                        \
                    DoIn(index                                                                                                          \
                        ,PREMIER_ELEMENT_D_UN_FICHIER                                                                                   \
                        ,DERNIER_ELEMENT_D_UN_FICHIER                                                                                   \
                        ,I                                                                                                              \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                         DEFV(Float,INIT(coordonnee_XF,AXPB(facteur_AXF,ELEMENT_DU_FICHIER_LISTE_X(index),facteur_BXF)));               \
                         DEFV(Float,INIT(coordonnee_YF,AXPB(facteur_AYF,ELEMENT_DU_FICHIER_LISTE_Y(index),facteur_BYF)));               \
                         DEFV(Float,INIT(coordonnee_ZF,AXPB(facteur_AZF,ELEMENT_DU_FICHIER_LISTE_Z(index),facteur_BZF)));               \
                                        /* Recuperation des coordonnees {X,Y,Z} courantes dans les fichiers.                         */ \
                         DEFV(Float,INIT(translation_de_XF,FLOT__UNDEF));                                                               \
                         DEFV(Float,INIT(translation_de_YF,FLOT__UNDEF));                                                               \
                         DEFV(Float,INIT(translation_de_ZF,FLOT__UNDEF));                                                               \
                                        /* Translations des coordonnees {X,Y,Z} nulles si 'EST_FAUX(l_espace_est_torique)' et        */ \
                                        /* valant {-1,0,+1} dans le cas contraire.                                                   */ \
                                                                                                                                        \
                         DoIn(translation_de_XF                                                                                         \
                             ,TRANSLATION_NEGATIVE_DES_COORDONNEES(l_espace_est_torique_en_X)                                           \
                             ,TRANSLATION_POSITIVE_DES_COORDONNEES(l_espace_est_torique_en_X)                                           \
                             ,LONGUEUR_DES_TROIS_DIMENSIONS                                                                             \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              DoIn(translation_de_YF                                                                                    \
                                  ,TRANSLATION_NEGATIVE_DES_COORDONNEES(l_espace_est_torique_en_Y)                                      \
                                  ,TRANSLATION_POSITIVE_DES_COORDONNEES(l_espace_est_torique_en_Y)                                      \
                                  ,LONGUEUR_DES_TROIS_DIMENSIONS                                                                        \
                                   )                                                                                                    \
                                   Bblock                                                                                               \
                                   DoIn(translation_de_ZF                                                                               \
                                       ,TRANSLATION_NEGATIVE_DES_COORDONNEES(l_espace_est_torique_en_Z)                                 \
                                       ,TRANSLATION_POSITIVE_DES_COORDONNEES(l_espace_est_torique_en_Z)                                 \
                                       ,LONGUEUR_DES_TROIS_DIMENSIONS                                                                   \
                                        )                                                                                               \
                                        Bblock                                                                                          \
                                        DEFV(Float,INIT(distance_courante,FLOT__UNDEF));                                                \
                                        DEFV(Float,INIT(distance_courante_transformee,FLOT__UNDEF));                                    \
                                        /* Distance entre le point courant de l'Image et le point courant du Fichier, avant et       */ \
                                        /* apres transformation ('distance_courante_transformee' fut introduite le 20030228091429).  */ \
                                        DEFV(Float,INIT(fonction_de_la_distance_courante,FLOT__UNDEF));                                 \
                                        /* Pour alleger le travail du compilateur et eventuellement optimisee le code genere au      */ \
                                        /* cas ou 'BUG_SYSTEME_SG_C_pow' existe...                                                   */ \
                                        DEFV(Float,INIT(modulation_de_l_exponentielle,facteur_de_l_exponentielle));                     \
                                        /* Modulation courante de l'exponentielle a priori "neutre"...                               */ \
                                                                                                                                        \
                                        USs_GooF______CONDITIONNEL                                                                      \
                                            (calculer_des_distances_etendues                                                            \
                                            ,BLOC(                                                                                      \
                                                  Bblock                                                                                \
                                                  EGAL(distance_courante                                                                \
                                                      ,UdisF3D(NEUT(coordonnee_XI)                                                      \
                                                              ,NEUT(coordonnee_YI)                                                      \
                                                              ,NEUT(coordonnee_ZI)                                                      \
                                                              ,ADD2(coordonnee_XF,translation_de_XF)                                    \
                                                              ,ADD2(coordonnee_YF,translation_de_YF)                                    \
                                                              ,ADD2(coordonnee_ZF,translation_de_ZF)                                    \
                                                              ,ponderation_de_la_distance_euclidienne                                   \
                                                              ,ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure               \
                                                              ,ponderation_de_la_distance_du_chauffeur_de_taxi_superieure               \
                                                              ,ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee                  \
                                                              ,ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee               \
                                                               )                                                                        \
                                                       );                                                                               \
                                        /* Le 20071026091245, tout cela fut simplifie en introduisant 'UdisF3D(...)'...              */ \
                                                  Eblock                                                                                \
                                                  )                                                                                     \
                                             );                                                                                         \
                                        /* L'appel a 'USs_GooF______CONDITIONNEL(...)' fut introduit le 20071103134743...            */ \
                                                                                                                                        \
                                        Test(IFET(IL_FAUT(ignorer_les_grandes_distances)                                                \
                                                 ,IFGE(distance_courante,seuil_de_definition_des_grandes_distances)                     \
                                                  )                                                                                     \
                                             )                                                                                          \
                                        /* Possibilite introduite le 20070514102133 pour accelerer les calculs...                    */ \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             EGAL(distance_courante_transformee                                                         \
                                                 ,xTRON(distance_courante                                                               \
                                                       ,minimum_de_la_distance                                                          \
                                                       ,maximum_de_la_distance                                                          \
                                                       ,valeur_de_la_distance_au_minimum_de_la_distance                                 \
                                                       ,MUL2(facteur_de_la_distance,distance_courante)                                  \
                                                       ,valeur_de_la_distance_au_maximum_de_la_distance                                 \
                                                       ,IFINff                                                                          \
                                                        )                                                                               \
                                                  );                                                                                    \
                                        /* Distance entre le point courant de l'Image et le point courant du Fichier avec seuillage. */ \
                                        /*                                                                                           */ \
                                        /* Le 20070506183223 'IFLE(distance_courante,seuil_de_la_distance)' a ete donc remplace      */ \
                                        /* par le 'IFINff(...)', les valeurs par defaut garantissant la compatibilite anterieure...  */ \
                                                                                                                                        \
                                             EGAL(fonction_de_la_distance_courante                                                      \
                                                 ,NEGA(MUL2(MUL2(ELEMENT_DU_FICHIER_LISTE_MODULATION_DU_FACTEUR_DE_LA_DISTANCE(index)   \
                                                                ,facteur_de_la_distance_dans_l_exponentielle                            \
                                                                 )                                                                      \
                                                           ,PUIX(distance_courante_transformee                                          \
                                                                ,exposant_de_la_distance_dans_l_exponentielle                           \
                                                                 )                                                                      \
                                                            )                                                                           \
                                                       )                                                                                \
                                                  );                                                                                    \
                                                                                                                                        \
                                             Test(IL_FAUT(moduler_l_exponentielle))                                                     \
                                                  Bblock                                                                                \
                                                  EGAL(modulation_de_l_exponentielle                                                    \
                                                      ,LIZ2(facteur_du_monome                                                           \
                                                           ,PUIX(distance_courante_transformee                                          \
                                                                ,exposant_de_la_distance_dans_le_monome                                 \
                                                                 )                                                                      \
                                                           ,facteur_du_cosinus                                                          \
                                                           ,COSX(AXPB(MUL2(ELEMENT_DU_FICHIER_LISTE_MODULATION_DE_OMEGA(index)          \
                                                                          ,omega_du_cosinus                                             \
                                                                           )                                                            \
                                                                     ,PUIX(distance_courante_transformee                                \
                                                                          ,exposant_de_la_distance_dans_le_cosinus                      \
                                                                           )                                                            \
                                                                     ,MUL2(ELEMENT_DU_FICHIER_LISTE_MODULATION_DE_PHI(index)            \
                                                                          ,phi_du_cosinus                                               \
                                                                           )                                                            \
                                                                      )                                                                 \
                                                                 )                                                                      \
                                                            )                                                                           \
                                                       );                                                                               \
                                        /* La modulation est composee d'un premier terme polynomial puis d'un second terme           */ \
                                        /* trigonometrique.                                                                          */ \
                                                  Eblock                                                                                \
                                             ATes                                                                                       \
                                                  Bblock                                                                                \
                                                  Eblock                                                                                \
                                             ETes                                                                                       \
                                                                                                                                        \
                                             EGAL(increment_de_la_densite_courante                                                      \
                                                 ,MUL2(modulation_de_l_exponentielle,EXEX(fonction_de_la_distance_courante))            \
                                                  );                                                                                    \
                                                                                                                                        \
                                             EGAL(densite_courante                                                                      \
                                                 ,OPC2(IL_FAUT(calculer_la_densite_par_sommation)                                       \
                                                      ,ADD2                                                                             \
                                                      ,MAX2                                                                             \
                                                      ,densite_courante,increment_de_la_densite_courante                                \
                                                       )                                                                                \
                                                  );                                                                                    \
                                        /* Cumul des distances du point courant de l'Image a l'ensemble des points du Fichier.       */ \
                                        /*                                                                                           */ \
                                        /* Soit donc 'PI' le point courant de l'Image et 'PF' le point courant du Fichier. La        */ \
                                        /* densite courante en 'PI' est definie par :                                                */ \
                                        /*                                                                                           */ \
                                        /*                 ______                                                                    */ \
                                        /*                 \                                                             Ee          */ \
                                        /*                  \          Me                        Ce                 -Ek.d  (PI,PF)   */ \
                                        /*   densite(PI) =  /     [Mk.d  (PI,PF) + Ck.cos(OMEGA.d  (PI,PF) + PHI)].e                 */ \
                                        /*                 /_____                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  {PF}   \____________________________________________/                    */ \
                                        /*                                      facteur conditionnel                                 */ \
                                        /*                                                                                           */ \
                                        /* ou 'k' et 'E' designent 'facteur_de_la_distance_dans_l_exponentielle' et                  */ \
                                        /* 'exposant_de_la_distance_dans_l_exponentielle' respectivement. La fonction 'd(...)'       */ \
                                        /* quant a elle correspond a la distance entre 'PI' et 'PF' (eventuellement seuillee         */ \
                                        /* par 'seuil_de_la_distance' et modulee par 'facteur_de_la_distance' ; on notera que        */ \
                                        /* le 20070506183223 le seuillage par 'seuil_de_la_distance' fut remplace par un filtrage    */ \
                                        /* dans [minimum_de_la_distance,maximum_de_la_distance]...).                                 */ \
                                        /*                                                                                           */ \
                                        /* On notera le 20070714214628 que cette possibilite de moduler l'exponentielle par un       */ \
                                        /* cosinus introduit en quelques sorte une longueur d'onde pour les particules qui peuvent   */ \
                                        /* alors interferer entre-elles puisque cette modulation est signee et que le cumul qui      */ \
                                        /* est effectue est en fait une interference constructive et destructive suivant les cas...  */ \
                                        /*                                                                                           */ \
                                        /* Evidemment, dans une utilisation de type "interpolation", il conviendra de ne pas         */ \
                                        /* "moduler" l'exponentielle et de s'en tenir donc a :                                       */ \
                                        /*                                                                                           */ \
                                        /*                                ______                                                     */ \
                                        /*                                \            Ee                                            */ \
                                        /*                                 \      -Ek.d  (PI,PF)                                     */ \
                                        /*                  densite(PI) =  /     e                                                   */ \
                                        /*                                /_____                                                     */ \
                                        /*                                                                                           */ \
                                        /*                                 {PF}                                                      */ \
                                        /*                                                                                           */ \
                                        /* qui est, au passage, le mode par defaut, soit plus explicitement :                        */ \
                                        /*                                                                                           */ \
                                        /*                                ______                                                     */ \
                                        /*                                \            2                                             */ \
                                        /*                                 \      -16.d (PI,PF)                                      */ \
                                        /*                  densite(PI) =  /     e                                                   */ \
                                        /*                                /_____                                                     */ \
                                        /*                                                                                           */ \
                                        /*                                 {PF}                                                      */ \
                                        /*                                                                                           */ \
                                        /* avec les valeurs par defaut...                                                            */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION, 'EXPX(...)' a ete remplace par 'EXEX(...)' le 20000918133324 a cause du        */ \
                                        /* probleme decrit dans 'v $Dbugs/SGO200A2$D/IRIX$D/CC$D/exp.01$c'.                          */ \
                                        /*                                                                                           */ \
                                        /* On notera une utilisation interessante decouverte le 20030228091429 en faisant :          */ \
                                        /*                                                                                           */ \
                                        /*                  moduler=VRAI                                                             */ \
                                        /*                                                                                           */ \
                                        /*                  Mk=1 Me=1                                                                */ \
                                        /*                  Ck=0                                                                     */ \
                                        /*                  Ek=0                                                                     */ \
                                        /*                                                                                           */ \
                                        /* qui calcule donc (en "modulant" l'exponentielle par "moduler=VRAI") :                     */ \
                                        /*                                                                                           */ \
                                        /*                                ______                                                     */ \
                                        /*                                \                                                          */ \
                                        /*                                 \                                                         */ \
                                        /*                  densite(PI) =  /     d(PI,PF)                                            */ \
                                        /*                                /_____                                                     */ \
                                        /*                                                                                           */ \
                                        /* et qui, avec deux points redonne evidemment des ellipses concentriques dont ces deux      */ \
                                        /* points sont les foyers et ce en visualisant les lignes de niveau...                       */ \
                                        /*                                                                                           */ \
                                        /* Le choix entre 'ADD2(...)' et 'MAX2(...)' fut introduit le 20070517103803...              */ \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   EDoI                                                                                                 \
                                   Eblock                                                                                               \
                              EDoI                                                                                                      \
                              Eblock                                                                                                    \
                         EDoI                                                                                                           \
                         Eblock                                                                                                         \
                    EDoI                                                                                                                \
                                                                                                                                        \
                    EGAL(minimum_des_densites,MIN2(densite_courante,minimum_des_densites));                                             \
                    EGAL(maximum_des_densites,MAX2(densite_courante,maximum_des_densites));                                             \
                                        /* Extrema des exponentielles en vue d'une eventuelle renormalisation...                     */ \
                    Eblock                                                                                                              \
                                        /* Procedure introduite le 20100504103350...                                                 */



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.