/*************************************************************************************************************************************/
/* */
/* C A L C U L D E L A D E N S I T E D ' U N A L B U M : */
/* */
/* */
/* Author of '$xci/densite_3D.11$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20001223090451). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F I C H I E R S D ' I N C L U D E S : */
/* */
/*************************************************************************************************************************************/
#include INCLUDES_BASE
#include image_image_IMAGESF_EXT
#include image_image_DI_ALBUM_EXT
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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... */
#define INVERSER_L_AXE_OZ \
FAUX \
/* Indique s'il faut inverser l'ordre de parcours de l'ensemble des images. On a : */ \
/* */ \
/* FAUX : l'image d'arriere-plan est la premiere de la liste, */ \
/* VRAI : l'image d'arriere-plan est la derniere de la liste. */ \
/* */ \
/* Ceci fut introduit le 20100623084938... */
#define INCOMPLET_AXE_OZ \
FAUX \
/* Indique s'il peut manquer des images (ceci fut introduit le 20120322085615)... */
#define INCOMPLET_AXE_OZ_VALEUR_STANDARD \
NOIR
#define INCOMPLET_AXE_OZ_VALEUR_NON_STANDARD \
FLOT__NOIR
/* Donne la valeur des images manquantes (ceci fut introduit le 20120322092127)... */
#define DEMI_DIMENSION_X \
QUATRE
#define DEMI_DIMENSION_Y \
QUATRE
#define DEMI_DIMENSION_Z \
QUATRE
/* Demi-dimension de la boite de calcul de la densite. */
#define FACTEUR_DU_NIVEAU \
FU \
/* Facteur du niveau. */
#define FACTEUR_DE_LA_DISTANCE \
FU \
/* Facteur de la distance. */
#define EXPOSANT_DE_LA_DISTANCE \
FDEUX \
/* Exposant de la distance. */
#define RENORMALISER_LES_EXPONENTIELLES \
VRAI \
/* Faut-il renormaliser ('VRAI') ou pas ('FAUX') les exponentielles ? */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D E L A D E N S I T E D ' U N A L B U M : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIC(POINTERc(nom_albumR),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_albumA),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(Logical,INIT(inverser_l_axe_OZ,INVERSER_L_AXE_OZ));
/* Indique s'il faut inverser l'ordre de parcours de l'ensemble des images. On a : */
/* */
/* FAUX : l'image d'arriere-plan est la premiere de la liste, */
/* VRAI : l'image d'arriere-plan est la derniere de la liste. */
/* */
/* Ceci fut introduit le 20100623084932... */
DEFV(Logical,INIT(incomplet_axe_OZ,INCOMPLET_AXE_OZ));
/* Indique s'il peut manquer des images (ceci fut introduit le 20120322085615)... */
DEFV(genere_p,INIT(incomplet_axe_OZ_valeur_standard,INCOMPLET_AXE_OZ_VALEUR_STANDARD));
DEFV(genere_Float,INIT(incomplet_axe_OZ_valeur_non_standard,INCOMPLET_AXE_OZ_VALEUR_NON_STANDARD));
/* Donne la valeur des images manquantes (ceci fut introduit le 20120322092127)... */
DEFV(Positive,INIT(demi_dimension_X,DEMI_DIMENSION_X));
DEFV(Positive,INIT(demi_dimension_Y,DEMI_DIMENSION_Y));
DEFV(Positive,INIT(demi_dimension_Z,DEMI_DIMENSION_Z));
/* Demi-dimension de la boite de calcul de la densite. */
DEFV(Float,INIT(facteur_du_niveau,FACTEUR_DU_NIVEAU));
/* Facteur du niveau. */
DEFV(Float,INIT(facteur_de_la_distance,FACTEUR_DE_LA_DISTANCE));
/* Facteur de la distance. */
DEFV(Float,INIT(exposant_de_la_distance,EXPOSANT_DE_LA_DISTANCE));
/* Exposant de la distance. */
DEFV(Logical,INIT(renormaliser_les_exponentielles,RENORMALISER_LES_EXPONENTIELLES));
/* Faut-il renormaliser ('VRAI') ou pas ('FAUX') les exponentielles ? */
/*..............................................................................................................................*/
BSaveModifyVariable(Logical,les_imagesR_sont_standards,FAUX);
/* Introduit le 20170727110358 afin d'assurer la compatibilite anterieure... */
BSaveModifyVariable(Logical,S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____utiliser_l_accelerateur,VRAI);
/* Introduit le 20120620092356... */
EGAL(valider_les_axes_OX_OY_OZ,VRAI);
EGAL(coefficient_de_forme_de_l_espace_tridimensionnel,COEFFICIENT_DE_FORME_DE_L_ESPACE_TRIDIMENSIONNEL);
/* Introduit le 20140105182452 lors de la mise au point de 'v $xiirv/PIPO.F1.21' a cause */
/* du probleme 'v $xiii/di_album$FON 20120321113814' qui se manifeste, par exemple, si */
/* l'axe 'OZ' est beaucoup plus "court" que les axes 'OX' et/ou 'OY'. */
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(GET_ARGUMENTS2_L("AFdensite_____compatibilite_20110908=""compatibilite_20110908="
,AFdensite_standard_____compatibilite_20110908
,AFdensite_non_standard_____compatibilite_20110908
);
/* Arguments introduits le 20110908082907... */
GET_ARGUMENTS2_L("AFdensite_____compatibilite_2014010308=""compatibilite_2014010308="
,AFdensite_standard_____compatibilite_2014010308
,AFdensite_non_standard_____compatibilite_2014010308
);
/* Arguments introduits le 20140103085308... */
GET_ARGUMENTS2_L("AFdensite_____compatibilite_2014010310=""compatibilite_2014010310="
,AFdensite_standard_____compatibilite_2014010310
,AFdensite_non_standard_____compatibilite_2014010310
);
/* Arguments introduits le 20140103104641... */
GET_ARGUMENTS2_L("AFdensite_____compatibilite_20170818=""compatibilite_20170818="
,AFdensite_standard_____compatibilite_20170818
,AFdensite_non_standard_____compatibilite_20170818
);
/* Arguments introduits le 20170818113633... */
GET_ARGUMENT_C("imageA=""A=",nom_albumA);
GET_ARGUMENT_C("imageR=""R=",nom_albumR);
GET_ARGUMENT_C("postfixe=",nom_postfixe);
GET_ARGUMENT_I("premiere=",premiere_image);
GET_ARGUMENTS2_I("pas=",pas_des_images,pasZ);
/* L'argument 'pasZ' fut introduit le 20110119140724... */
GET_ARGUMENT_I("chiffres=",nombre_de_chiffres);
GET_ARGUMENTS2_L("version_simplifiee=""simplifiee=""vs="
,AFdensite_standard_____version_simplifiee
,AFdensite_non_standard_____version_simplifiee
);
/* Arguments introduits le 20170730101127... */
GET_ARGUMENTS2_L("densite="
,AFdensite_standard_____calculer_effectivement_une_densite
,AFdensite_non_standard_____calculer_effectivement_une_densite
);
GET_ARGUMENTS2_N("neutre="
,AFdensite_standard_____calculer_effectivement_une_densite
,AFdensite_non_standard_____calculer_effectivement_une_densite
);
/* Arguments introduits le 20240829185946 afin de pouvoir accelerer */
/* 'v $xiirc/.MANE.41.2.$U .xci.densite_3D.11.X'... */
GET_ARGUMENTS2_F("ponderation_RdisF3D=""distance1=""d1="
,AFdensite_standard_____ponderation_RdisF3D
,AFdensite_non_standard_____ponderation_RdisF3D
);
GET_ARGUMENTS2_F("ponderation_ASdisF3D=""distance2=""d2="
,AFdensite_standard_____ponderation_ASdisF3D
,AFdensite_non_standard_____ponderation_ASdisF3D
);
/* Arguments introduits le 20170730101127... */
GET_ARGUMENT_L("inverser_Z=""inv_Z=",inverser_l_axe_OZ);
/* Argument introduit le 20100623084938... */
GET_ARGUMENT_L("incomplet_Z=""inc_Z=",incomplet_axe_OZ);
/* Argument introduit le 20120322085615... */
GET_ARGUMENT_P("valeur_standard_incomplet_Z=""vsinc_Z=",incomplet_axe_OZ_valeur_standard);
GET_ARGUMENT_F("valeur_non_standard_incomplet_Z=""vnsinc_Z=",incomplet_axe_OZ_valeur_non_standard);
/* Argument introduit le 20120322092127... */
GET_ARGUMENT_L("standardA=""standard=",les_imagesA_sont_standards);
/* Argument introduit le 20091124093047 et complete le 20170727110005 avec "standardA="... */
GET_ARGUMENT_L("standardR=",les_imagesR_sont_standards);
/* Argument introduit le 20170727110358... */
GET_ARGUMENTS2_F("facteur_normalisation_OX=""fnX=""fnx="
,AFdensite_standard_____facteur_de_normalisation_OX
,AFdensite_non_standard_____facteur_de_normalisation_OX
);
GET_ARGUMENTS2_F("facteur_normalisation_OY=""fnY=""fny="
,AFdensite_standard_____facteur_de_normalisation_OY
,AFdensite_non_standard_____facteur_de_normalisation_OY
);
GET_ARGUMENTS2_F("facteur_normalisation_OZ=""fnZ=""fnz="
,AFdensite_standard_____facteur_de_normalisation_OZ
,AFdensite_non_standard_____facteur_de_normalisation_OZ
);
/* Arguments introduits le 20140103115546... */
GET_ARGUMENTS2_L("super_echelle=""se="
,AFdensite_standard_____utiliser_la_super_echelle
,AFdensite_non_standard_____utiliser_la_super_echelle
);
/* Arguments introduits le 20101203155238... */
GET_ARGUMENTS2_L("rotation=""rot="
,AFdensite_standard_____faire_une_rotation
,AFdensite_non_standard_____faire_une_rotation
);
PROCESS_ARGUMENTS2_F("ROTATION_OX="
,AFdensite_standard_____angle_de_ROTATION_OX
,AFdensite_non_standard_____angle_de_ROTATION_OX
,BLOC(VIDE;)
,BLOC(EGAL(vecteurs_____ordre_de_la_ROTATION_0X,nombre_d_arguments_recuperes);
)
);
PROCESS_ARGUMENTS2_F("ROTATION_OY="
,AFdensite_standard_____angle_de_ROTATION_OY
,AFdensite_non_standard_____angle_de_ROTATION_OY
,BLOC(VIDE;)
,BLOC(EGAL(vecteurs_____ordre_de_la_ROTATION_0Y,nombre_d_arguments_recuperes);
)
);
PROCESS_ARGUMENTS2_F("ROTATION_OZ="
,AFdensite_standard_____angle_de_ROTATION_OZ
,AFdensite_non_standard_____angle_de_ROTATION_OZ
,BLOC(VIDE;)
,BLOC(EGAL(vecteurs_____ordre_de_la_ROTATION_0Z,nombre_d_arguments_recuperes);
)
);
/* Arguments introduits le 20101203121552... */
GET_ARGUMENT_L("AccelerateurALoadPoint=""AccALP="
,S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____utiliser_l_accelerateur
);
/* Arguments introduits le 20120310145627... */
GET_ARGUMENTS2_L("interpoler=""inter="
,FAload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement
,FFAload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement
);
GET_ARGUMENTS2_F("interpolerX=""interX="
,FAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_X
,FFAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_X
);
GET_ARGUMENTS2_F("interpolerY=""interY="
,FAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Y
,FFAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Y
);
GET_ARGUMENTS2_F("interpolerZ=""interZ="
,FAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Z
,FFAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Z
);
GET_ARGUMENTS2_L("lineaire=""bilineaire="
,FAload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire
,FFAload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire
);
GET_ARGUMENTS2_N("cubique=""bicubique="
,FAload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire
,FFAload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire
);
/* Arguments introduits le 20101203130503... */
GET_ARGUMENTS2_L("periodiser_X=""periodX="
,AFdensite_standard_____periodiser_X
,AFdensite_non_standard_____periodiser_X
);
GET_ARGUMENTS2_L("periodiser_Y=""periodY="
,AFdensite_standard_____periodiser_Y
,AFdensite_non_standard_____periodiser_Y
);
GET_ARGUMENTS2_L("periodiser_Z=""periodZ="
,AFdensite_standard_____periodiser_Z
,AFdensite_non_standard_____periodiser_Z
);
GET_ARGUMENTS2_L("symetriser_X=""symetrX="
,AFdensite_standard_____symetriser_X
,AFdensite_non_standard_____symetriser_X
);
GET_ARGUMENTS2_L("symetriser_Y=""symetrY="
,AFdensite_standard_____symetriser_Y
,AFdensite_non_standard_____symetriser_Y
);
GET_ARGUMENTS2_L("symetriser_Z=""symetrZ="
,AFdensite_standard_____symetriser_Z
,AFdensite_non_standard_____symetriser_Z
);
GET_ARGUMENTS2_L("prolonger_X=""prolX="
,AFdensite_standard_____prolonger_X
,AFdensite_non_standard_____prolonger_X
);
GET_ARGUMENTS2_L("prolonger_Y=""prolY="
,AFdensite_standard_____prolonger_Y
,AFdensite_non_standard_____prolonger_Y
);
GET_ARGUMENTS2_L("prolonger_Z=""prolZ="
,AFdensite_standard_____prolonger_Z
,AFdensite_non_standard_____prolonger_Z
);
GET_ARGUMENTS2_F("niveau_hors_album=""nha=""niveau_hors_image=""nhi=""niveau="
,AFdensite_standard_____niveau_hors_album
,AFdensite_non_standard_____niveau_hors_album
);
GET_ARGUMENT_I("dx=""dX=",demi_dimension_X);
GET_ARGUMENT_I("dy=""dY=",demi_dimension_Y);
GET_ARGUMENT_I("dz=""dZ=",demi_dimension_Z);
/* Je note le 20120227093911 qu'utiliser : */
/* */
/* dX=0 */
/* dY=0 */
/* dZ=0 */
/* AFdensite_____compatibilite_20110908=VRAI */
/* */
/* rend l'operation neutre et renvoie 'album_d_imagesR' identique a 'album_d_imagesA'... */
GET_ARGUMENTS3_I("dxyz=""dXYZ=",demi_dimension_X,demi_dimension_Y,demi_dimension_Z);
/* Arguments introduits le 20170730094543... */
GET_ARGUMENT_F("facteurN=""fN=",facteur_du_niveau);
GET_ARGUMENT_F("facteurD=""fD=",facteur_de_la_distance);
GET_ARGUMENT_F("exposant=""e=",exposant_de_la_distance);
GET_ARGUMENT_L("rn=""renormaliser=",renormaliser_les_exponentielles);
)
);
begin_nouveau_block
Bblock
BDEFV(albumF,album_d_imagesR);
/* Definition de l'album d'images Resultat... */
CALS(dAFinitialisation(album_d_imagesR,FZERO));
/* Initialisation de l'album Resultat. */
Test(EST_VRAI(les_imagesA_sont_standards))
/* Possibilite introduite le 20091124093047... */
Bblock
BDEFV(album,album_d_imagesA);
/* Definition de l'album d'images Argument "standard". */
CALi(idAload_album(album_d_imagesA
,nom_albumA
,nom_postfixe
,premiere_image
,pas_des_images
,nombre_de_chiffres
,FAUX
,UNDEF
,inverser_l_axe_OZ
,incomplet_axe_OZ
,incomplet_axe_OZ_valeur_standard
)
);
/* Chargement de l'album Argument "standard". */
/* */
/* L'argument'Inv' ('FAUX') a ete introduit le 20091125133934 et le 20100623084938 */
/* il fut parametre par 'inverser_l_axe_OZ'... */
Test(PAS_D_ERREUR(CODE_ERREUR))
Bblock
CALS(AFdensite_standard(album_d_imagesR
,album_d_imagesA
,demi_dimension_X
,demi_dimension_Y
,demi_dimension_Z
,facteur_du_niveau
,facteur_de_la_distance
,exposant_de_la_distance
,renormaliser_les_exponentielles
)
);
/* Calcul de la densite... */
Eblock
ATes
Bblock
Eblock
ETes
EDEFV(album,album_d_imagesA);
/* Definition de l'album d'images Argument "standard". */
Eblock
ATes
Bblock
BDEFV(albumF,album_d_imagesA);
/* Definition de l'album d'images Argument "non standard". */
CALi(idAloadF_album(album_d_imagesA
,nom_albumA
,nom_postfixe
,premiere_image
,pas_des_images
,nombre_de_chiffres
,FAUX
,UNDEF
,inverser_l_axe_OZ
,incomplet_axe_OZ
,incomplet_axe_OZ_valeur_non_standard
)
);
/* Chargement de l'album Argument... */
/* */
/* L'argument 'Inv' (='FAUX') a ete introduit le 20091125133934 et le 20100623084938 */
/* il fut parametre par 'inverser_l_axe_OZ'... */
Test(PAS_D_ERREUR(CODE_ERREUR))
Bblock
CALS(AFdensite_non_standard(album_d_imagesR
,album_d_imagesA
,demi_dimension_X
,demi_dimension_Y
,demi_dimension_Z
,facteur_du_niveau
,facteur_de_la_distance
,exposant_de_la_distance
,renormaliser_les_exponentielles
)
);
/* Calcul de la densite... */
Eblock
ATes
Bblock
Eblock
ETes
EDEFV(albumF,album_d_imagesA);
/* Definition de l'album d'images Argument "non standard". */
Eblock
ETes
Test(PAS_D_ERREUR(CODE_ERREUR))
/* Introduit le 20101207143707 (un peu tardivement...) car, en effet, il est plus logique */
/* de ne pas generer l'album 'nom_albumR' s'il y a eu erreur de chargement de l'album */
/* 'nom_albumA'... */
Bblock
Test(EST_VRAI(les_imagesR_sont_standards))
/* Possibilite introduite le 20170727110358... */
Bblock
BDEFV(albumF,album_d_imagesR_renormalise);
BDEFV(album,album_d_imagesR_standard);
/* Definition de l'album d'images Resultat avec pre-renormalisation. */
BSaveModifyVariable(genere_Float,AFnormalisation_____niveau_origine___de_normalisation,FLOT__NOIR);
BSaveModifyVariable(genere_Float,AFnormalisation_____niveau_extremite_de_normalisation,FLOT__BLANC);
DEFV(genere_Float,INIT(niveau_origine,FLOT__NIVEAU_UNDEF));
DEFV(genere_Float,INIT(niveau_extremite,FLOT__NIVEAU_UNDEF));
CALS(AFnivo_extrema(album_d_imagesR,ADRESSE(niveau_origine),ADRESSE(niveau_extremite)));
CALS(AFnormalisation(album_d_imagesR_renormalise,album_d_imagesR,niveau_origine,niveau_extremite));
/* Renormalisation essentielle introduite tardivement le 20170817190045 car, en effet, il */
/* n'y a aucune raison pour que les extrema soient dans [NOIR,BLANC]. Cela s'est vu a cette */
/* date lors de la generation de 'v $xiirf/FRB3.z4.8.21'... */
ESaveModifyVariable(genere_Float,AFnormalisation_____niveau_extremite_de_normalisation);
ESaveModifyVariable(genere_Float,AFnormalisation_____niveau_origine___de_normalisation);
CALS(Afloat_std_brutal(album_d_imagesR_standard,album_d_imagesR_renormalise));
/* Conversion de l'album Resultat non standard en un album standard... */
CALi(dAupdate_album(nom_albumR
,nom_postfixe
,premiere_image
,pas_des_images
,album_d_imagesR_standard
,nombre_de_chiffres
,FAUX
)
);
EDEFV(album,album_d_imagesR_standard);
EDEFV(albumF,album_d_imagesR_renormalise);
/* Definition de l'album d'images Resultat avec pre-renormalisation. */
Eblock
ATes
Bblock
CALi(dAupdateF_album(nom_albumR
,nom_postfixe
,premiere_image
,pas_des_images
,album_d_imagesR
,nombre_de_chiffres
,FAUX
)
);
/* L'argument 'Inv' (='FAUX') a ete introduit le 20100624091525... */
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
EDEFV(albumF,album_d_imagesR);
/* Definition de l'album d'images Resultat... */
Eblock
end_nouveau_block
ESaveModifyVariable(Logical,S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____utiliser_l_accelerateur);
ESaveModifyVariable(Logical,les_imagesR_sont_standards);
RETU_Commande;
Eblock
ECommande