/*************************************************************************************************************************************/
/* */
/* V I S U A L I S A T I O N D E L A L I S T E D E S P O I N T S : */
/* */
/* */
/* Author of '$xrv/champs_5.12$I' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1992??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G E S T I O N D E S O M B R E S P O R T E E S : */
/* */
/*************************************************************************************************************************************/
#define GERER_LES_OMBRES_PORTEES \
FAUX
DEFV(Local,DEFV(Logical,INIT(gerer_les_ombres_portees,GERER_LES_OMBRES_PORTEES)));
/* Faut-il gerer les ombres portees ? Cette possibilite fut introduite le 20220508102801. */
/* La valeur par defaut assure la compatibilite anterieure... */
#TestADef GESTION_DES_OMBRES_PORTEES_____COMPATIBILITE_20220522 \
FAUX
DEFV(Local,DEFV(Logical,INIT(gestion_des_ombres_portees_____compatibilite_20220522
,GESTION_DES_OMBRES_PORTEES_____COMPATIBILITE_20220522
)
)
);
/* Afin d'assurer la compatibilite avec les resultats obtenus anterieurement a la date */
/* du 20220522135138... */
#TestADef GESTION_DES_OMBRES_PORTEES_____COMPATIBILITE_2022060711 \
FAUX
DEFV(Local,DEFV(Logical,INIT(gestion_des_ombres_portees_____compatibilite_2022060711
,GESTION_DES_OMBRES_PORTEES_____COMPATIBILITE_2022060711
)
)
);
/* Afin d'assurer la compatibilite avec les resultats obtenus anterieurement a la date */
/* du 20220607115736... */
#TestADef GESTION_DES_OMBRES_PORTEES_____COMPATIBILITE_2022060712 \
FAUX
DEFV(Local,DEFV(Logical,INIT(gestion_des_ombres_portees_____compatibilite_2022060712
,GESTION_DES_OMBRES_PORTEES_____COMPATIBILITE_2022060712
)
)
);
/* Afin d'assurer la compatibilite avec les resultats obtenus anterieurement a la date */
/* du 20220607123914... */
#define SEUIL_ANGULAIRE_DE_DECLENCHEMENT_DE_L_OMBRAGE \
GRO2(FRA10(FRA10(FU)))
#define ANGLE_D_INFLEXION_DE_L_OMBRAGE \
FRA2(SEUIL_ANGULAIRE_DE_DECLENCHEMENT_DE_L_OMBRAGE)
DEFV(Local,DEFV(Float,INIT(seuil_angulaire_de_declenchement_de_l_ombrage,SEUIL_ANGULAIRE_DE_DECLENCHEMENT_DE_L_OMBRAGE)));
DEFV(Local,DEFV(Float,INIT(angle_d_inflexion_de_l_ombrage,ANGLE_D_INFLEXION_DE_L_OMBRAGE)));
/* Seuil en deca duquel on declare que le point est a l'ombre et angle d'inflexion de */
/* 'TAHX01(...)'. */
#define FACTEUR_DE_L_ANGLE_D_OMBRAGE \
FLOT(CENT)
#define NIVEAU_D_OMBRAGE__ \
GRO1(FRA2(FU))
#define NIVEAU_D_ECLAIRAGE \
GRO1(FRA1(FU))
DEFV(Local,DEFV(Float,INIT(facteur_de_l_angle_d_ombrage,FACTEUR_DE_L_ANGLE_D_OMBRAGE)));
DEFV(Local,DEFV(Float,INIT(niveau_d_ombrage__,NIVEAU_D_OMBRAGE__)));
DEFV(Local,DEFV(Float,INIT(niveau_d_eclairage,NIVEAU_D_ECLAIRAGE)));
/* Definition de l'ombre et de la zone de penombre... */
/* */
/* Ainsi la zone de penombre varie de 'niveau_d_ombrage__' a 'niveau_d_eclairage' */
/* suivant une tangente hyperbolique dans [0,1]... */
/* */
/* Voir 'v $xtc/TANH.01$c' pour regler les trois parametres... */
#define FACTEUR1_DU_RAPPORT_DES_RAYONS_D_OMBRAGE \
FU
DEFV(Local,DEFV(Float,INIT(facteur1_du_rapport_des_rayons_d_ombrage,FACTEUR1_DU_RAPPORT_DES_RAYONS_D_OMBRAGE)));
/* Facteur 1 du rapport des rayons d'ombrage. */
#define BORNE_INFERIEURE_DU_RAPPORT_DES_RAYONS_D_OMBRAGE \
FDU
#define BORNE_SUPERIEURE_DU_RAPPORT_DES_RAYONS_D_OMBRAGE \
FDEUX
DEFV(Local,DEFV(Float,INIT(borne_inferieure_du_rapport_des_rayons_d_ombrage,BORNE_INFERIEURE_DU_RAPPORT_DES_RAYONS_D_OMBRAGE)));
DEFV(Local,DEFV(Float,INIT(borne_superieure_du_rapport_des_rayons_d_ombrage,BORNE_SUPERIEURE_DU_RAPPORT_DES_RAYONS_D_OMBRAGE)));
/* Introduit le 20220607133039 afin de limiter les effets de la modulation de l'attenuation */
/* avec le rapport des rayons... */
#define FACTEUR2_DU_RAPPORT_DES_RAYONS_D_OMBRAGE \
GRO4(FRA10(FU))
DEFV(Local,DEFV(Float,INIT(facteur2_du_rapport_des_rayons_d_ombrage,FACTEUR2_DU_RAPPORT_DES_RAYONS_D_OMBRAGE)));
/* Facteur 2 du rapport des rayons d'ombrage, une valeur nulle inhibant cet effet... */
gDEFINITION_LISTE(liste_des_ANGLES_D_OMBRAGE,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES);
gDEFINITION_LISTE(liste_des_RAYONS_D_OMBRAGE,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES);
/* Ces listes ne sont utiles que si les ombres portees sont gerees... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N D E V I S U A L I S A T I O N D U P O I N T C O U R A N T : */
/* */
/*************************************************************************************************************************************/
#define ATTENUATION_AU_BORD_D_UN_DISQUE \
GRO1(FRA8(FU)) \
/* Valeur implicite du facteur d'attenuation au bord des disques materialisant les */ \
/* spheres. */
DEFV(Local,DEFV(Float,INIT(attenuation_au_bord_d_un_disque,ATTENUATION_AU_BORD_D_UN_DISQUE)));
/* Facteur d'attenuation au bord des disques materialisant les spheres. */
/* */
/* ATTENTION, ce parametre 'attenuation_au_bord_d_un_disque' ("attenuation_au_bord=") */
/* associe au parametre 'epaisseur_de_la_couronne_d_anti_aliasing' ("couronne=") peut, */
/* comme cela s'est vu en generant la sequence : */
/* */
/* xivPdf 9 2 / 026783_027294 */
/* */
/* avoir des effets visuels genants en ce qui concerne le rayon apparent des spheres */
/* (c'est-a-dire tel qu'elles sont vues). Il peut etre alors necessaire de "tricher" en */
/* augmentant le rayon (d'ou le parametre '$_____FacteurPsI' inferieur a 1 dans la dite */
/* sequence...). */
#define NIVEAU_AU_BORD_D_UN_DISQUE(niveau) \
NIVA(INTE(MUL2(attenuation_au_bord_d_un_disque,FLOT(NIVR(niveau))))) \
/* Niveau au bord d'un disque visualisant une sphere en vraies couleurs... */
BFonctionI
DEFV(Local,DEFV(FonctionI,visualisation_d_un_point(Xf,Yf,Zf
,rayon_reel_absolu
,rayon_reel_de_visualisation
,niveau_ROUGE_normalise,niveau_VERTE_normalise,niveau_BLEUE_normalise
)
)
)
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
/* Definition de la position {x,y,z} du point courant dans l'espace de visualisation, */
DEFV(Argument,DEFV(Float,rayon_reel_absolu));
DEFV(Argument,DEFV(Float,rayon_reel_de_visualisation));
/* Du rayon de sa sphere de materialisation (Absolu et de Visualisation). */
DEFV(Argument,DEFV(Float,niveau_ROUGE_normalise));
DEFV(Argument,DEFV(Float,niveau_VERTE_normalise));
DEFV(Argument,DEFV(Float,niveau_BLEUE_normalise));
/* Et de sa couleur... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
/*..............................................................................................................................*/
store_sphere(NIVEAU_AU_BORD_D_UN_DISQUE(niveau_ROUGE_normalise)
,NIVEAU_AU_BORD_D_UN_DISQUE(niveau_VERTE_normalise)
,NIVEAU_AU_BORD_D_UN_DISQUE(niveau_BLEUE_normalise)
,niveau_ROUGE_normalise
,niveau_VERTE_normalise
,niveau_BLEUE_normalise
,Image_ROUGE
,Image_VERTE
,Image_BLEUE
,Xf
,Yf
,Zf
,rayon_reel_absolu
,rayon_reel_de_visualisation
);
/* Et visualisation du point courant... */
RETU_ERROR;
Eblock
EFonctionI
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* V I S U A L I S A T I O N D ' U N E L I S T E D E P O I N T S S A N S R E N O R M A L I S A T I O N : */
/* */
/*************************************************************************************************************************************/
#define NO_RENORMALISATION \
FU \
/* Valeur a donner au couple de facteurs de renormalisation si l'on souhaite que cette */ \
/* derniere operation soit neutre... */
#define VISUALISATION_D_UNE_LISTE_DE_POINTS(numero_image) \
Bblock \
VISUALISATION_D_UNE_LISTE_DE_POINTS_AVEC_RENORMALISATION(NO_RENORMALISATION,NO_RENORMALISATION \
,NO_RENORMALISATION,NO_RENORMALISATION \
,NO_RENORMALISATION,NO_RENORMALISATION \
,numero_image \
); \
/* Visualisation de la liste de points avec une renormalisation "neutre" (1/1)... */ \
Eblock \
/* Visualisation d'une liste de points sans renormalisation finale des niveaux. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* V I S U A L I S A T I O N D ' U N E L I S T E D E P O I N T S A V E C R E N O R M A L I S A T I O N : */
/* */
/*************************************************************************************************************************************/
#define EDITER_LE_NOMBRE_DE_POINTS_A_VISUALISER \
FAUX
DEFV(Local,DEFV(Logical,INIT(editer_le_nombre_de_points_a_visualiser,EDITER_LE_NOMBRE_DE_POINTS_A_VISUALISER)));
/* Faut-il editer le nombre de points a visualiser (introduit le 20050619182851). */
#define mTRONCATION_NORMALISATION(niveau,seuil_inferieur,seuil_superieur) \
TRON(__DENORMALISE_NIVEAU(niveau) \
,seuil_inferieur \
,seuil_superieur \
) \
/* Normalisation, puis troncation des niveaux... */
BFonctionF
DEFV(Local,DEFV(FonctionF,troncation_normalisation(niveau,seuil_inferieur,seuil_superieur)))
/* ATTENTION, cette fonction a ete introduite afin de reduire la complexite des programmes */
/* '$c' generes, en particulier sur les SYSTEMEs 'SYSTEME_NWS3000_NEWSOS_2CC' et */
/* 'SYSTEME_VAX9000_ULTRIX_GCC'. */
DEFV(Argument,DEFV(Float,niveau));
/* Definition du niveau a normaliser puis a tronquer... */
DEFV(Argument,DEFV(genere_p,seuil_inferieur));
DEFV(Argument,DEFV(genere_p,seuil_superieur));
/* Definition des seuils inferieur et superieur du niveau a normaliser puis a tronquer... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(mTRONCATION_NORMALISATION(niveau,seuil_inferieur,seuil_superieur));
Eblock
EFonctionF
#define TRONCATION_NORMALISATION(niveau,seuil_inferieur,seuil_superieur) \
troncation_normalisation(FLOT(niveau),GENP(seuil_inferieur),GENP(seuil_superieur)) \
/* Normalisation, puis troncation des niveaux... */
#define DEPTH_CUEING_DES_POINTS(niveau,aCOULEUR,nCOULEUR,seuil_inferieur,seuil_superieur) \
SCAL(ATTENUATION_DE_DEPTH_CUEING(ATTENUATION(TRONCATION_NORMALISATION(niveau,seuil_inferieur,seuil_superieur) \
,ACCES_LISTE(liste_des_numeros,index_de_visualisation) \
) \
,ACCES_LISTE(liste_des_Z,index_de_visualisation) \
) \
,aCOULEUR \
,nCOULEUR \
) \
/* Prise en compte de l'eventuel effet de "depth-cueing" et de toutes les operations de */ \
/* normalisation, de seuillage,... */ \
/* */ \
/* En resume, et en notant : */ \
/* */ \
/* pm = profondeur_minimale */ \
/* pM = profondeur_maximale */ \
/* */ \
/* pmT = profondeur_minimale_de_troncation */ \
/* pMT = profondeur_maximale_de_troncation */ \
/* */ \
/* la formule "simplifiee" de transformation d'un niveau 'N' est : */ \
/* */ \
/* N*TRON[z*(pM-pm)+pm,pmT,pMT] */ \
/* */ \
/* Note sur l'absence de "depth-cueing" : celle-ci est obtenu simplement en faisant : */ \
/* */ \
/* profondeur_minimale = COORDONNEE_BARYCENTRIQUE_MAXIMALE */ \
/* profondeur_maximale = COORDONNEE_BARYCENTRIQUE_MAXIMALE */ \
/* */ \
/* profondeur_minimale_de_troncation = COORDONNEE_BARYCENTRIQUE_MAXIMALE */ \
/* profondeur_maximale_de_troncation = COORDONNEE_BARYCENTRIQUE_MAXIMALE */ \
/* */ \
/* soit : */ \
/* */ \
/* minimum=Zminimum=1.0 */ \
/* maximum=Zmaximum=1.0 */ \
/* */ \
/* minimumT=ZminimumT=1.0 */ \
/* maximumT=ZmaximumT=1.0 */ \
/* */ \
/* */ \
/* Note sur le "depth-cueing" maximal : celle-ci est obtenu simplement en faisant : */ \
/* */ \
/* profondeur_minimale = COORDONNEE_BARYCENTRIQUE_MINIMALE */ \
/* profondeur_maximale = COORDONNEE_BARYCENTRIQUE_MAXIMALE */ \
/* */ \
/* profondeur_minimale_de_troncation = COORDONNEE_BARYCENTRIQUE_MINIMALE */ \
/* profondeur_maximale_de_troncation = COORDONNEE_BARYCENTRIQUE_MAXIMALE */ \
/* */ \
/* soit : */ \
/* */ \
/* minimum=Zminimum=0.0 */ \
/* maximum=Zmaximum=1.0 */ \
/* */ \
/* minimumT=ZminimumT=0.0 */ \
/* maximumT=ZmaximumT=1.0 */ \
/* */ \
/* ATTENTION, on notera bien que les valeurs {profondeur_minimale,profondeur_maximale} */ \
/* et {profondeur_minimale_de_troncation,profondeur_maximale_de_troncation} ne sont donc */ \
/* absolument pas synonymes. On pourra donc pour jouer sur le "depth-cueing" utiliser */ \
/* systematiquement les arguments suivants : */ \
/* */ \
/* Zmaximum=1.0 */ \
/* ZmaximumT=1.0 */ \
/* */ \
/* et a "moduler" : */ \
/* */ \
/* Zminimum=VALEUR */ \
/* ZminimumT=VALEUR */ \
/* */ \
/* ou 'VALEUR' est une valeur dans [0,1] pour laquelle '1.0' est l'absence de "depth-cueing" */ \
/* et '0.0' donne le "depth-cueing" maximal... */
#ifdef __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND
/* Le nom 'PERMETTRE_L_UTILISATION_D_UN_FOND' a ete change le 20030313151843 en */
/* '__VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' afin de permettre sa recuperation */
/* dans 'v $xcc/cpp$Z _VERSION_'. */
# define INITIALISATION_DU_Z_BUFFER_D_UNE_IMAGE(numero_image) \
Bblock \
Test(EST_FAUX(le_fond_a_un_Z_Buffer)) \
Bblock \
CALi(IFinitialisation(Z_Buffer,valeur_d_initialisation_du_Z_Buffer)); \
/* Initialisation du 'Z-Buffer' ; cette initialisation est faite de facon a ce que la */ \
/* renormalisation du 'Z-Buffer', faite si un effet de brume est demande, soit correcte */ \
/* et homogene d'une image a l'autre. C'est aussi la raison pour laquelle les fonctions */ \
/* 'Iinit_Z_Buffer(...)' et 'Ifloat_std_du_Z_Buffer(...)' ne sont pas utilisees... */ \
Eblock \
ATes \
Bblock \
DEFV(CHAR,INIT(POINTERc(nom_temporaire_du_Z_Buffer_a_charger) \
,COND(EST_VRAI(le_fond_est_dynamique) \
,chain_Aconcaten2_sauf_nom_pipe(nom_imageZF,NUMERO_IMAGE(numero_image)) \
,nom_imageZF \
) \
) \
); \
CALi(IloadF_image(Z_Buffer,nom_temporaire_du_Z_Buffer_a_charger)); \
CALZ_FreCC(nom_temporaire_du_Z_Buffer_a_charger); \
/* Chargement du 'Z-Buffer' lorsque le fond en possede un... */ \
Eblock \
ETes \
Eblock \
/* Initialisation du 'Z-Buffer' de l'image a generer... */
#Aifdef __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND
# define INITIALISATION_DU_Z_BUFFER_D_UNE_IMAGE(numero_image) \
Bblock \
CALi(IFinitialisation(Z_Buffer,valeur_d_initialisation_du_Z_Buffer)); \
/* Initialisation du 'Z-Buffer' ; cette initialisation est faite de facon a ce que la */ \
/* renormalisation du 'Z-Buffer', faite si un effet de brume est demande, soit correcte */ \
/* et homogene d'une image a l'autre. C'est aussi la raison pour laquelle les fonctions */ \
/* 'Iinit_Z_Buffer(...)' et 'Ifloat_std_du_Z_Buffer(...)' ne sont pas utilisees... */ \
Eblock \
/* Initialisation du 'Z-Buffer' de l'image a generer... */
#Eifdef __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND
#define MODULER_LE_RAYON_DE_VISUALISATION_AVEC_LA_PROFONDEUR \
FAUX
DEFV(Local,DEFV(Logical,INIT(moduler_le_rayon_de_visualisation_avec_la_profondeur
,MODULER_LE_RAYON_DE_VISUALISATION_AVEC_LA_PROFONDEUR
)
)
);
#define PARAM_A_MODULATION_DU_RAYON_DE_VISUALISATION_AVEC_LA_PROFONDEUR \
FU
DEFV(Local,DEFV(Float,INIT(param_A_modulation_du_rayon_de_visualisation_avec_la_profondeur
,PARAM_A_MODULATION_DU_RAYON_DE_VISUALISATION_AVEC_LA_PROFONDEUR
)
)
);
#define PARAM_B_MODULATION_DU_RAYON_DE_VISUALISATION_AVEC_LA_PROFONDEUR \
FU
DEFV(Local,DEFV(Float,INIT(param_B_modulation_du_rayon_de_visualisation_avec_la_profondeur
,PARAM_B_MODULATION_DU_RAYON_DE_VISUALISATION_AVEC_LA_PROFONDEUR
)
)
);
/* Introduit le 20050419141720 afin de moduler 'rayon_reel_de_visualisation' avec 'Zf'... */
/* Les parametres {A,B} sont choisis de facon a ce que pour un 'Zf' nul, le rayon ne change */
/* pas et qu'il augmente ensuite avec 'Zf"... */
#ifndef CENTRER_AUTOMATIQUEMENT_LES_COORDONNEES
# include xrk/attractor.51.I"
/* Introduit le 20061110084827 a cause, en particulier, des '$K' de '$xrq'. */
#Aifndef CENTRER_AUTOMATIQUEMENT_LES_COORDONNEES
#Eifndef CENTRER_AUTOMATIQUEMENT_LES_COORDONNEES
#TestADef OPTIMISATION_DU_TRI_DES_POINTS_____COMPATIBILITE_2008030911 \
FAUX
DEFV(Local,DEFV(Logical,INIT(optimisation_du_tri_des_points_____compatibilite_2008030911
,OPTIMISATION_DU_TRI_DES_POINTS_____COMPATIBILITE_2008030911
)
)
);
/* Afin d'assurer la compatibilite avec les resultats obtenus anterieurement a la date */
/* du 20080309112355... */
#include xrv/champs_5.1E.I"
/* Mis sous cette forme le 20180823191034... */
#define VISUALISATION_D_UNE_LISTE_DE_POINTS_AVEC_RENORMALISATION(aROUGE,nROUGE,aVERTE,nVERTE,aBLEUE,nBLEUE,numero_image) \
Bblock \
DEFV(Float,INIT(translation_de_centrage_des_coordonnees_X,FZERO)); \
DEFV(Float,INIT(translation_de_centrage_des_coordonnees_Y,FZERO)); \
DEFV(Float,INIT(translation_de_centrage_des_coordonnees_Z,FZERO)); \
/* Translations des coordonnees {X,Y,Z}, nulles par defaut... */ \
\
DEFV(Float,INIT(coordonnee_X__du_point_precedent,FLOT__UNDEF)); \
DEFV(Float,INIT(coordonnee_Y__du_point_precedent,FLOT__UNDEF)); \
DEFV(Float,INIT(coordonnee_Z__du_point_precedent,FLOT__UNDEF)); \
DEFV(Float,INIT(rayon_________du_point_precedent,FLOT__UNDEF)); \
DEFV(Float,INIT(couleur_ROUGE_du_point_precedent,FLOT__UNDEF)); \
DEFV(Float,INIT(couleur_VERTE_du_point_precedent,FLOT__UNDEF)); \
DEFV(Float,INIT(couleur_BLEUE_du_point_precedent,FLOT__UNDEF)); \
/* Definition du point precedent (introduit le 20080309112355). */ \
\
Test(IL_FAUT(editer_le_nombre_de_points_a_visualiser)) \
Bblock \
CAL2(Prin1("nombre de points a visualiser=%d\n" \
,NBRE(PREMIER_POINT_DES_LISTES,index_de_rangement_dans_la_liste) \
) \
); \
/* Edition introduite le 20050619182851 car cela peut-etre utile... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(centrer_automatiquement_les_coordonnees)) \
/* Possibilite introduite le 20060922134949... */ \
Bblock \
DEFV(Float,INIT(minimum_des_coordonnees_X,F_INFINI)); \
DEFV(Float,INIT(minimum_des_coordonnees_Y,F_INFINI)); \
DEFV(Float,INIT(minimum_des_coordonnees_Z,F_INFINI)); \
/* Minima des coordonnees {X,Y,Z}... */ \
DEFV(Float,INIT(maximum_des_coordonnees_X,F_MOINS_L_INFINI)); \
DEFV(Float,INIT(maximum_des_coordonnees_Y,F_MOINS_L_INFINI)); \
DEFV(Float,INIT(maximum_des_coordonnees_Z,F_MOINS_L_INFINI)); \
/* Maxima des coordonnees {X,Y,Z}... */ \
\
DoIn(index_d_extraction_de_la_liste,PREMIER_POINT_DES_LISTES,index_de_rangement_dans_la_liste,I) \
Bblock \
/* On notera que l'on utilise pas {minimum_de_cx,minimum_de_cy,minimum_de_cz} car, en */ \
/* effet, les coordonnees {X,Y,Z} manipulees ici sont dans [0,1] et non plus dans */ \
/* l'espace physique... */ \
EGAL(minimum_des_coordonnees_X \
,MIN2(minimum_des_coordonnees_X,ACCES_LISTE(liste_des_X,index_d_extraction_de_la_liste)) \
); \
EGAL(maximum_des_coordonnees_X \
,MAX2(maximum_des_coordonnees_X,ACCES_LISTE(liste_des_X,index_d_extraction_de_la_liste)) \
); \
/* Extrema des coordonnees 'X'... */ \
EGAL(minimum_des_coordonnees_Y \
,MIN2(minimum_des_coordonnees_Y,ACCES_LISTE(liste_des_Y,index_d_extraction_de_la_liste)) \
); \
EGAL(maximum_des_coordonnees_Y \
,MAX2(maximum_des_coordonnees_Y,ACCES_LISTE(liste_des_Y,index_d_extraction_de_la_liste)) \
); \
/* Extrema des coordonnees 'Y'... */ \
EGAL(minimum_des_coordonnees_Z \
,MIN2(minimum_des_coordonnees_Z,ACCES_LISTE(liste_des_Z,index_d_extraction_de_la_liste)) \
); \
EGAL(maximum_des_coordonnees_Z \
,MAX2(maximum_des_coordonnees_Z,ACCES_LISTE(liste_des_Z,index_d_extraction_de_la_liste)) \
); \
/* Extrema des coordonnees 'Z'... */ \
Eblock \
EDoI \
\
Test(IL_FAUT(centrer_automatiquement_la_coordonnee_X)) \
Bblock \
/* Test introduit le 20131121075654... */ \
EGAL(translation_de_centrage_des_coordonnees_X \
,ADD2(COORDONNEE_BARYCENTRIQUE_CENTRALE \
,NEGA(MOYE(minimum_des_coordonnees_X,maximum_des_coordonnees_X)) \
) \
); \
/* Translations des coordonnees 'X' a utiliser... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(centrer_automatiquement_la_coordonnee_Y)) \
Bblock \
/* Test introduit le 20131121075654... */ \
EGAL(translation_de_centrage_des_coordonnees_Y \
,ADD2(COORDONNEE_BARYCENTRIQUE_CENTRALE \
,NEGA(MOYE(minimum_des_coordonnees_Y,maximum_des_coordonnees_Y)) \
) \
); \
/* Translations des coordonnees 'Y' a utiliser... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(centrer_automatiquement_la_coordonnee_Z)) \
Bblock \
/* Test introduit le 20131121075654... */ \
EGAL(translation_de_centrage_des_coordonnees_Z \
,ADD2(COORDONNEE_BARYCENTRIQUE_CENTRALE \
,NEGA(MOYE(minimum_des_coordonnees_Z,maximum_des_coordonnees_Z)) \
) \
); \
/* Translations des coordonnees 'Z' a utiliser... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
INITIALISATION_DU_Z_BUFFER_D_UNE_IMAGE(numero_image); \
/* Initialisation du 'Z-Buffer'. */ \
\
CLIR(compteur_des_spheres_dans_l_image); \
/* Afin de compter les spheres dans l'image (eventuellement "clippee" et/ou cachee par */ \
/* d'autres...). */ \
\
Test(IL_FAUT(gerer_les_ombres_portees)) \
Bblock \
/* Possibilite introduite le 20220508102801... */ \
/* */ \
/* Je note le 20220522133100 que cette gestion est evidemment simpliste et peut donner */ \
/* des resultats parfois absurdes : c'est par exemple le cas d'un Grosse sphere 'gS' a */ \
/* l'ombre d'une plus Petite 'pS'. C'est alors l'integralite de la surface de 'gS' qui */ \
/* sera ombragee alors qu'en realite seule une petite partie devrait l'etre. Malheureusement */ \
/* cela ne peut etre corrige puisque le traitement qui va suivre ne prende en compte que */ \
/* coordonnees {X,Y,Z} du centre de chaque sphere, en ignorant le rayon. Une petite */ \
/* amelioration pourrait etre de faire que 'attenuation_a_l_ombre' devienne de plus soit */ \
/* une fonction croissante du rayon de la sphere qui fait de l'ombre, soit une fonction */ \
/* decroissante du rayon de la sphere a l'ombre... */ \
/* */ \
/* Les defauts mentionnes ci-dessus ont ete corriges partiellement le 20220522135138 en */ \
/* prenant en compte le rapport entre le rayon de la particule faisant de l'ombre et le */ \
/* rayon de celle qui est a l'ombre... */ \
\
DEFV(Int,INIT(index1,UNDEF)); \
\
DoIn(index1,PREMIER_POINT_DES_LISTES,index_de_rangement_dans_la_liste,I) \
Bblock \
EGAL(ACCES_LISTE(liste_des_ANGLES_D_OMBRAGE,index1),F_INFINI); \
Eblock \
EDoI \
\
DoIn(index1,PREMIER_POINT_DES_LISTES,index_de_rangement_dans_la_liste,I) \
/* Parcours de la liste des 'Point1's (qui seront joints a la source lumineuse)... */ \
Bblock \
DEFV(Float,INIT(Point1_X,ACCES_LISTE(liste_des_X,index1))); \
DEFV(Float,INIT(Point1_Y,ACCES_LISTE(liste_des_Y,index1))); \
DEFV(Float,INIT(Point1_Z,ACCES_LISTE(liste_des_Z,index1))); \
\
DEFV(Float,INIT(distance_Point1_SourceLumineuse,FLOT__UNDEF)); \
\
EGAL(distance_Point1_SourceLumineuse \
,RdisF3D(Point1_X \
,Point1_Y \
,Point1_Z \
,ASD1(Lsource,x) \
,ASD1(Lsource,y) \
,ASD1(Lsource,z) \
) \
); \
Test(IZEQ(distance_Point1_SourceLumineuse)) \
Bblock \
/* Cas ou le 'Point1' est confondu avec la source lumineuse... */ \
Eblock \
ATes \
Bblock \
DEFV(Int,INIT(index2,UNDEF)); \
\
DEFV(vectorF_3D,Vecteur_SourceLumineuse_Point1); \
\
INITIALISATION_VECTEUR_3D(Vecteur_SourceLumineuse_Point1 \
,ASD1(Lsource,x) \
,ASD1(Lsource,y) \
,ASD1(Lsource,z) \
,Point1_X \
,Point1_Y \
,Point1_Z \
); \
/* Definition du rayon lumineux passant par le point 'Point1'... */ \
\
DoIn(index2,PREMIER_POINT_DES_LISTES,index_de_rangement_dans_la_liste,I) \
/* Parcours de la liste des 'Point2's (qui seront joints au point 'Point1')... */ \
Bblock \
DEFV(Float,INIT(Point2_X,ACCES_LISTE(liste_des_X,index2))); \
DEFV(Float,INIT(Point2_Y,ACCES_LISTE(liste_des_Y,index2))); \
DEFV(Float,INIT(Point2_Z,ACCES_LISTE(liste_des_Z,index2))); \
\
Test(I3ET(IFEQ(Point2_X,Point1_X) \
,IFEQ(Point2_Y,Point1_Y) \
,IFEQ(Point2_Z,Point1_Z) \
) \
) \
Bblock \
/* Cas ou les 'Point1' et 'Point2' sont confondus... */ \
Eblock \
ATes \
Bblock \
DEFV(Float,INIT(distance_Point2_SourceLumineuse,FLOT__UNDEF)); \
\
EGAL(distance_Point2_SourceLumineuse \
,RdisF3D(Point2_X \
,Point2_Y \
,Point2_Z \
,ASD1(Lsource,x) \
,ASD1(Lsource,y) \
,ASD1(Lsource,z) \
) \
); \
/* Distance entre le point 'Point2' (different du point 'Point1' a la source lumineuses. */ \
\
Test(IZEQ(distance_Point2_SourceLumineuse)) \
Bblock \
/* Cas ou le 'Point2' est confondu avec la source lumineuse... */ \
Eblock \
ATes \
Bblock \
Test(IFGT(distance_Point2_SourceLumineuse,distance_Point1_SourceLumineuse)) \
Bblock \
/* Cas ou le point 'Point2' est plus loin que le point 'Point1' de la source lumineuse. */ \
/* Le point 'Point2' peut etre a l'ombre du point 'Point1' : */ \
DEFV(vectorF_3D,Vecteur_Point1_Point2); \
DEFV(Float,INIT(angle_d_ombrage,FLOT__UNDEF)); \
\
INITIALISATION_VECTEUR_3D(Vecteur_Point1_Point2 \
,Point1_X \
,Point1_Y \
,Point1_Z \
,Point2_X \
,Point2_Y \
,Point2_Z \
); \
/* Definition du vecteur allant de 'Point1' a 'Point2'... */ \
\
EGAL(angle_d_ombrage \
,ACOX(DIVI(prsF3D(Vecteur_SourceLumineuse_Point1,Vecteur_Point1_Point2) \
,MUL2(normF3D(Vecteur_SourceLumineuse_Point1) \
,normF3D(Vecteur_Point1_Point2) \
) \
) \
) \
); \
\
Test(IFLT(angle_d_ombrage,ACCES_LISTE(liste_des_ANGLES_D_OMBRAGE,index2))) \
Bblock \
EGAL(ACCES_LISTE(liste_des_ANGLES_D_OMBRAGE,index2),angle_d_ombrage); \
EGAL(ACCES_LISTE(liste_des_RAYONS_D_OMBRAGE,index2) \
,ACCES_LISTE(liste_des_vRAYON,index1) \
); \
/* Ainsi, on ne conserve que l'angle le plus faible correspondant donc au meilleur */ \
/* alignement entre 'Point1', 'Point2' et la source lumineuse.... */ \
Eblock \
ATes \
Bblock \
Test(IFEQ(angle_d_ombrage,ACCES_LISTE(liste_des_ANGLES_D_OMBRAGE,index2))) \
/* Test introduit le 20220607123914... */ \
Bblock \
Test(IL_FAUT(gestion_des_ombres_portees_____compatibilite_2022060712)) \
Bblock \
Eblock \
ATes \
Bblock \
EGAL(ACCES_LISTE(liste_des_RAYONS_D_OMBRAGE,index2) \
,MAX2(ACCES_LISTE(liste_des_RAYONS_D_OMBRAGE,index2) \
,ACCES_LISTE(liste_des_vRAYON,index1) \
) \
); \
/* Ainsi, c'est la plus grosse particule qui fait de l'ombre en cas d'egalite de */ \
/* 'angle_d_ombrage' (introduit le 20220607123914)... */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ETes \
Eblock \
ETes \
Eblock \
EDoI \
Eblock \
ETes \
Eblock \
EDoI \
\
DoIn(index1,PREMIER_POINT_DES_LISTES,index_de_rangement_dans_la_liste,I) \
Bblock \
DEFV(Float,INIT(angle_d_ombrage,ACCES_LISTE(liste_des_ANGLES_D_OMBRAGE,index1))); \
DEFV(Float,INIT(rapport_des_rayons_d_ombrage,FLOT__UNDEF)); \
\
EGAL(rapport_des_rayons_d_ombrage \
,DIVI(ACCES_LISTE(liste_des_RAYONS_D_OMBRAGE,index1) \
,ACCES_LISTE(liste_des_vRAYON,index1) \
) \
); \
/* Calcul du rapport entre le rayon de la particule faisant de l'ombre a celui de celle */ \
/* qui est a l'ombre... */ \
\
Test(IFOU(IFET(IL_FAUT(gestion_des_ombres_portees_____compatibilite_2022060711) \
,IFLE(angle_d_ombrage \
,seuil_angulaire_de_declenchement_de_l_ombrage \
) \
) \
,IFET(IL_NE_FAUT_PAS(gestion_des_ombres_portees_____compatibilite_2022060711) \
,IFLE(angle_d_ombrage \
,MUL2(TRON(MUL2(facteur1_du_rapport_des_rayons_d_ombrage \
,rapport_des_rayons_d_ombrage \
) \
,borne_inferieure_du_rapport_des_rayons_d_ombrage \
,borne_superieure_du_rapport_des_rayons_d_ombrage \
) \
,seuil_angulaire_de_declenchement_de_l_ombrage \
) \
) \
) \
) \
) \
/* Le 20220607115555 a ete introduit la possibilite que le seuil de declenchement de */ \
/* l'ombrage depende du rapport des rayons... */ \
Bblock \
DEFV(Float,INIT(attenuation_a_l_ombre \
,AXPB(SOUS(niveau_d_eclairage,niveau_d_ombrage__) \
,TAHX01(MUL2(facteur_de_l_angle_d_ombrage \
,SOUS(angle_d_ombrage,angle_d_inflexion_de_l_ombrage) \
) \
) \
,niveau_d_ombrage__ \
) \
) \
); \
/* Ainsi la zone de penombre varie de 'niveau_d_ombrage__' a 'niveau_d_eclairage' */ \
/* suivant une tangente hyperbolique dans [0,1]... */ \
\
Test(IL_FAUT(gestion_des_ombres_portees_____compatibilite_20220522)) \
Bblock \
Eblock \
ATes \
Bblock \
EGAL(attenuation_a_l_ombre \
,MUL2(EXPX(NEGA(MUL2(facteur2_du_rapport_des_rayons_d_ombrage \
,rapport_des_rayons_d_ombrage \
) \
) \
) \
,attenuation_a_l_ombre \
) \
); \
/* Ainsi l'attenuation devient une fonction decroissante du rayon de la particule qui est */ \
/* a l'ombre d'autres particules (introduit le 20220522135138)... */ \
/* */ \
/* Ceci a ete valide grace a 'v $xtc/OmbresPortees.01$c'... */ \
Eblock \
ETes \
\
EGAL(ACCES_LISTE(liste_des_ROUGE,index1) \
,MUL2(attenuation_a_l_ombre,ACCES_LISTE(liste_des_ROUGE,index1)) \
); \
EGAL(ACCES_LISTE(liste_des_VERTE,index1) \
,MUL2(attenuation_a_l_ombre,ACCES_LISTE(liste_des_VERTE,index1)) \
); \
EGAL(ACCES_LISTE(liste_des_BLEUE,index1) \
,MUL2(attenuation_a_l_ombre,ACCES_LISTE(liste_des_BLEUE,index1)) \
); \
/* Gestion de l'ombre et de la penombre... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
EDoI \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
DoIn(index_d_extraction_de_la_liste,PREMIER_POINT_DES_LISTES,index_de_rangement_dans_la_liste,I) \
Bblock \
DEFV(Int,INIT(index_de_visualisation,INTE(ACCES_LISTE(liste_des_index,index_d_extraction_de_la_liste)))); \
/* Index de visualisation destine au tri des points... */ \
\
DEFV(Float,INIT(coordonnee_X__du_point_courant,ACCES_LISTE(liste_des_X,index_de_visualisation))); \
DEFV(Float,INIT(coordonnee_Y__du_point_courant,ACCES_LISTE(liste_des_Y,index_de_visualisation))); \
DEFV(Float,INIT(coordonnee_Z__du_point_courant,ACCES_LISTE(liste_des_Z,index_de_visualisation))); \
DEFV(Float,INIT(rayon_________du_point_courant,ACCES_LISTE(liste_des_aRAYON,index_de_visualisation))); \
DEFV(Float,INIT(couleur_ROUGE_du_point_courant,ACCES_LISTE(liste_des_ROUGE,index_de_visualisation))); \
DEFV(Float,INIT(couleur_VERTE_du_point_courant,ACCES_LISTE(liste_des_VERTE,index_de_visualisation))); \
DEFV(Float,INIT(couleur_BLEUE_du_point_courant,ACCES_LISTE(liste_des_BLEUE,index_de_visualisation))); \
/* Definition du point courant (introduit le 20080309112355). */ \
\
Test(I3OU(IL_FAUT(optimisation_du_tri_des_points_____compatibilite_2008030911) \
,IFEQ(index_d_extraction_de_la_liste,PREMIER_POINT_DES_LISTES) \
,I3OU(I3OU(IFNE(coordonnee_X__du_point_courant,coordonnee_X__du_point_precedent) \
,IFNE(coordonnee_Y__du_point_courant,coordonnee_Y__du_point_precedent) \
,IFNE(coordonnee_Z__du_point_courant,coordonnee_Z__du_point_precedent) \
) \
,IFNE(rayon_________du_point_courant,rayon_________du_point_precedent) \
,I3OU(IFNE(couleur_ROUGE_du_point_courant,couleur_ROUGE_du_point_precedent) \
,IFNE(couleur_VERTE_du_point_courant,couleur_VERTE_du_point_precedent) \
,IFNE(couleur_BLEUE_du_point_courant,couleur_BLEUE_du_point_precedent) \
) \
) \
) \
) \
/* L'optimisation precedente concernant a voir si le point courant n'est pas strictement */ \
/* identique au point precedent (s'il existe) a ete introduit le 20080309112355... */ \
Bblock \
DEFV(Float,INIT(niveau_ROUGE_normalise,FLOT__UNDEF)); \
DEFV(Float,INIT(niveau_VERTE_normalise,FLOT__UNDEF)); \
DEFV(Float,INIT(niveau_BLEUE_normalise,FLOT__UNDEF)); \
/* Niveaux chromatiques normalises, */ \
\
DEFV(Float,INIT(modulation_eventuelle_des_rayons \
,COND(IL_NE_FAUT_PAS(moduler_le_rayon_de_visualisation_avec_la_profondeur) \
,FU \
,AXPB(param_A_modulation_du_rayon_de_visualisation_avec_la_profondeur \
,COMP(NORM(coordonnee_Z__du_point_courant \
,minimum_de_la_coordonnee_Z \
,maximum_de_la_coordonnee_Z \
) \
) \
,param_B_modulation_du_rayon_de_visualisation_avec_la_profondeur \
) \
) \
) \
); \
/* Modulation eventuelle des rayons en fonction du 'Z'... */ \
/* */ \
/* Il convient de rappeler au passage que l'axe 'Z' est dirige vers l'observateur, d'ou */ \
/* l'inversion de la coordonnee 'Z' de modulation du rayon via un 'COMP(....)'... */ \
\
EGAL(niveau_ROUGE_normalise \
,AXPB(facteur_du_ROUGE \
,couleur_ROUGE_du_point_courant \
,translation_du_ROUGE \
) \
); \
EGAL(niveau_VERTE_normalise \
,AXPB(facteur_du_VERTE \
,couleur_VERTE_du_point_courant \
,translation_du_VERTE \
) \
); \
EGAL(niveau_BLEUE_normalise \
,AXPB(facteur_du_BLEUE \
,couleur_BLEUE_du_point_courant \
,translation_du_BLEUE \
) \
); \
/* Et calcul de leurs valeurs. Cette operation n'est pas faite lors de la declaration */ \
/* des variables 'Float' correspondantes afin de garantir que 'index_de_visualisation' */ \
/* a une valeur correcte. D'autre part, le passage par ces variables intermediaires est */ \
/* destine a alleger la traduction des 'DEPTH_CUEING_DES_POINTS(...)' ci-apres... */ \
\
CALi(visualisation_d_un_point(ADD2(coordonnee_X__du_point_courant \
,translation_de_centrage_des_coordonnees_X \
) \
,ADD2(coordonnee_Y__du_point_courant \
,translation_de_centrage_des_coordonnees_Y \
) \
,ADD2(coordonnee_Z__du_point_courant \
,translation_de_centrage_des_coordonnees_Z \
) \
,MUL2(modulation_eventuelle_des_rayons \
,rayon_________du_point_courant \
) \
,MUL2(modulation_eventuelle_des_rayons \
,ACCES_LISTE(liste_des_vRAYON,index_de_visualisation) \
) \
,DEPTH_CUEING_DES_POINTS(niveau_ROUGE_normalise \
,nROUGE \
,aROUGE \
,seuil_inferieur_du_ROUGE \
,seuil_superieur_du_ROUGE \
) \
,DEPTH_CUEING_DES_POINTS(niveau_VERTE_normalise \
,nVERTE \
,aVERTE \
,seuil_inferieur_du_VERTE \
,seuil_superieur_du_VERTE \
) \
,DEPTH_CUEING_DES_POINTS(niveau_BLEUE_normalise \
,nBLEUE \
,aBLEUE \
,seuil_inferieur_du_BLEUE \
,seuil_superieur_du_BLEUE \
) \
) \
); \
/* Visualisation du point courant. Grace au tri precedent, on visualise en premier le point */ \
/* le plus eloigne, et en dernier le plus proche. Cela permet d'utiliser efficacement la */ \
/* methode d'anti-aliasing qui interpole (au bord des spheres) avec ce qui etait present */ \
/* anterieurement. Il est donc necessaire que l'on trace par profondeur 'Z' decroissante, */ \
/* car ainsi, les spheres se superposent, et jamais une nouvelle sphere ne sera tracee */ \
/* derriere une autre, ce qui ferait que le contour de cette derniere aurait ete interpole */ \
/* par rapport au noir (dans le cas ou il y avait le fond derriere), et non pas par rapport */ \
/* a cette nouvelle sphere, puisqu'elle n'etait pas encore la. ATTENTION, on notera bien */ \
/* que l'on utilise l'ordre inverse dans : */ \
/* */ \
/* SCAL(ACCES_LISTE(...) */ \
/* ,n... */ \
/* ,a... */ \
/* ) */ \
/* */ \
/* On peut "moduler" le 'rayon_reel_de_visualisation' avec la profondeur 'Zf'. Cela a ete */ \
/* introduit le 20050419105308 afin, par exemple, d'augmenter le rayon des spheres en */ \
/* fonction de leur profondeur. Ainsi, si l'on souhaite appliquer 'v $xci/DepthFiel.11$Z' */ \
/* a un ensemble de sphere, il faudra : */ \
/* */ \
/* 1-Generer comme d'habitude l'image 'IMAGE', */ \
/* 2-La generer une seconde fois en modulant le 'rayon_reel_de_visualisation' avec */ \
/* 'Zf' afin de generer un 'Z-Buffer' dans lesquels les spheres eloignees de */ \
/* l'observateur occupe plus de place que les spheres proches de ce meme observateur. */ \
/* 3-Appliquer ensuite 'v $xci/DepthFiel.11$Z' a 'IMAGE' avec 'Z-Buffer'... */ \
/* */ \
/* Ainsi, les spheres eloignees de l'observateur seront plus convoluees que les spheres */ \
/* proches de ce meme observateur, mais surtout le fond autour de ces memes spheres sera */ \
/* lui-aussi convolue puisque celles-ci occuperont plus de place dans le 'Z-Buffer'... */ \
\
EGAL(coordonnee_X__du_point_precedent,coordonnee_X__du_point_courant); \
EGAL(coordonnee_Y__du_point_precedent,coordonnee_Y__du_point_courant); \
EGAL(coordonnee_Z__du_point_precedent,coordonnee_Z__du_point_courant); \
EGAL(rayon_________du_point_precedent,rayon_________du_point_courant); \
EGAL(couleur_ROUGE_du_point_precedent,couleur_ROUGE_du_point_courant); \
EGAL(couleur_VERTE_du_point_precedent,couleur_VERTE_du_point_courant); \
EGAL(couleur_BLEUE_du_point_precedent,couleur_BLEUE_du_point_courant); \
/* Gestion de l'optimisation (introduite le 20080309112355)... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
EDoI \
\
Test(IL_FAUT(editer_les_extrema_des_coordonnees_x_et_y_projetees)) \
Bblock \
DEFV(Int,INIT(dimension_des_coordonnees_X_projetees \
,DIMENSION(minimum_des_coordonnees_X_projetees,maximum_des_coordonnees_X_projetees) \
) \
); \
DEFV(Int,INIT(dimension_des_coordonnees_Y_projetees \
,DIMENSION(minimum_des_coordonnees_Y_projetees,maximum_des_coordonnees_Y_projetees) \
) \
); \
\
DEFV(Int,INIT(centre_des_coordonnees_X_projetees \
,COXA(INTE(MOYE(minimum_des_coordonnees_X_projetees,maximum_des_coordonnees_X_projetees))) \
) \
); \
DEFV(Int,INIT(centre_des_coordonnees_Y_projetees \
,COYA(INTE(MOYE(minimum_des_coordonnees_Y_projetees,maximum_des_coordonnees_Y_projetees))) \
) \
); \
\
CAL2(Prin2("les coordonnees X projetees sont dans [%+.^^^,%+.^^^]\n" \
,minimum_des_coordonnees_X_projetees \
,maximum_des_coordonnees_X_projetees \
) \
); \
CAL2(Prin2("les coordonnees Y projetees sont dans [%+.^^^,%+.^^^]\n" \
,minimum_des_coordonnees_Y_projetees \
,maximum_des_coordonnees_Y_projetees \
) \
); \
/* Introduit le 20180531101315 pour aider au cadrage bi-dimensionnel... */ \
\
CAL2(Prin2("definition d'une translation de centrage en X : %s%+.^^^\n" \
,TRANSLATION_OX_PROJETEE \
,_____lNORMALISE_OX(SOUS(Xcentre,centre_des_coordonnees_X_projetees)) \
) \
); \
CAL2(Prin2("definition d'une translation de centrage en Y : %s%+.^^^\n" \
,TRANSLATION_OY_PROJETEE \
,_____lNORMALISE_OY(SOUS(Ycentre,centre_des_coordonnees_Y_projetees)) \
) \
); \
\
Test(TOUJOURS_FAUX) \
/* Aux environs du 20180601111611 ('v $xrv/particule.10$Z 20180601111130') les experiences */ \
/* faites montrent que le rapport de zoom courant (utilise pour les mesures ci-dessus) */ \
/* doit etre CONSERVE lors de la generation utilisant les translations proposees ci-dessus */ \
/* pour les coordonnees 'X' et 'Y' projetees... */ \
Bblock \
CAL2(Prin1("definition d'un rapport de zoom optimal : ZOOM=%+.^^^\n" \
,MUL2(rapport_courant_du_zoom \
,DIVI(FLOT(MdimXY) \
,FLOT(MAX2(dimension_des_coordonnees_X_projetees \
,dimension_des_coordonnees_Y_projetees \
) \
) \
) \
) \
) \
); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Visualisation d'une liste de points avec renormalisation finale des niveaux. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R E N O R M A L I S A T I O N D ' U N E L I S T E D E P O I N T S : */
/* */
/*************************************************************************************************************************************/
#TestADef RENORMALISATION_D_UNE_LISTE_DE_POINTS_____COMPATIBILITE_20221224 \
FAUX
DEFV(Local,DEFV(Logical,INIT(renormalisation_d_une_liste_de_points_____compatibilite_20221224
,RENORMALISATION_D_UNE_LISTE_DE_POINTS_____COMPATIBILITE_20221224
)
)
);
/* Afin d'assurer la compatibilite avec les resultats obtenus anterieurement a la date */
/* du 20221224121736... */
#define EPSILON_D_EQUIVALENCE_DES_MINIMA_ET_DES_MAXIMA \
igEPSILON
DEFV(Local,DEFV(Float,INIT(epsilon_d_equivalence_des_minima_et_des_maxima,EPSILON_D_EQUIVALENCE_DES_MINIMA_ET_DES_MAXIMA)));
/* Afin de pouvoir decreter que le minimum et le maximum sont equvalents. Cela a ete */
/* introduits le 20221224121736 lors de la mise au point de 'v $xrs/hyper_plan.11$K', alors */
/* qu'il utilisait l'option "u_v_w_arbitraires=VRAI" avec 'v $xci/valeurs_Hilbert3D$K. */
/* A priori, les composantes {ROUGE,VERTE,BLEUE} devaient etre toutes egales a 1, mais en */
/* fait elles s'etalaient dans [0.9999999999999998,1.0000000000000002]... */
#define NIVEAU_NORMALISE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM \
COORDONNEE_BARYCENTRIQUE_CENTRALE \
/* Valeur a donner a un niveau normalise lorsque les extrema correspondants sont egaux... */
#define NIVEAU_NORMALISE_DE_RVB_SI_MINIMUM_EGALE_LE_MAXIMUM(niveau_normalise_lorsque_le_minimum_egale_le_maximum) \
COND(IL_FAUT(niveau_normalise_lorsque_le_minimum_egale_le_maximum_____compatibilite_20120209) \
,NIVEAU_NORMALISE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM \
,niveau_normalise_lorsque_le_minimum_egale_le_maximum \
)
#define NIVEAU_NORMALISE_DE_ROUGE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM \
NIVEAU_NORMALISE_DE_RVB_SI_MINIMUM_EGALE_LE_MAXIMUM(niveau_normalise_de_ROUGE_lorsque_le_minimum_egale_le_maximum)
#define NIVEAU_NORMALISE_DE_VERTE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM \
NIVEAU_NORMALISE_DE_RVB_SI_MINIMUM_EGALE_LE_MAXIMUM(niveau_normalise_de_VERTE_lorsque_le_minimum_egale_le_maximum)
#define NIVEAU_NORMALISE_DE_BLEUE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM \
NIVEAU_NORMALISE_DE_RVB_SI_MINIMUM_EGALE_LE_MAXIMUM(niveau_normalise_de_BLEUE_lorsque_le_minimum_egale_le_maximum)
/* Introduits le 20120209110935... */
#TestADef NIVEAU_NORMALISE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM_____COMPATIBILITE_20120209 \
FAUX \
/* Introduit le 20140822184625... */
DEFV(Local,DEFV(Logical,INIT(niveau_normalise_lorsque_le_minimum_egale_le_maximum_____compatibilite_20120209
,NIVEAU_NORMALISE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM_____COMPATIBILITE_20120209
)
)
);
DEFV(Local,DEFV(genere_Float,INIT(niveau_normalise_de_ROUGE_lorsque_le_minimum_egale_le_maximum
,NIVEAU_NORMALISE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM
)
)
);
DEFV(Local,DEFV(genere_Float,INIT(niveau_normalise_de_VERTE_lorsque_le_minimum_egale_le_maximum
,NIVEAU_NORMALISE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM
)
)
);
DEFV(Local,DEFV(genere_Float,INIT(niveau_normalise_de_BLEUE_lorsque_le_minimum_egale_le_maximum
,NIVEAU_NORMALISE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM
)
)
);
/* Introduits le 20120209110935... */
#define RENORMALISATION_D_UNE_LISTE_DE_POINTS \
Bblock \
Test(I3ET(IL_FAUT(visualiser_en_RVB) \
,IL_NE_FAUT_PAS(renormaliser_arbitrairement_les_differentielles) \
,IL_FAUT(faire_la_renormalisation_des_differentielles) \
) \
) \
/* Ce test est destine a eviter des divisions par 0 dans 'NORM(...)' ci-dessous, car */ \
/* en effet, dans le cas ou l'on ne visualise pas en couleurs, les extrema des trois */ \
/* composantes sont egales... */ \
/* */ \
/* Le 20221005144141, le test de 'faire_la_renormalisation_des_differentielles' a ete */ \
/* introduit pour generer correctement 'v $xiirv/NFRI.F1'... */ \
Bblock \
DEFV(Float,INIT(minimum_des_ROUGE,F_INFINI)); \
DEFV(Float,INIT(maximum_des_ROUGE,F_MOINS_L_INFINI)); \
/* Recherche des extrema du ROUGE. */ \
DEFV(Float,INIT(minimum_des_VERTE,F_INFINI)); \
DEFV(Float,INIT(maximum_des_VERTE,F_MOINS_L_INFINI)); \
/* Recherche des extrema du VERTE. */ \
DEFV(Float,INIT(minimum_des_BLEUE,F_INFINI)); \
DEFV(Float,INIT(maximum_des_BLEUE,F_MOINS_L_INFINI)); \
/* Recherche des extrema du BLEUE. */ \
\
DoIn(index_d_extraction_de_la_liste,PREMIER_POINT_DES_LISTES,index_de_rangement_dans_la_liste,I) \
Bblock \
EGAL(minimum_des_ROUGE \
,MIN2(minimum_des_ROUGE,ACCES_LISTE(liste_des_ROUGE,index_d_extraction_de_la_liste)) \
); \
EGAL(maximum_des_ROUGE \
,MAX2(maximum_des_ROUGE,ACCES_LISTE(liste_des_ROUGE,index_d_extraction_de_la_liste)) \
); \
/* Recherche des extrema du ROUGE. */ \
EGAL(minimum_des_VERTE \
,MIN2(minimum_des_VERTE,ACCES_LISTE(liste_des_VERTE,index_d_extraction_de_la_liste)) \
); \
EGAL(maximum_des_VERTE \
,MAX2(maximum_des_VERTE,ACCES_LISTE(liste_des_VERTE,index_d_extraction_de_la_liste)) \
); \
/* Recherche des extrema du VERTE. */ \
EGAL(minimum_des_BLEUE \
,MIN2(minimum_des_BLEUE,ACCES_LISTE(liste_des_BLEUE,index_d_extraction_de_la_liste)) \
); \
EGAL(maximum_des_BLEUE \
,MAX2(maximum_des_BLEUE,ACCES_LISTE(liste_des_BLEUE,index_d_extraction_de_la_liste)) \
); \
/* Recherche des extrema du BLEUE. */ \
Eblock \
EDoI \
\
Test(IL_FAUT(renormalisation_d_une_liste_de_points_____compatibilite_20221224)) \
Bblock \
Eblock \
ATes \
Bblock \
/* Introduit le 20221224121736 lors de la mise au point de 'v $xrs/hyper_plan.11$K', alors */ \
/* qu'il utilisait l'option "u_v_w_arbitraires=VRAI" avec 'v $xci/valeurs_Hilbert3D$K. */ \
/* A priori, les composantes {ROUGE,VERTE,BLEUE} devaient etre toutes egales a 1, mais en */ \
/* fait elles s'etalaient dans [0.9999999999999998,1.0000000000000002]... */ \
Test(IFEQ_a_peu_pres_absolu(minimum_des_ROUGE \
,maximum_des_ROUGE \
,epsilon_d_equivalence_des_minima_et_des_maxima \
) \
) \
Bblock \
DEFV(Float,INIT(moyenne_des_ROUGE,MOYE(minimum_des_ROUGE,maximum_des_ROUGE))); \
EGAL(minimum_des_ROUGE,moyenne_des_ROUGE); \
EGAL(maximum_des_ROUGE,moyenne_des_ROUGE); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IFEQ_a_peu_pres_absolu(minimum_des_VERTE \
,maximum_des_VERTE \
,epsilon_d_equivalence_des_minima_et_des_maxima \
) \
) \
Bblock \
DEFV(Float,INIT(moyenne_des_VERTE,MOYE(minimum_des_VERTE,maximum_des_VERTE))); \
EGAL(minimum_des_VERTE,moyenne_des_VERTE); \
EGAL(maximum_des_VERTE,moyenne_des_VERTE); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IFEQ_a_peu_pres_absolu(minimum_des_BLEUE \
,maximum_des_BLEUE \
,epsilon_d_equivalence_des_minima_et_des_maxima \
) \
) \
Bblock \
DEFV(Float,INIT(moyenne_des_BLEUE,MOYE(minimum_des_BLEUE,maximum_des_BLEUE))); \
EGAL(minimum_des_BLEUE,moyenne_des_BLEUE); \
EGAL(maximum_des_BLEUE,moyenne_des_BLEUE); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ETes \
\
DoIn(index_d_extraction_de_la_liste,PREMIER_POINT_DES_LISTES,index_de_rangement_dans_la_liste,I) \
Bblock \
EGAL(ACCES_LISTE(liste_des_ROUGE,index_d_extraction_de_la_liste) \
,NORZ(ACCES_LISTE(liste_des_ROUGE,index_d_extraction_de_la_liste) \
,minimum_des_ROUGE,maximum_des_ROUGE \
,NIVEAU_NORMALISE_DE_ROUGE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM \
) \
); \
/* Renormalisation du ROUGE. */ \
EGAL(ACCES_LISTE(liste_des_VERTE,index_d_extraction_de_la_liste) \
,NORZ(ACCES_LISTE(liste_des_VERTE,index_d_extraction_de_la_liste) \
,minimum_des_VERTE,maximum_des_VERTE \
,NIVEAU_NORMALISE_DE_VERTE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM \
) \
); \
/* Renormalisation du VERTE. */ \
EGAL(ACCES_LISTE(liste_des_BLEUE,index_d_extraction_de_la_liste) \
,NORZ(ACCES_LISTE(liste_des_BLEUE,index_d_extraction_de_la_liste) \
,minimum_des_BLEUE,maximum_des_BLEUE \
,NIVEAU_NORMALISE_DE_BLEUE_LORSQUE_LE_MINIMUM_EGALE_LE_MAXIMUM \
) \
); \
/* Renormalisation du BLEUE. */ \
Eblock \
EDoI \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Recherche des extrema des couleurs, et renormalisation... */