/*************************************************************************************************************************************/
/* */
/* T R A C E D U S P E C T R E : */
/* */
/* */
/* Definition du polygone "Spectre" (en notant une */
/* symetrie d'axe OY par rapport a 'v $xrd/spectre.01$K') : */
/* */
/* */
/* C */
/* #---------. */
/* / 08 | */
/* / | */
/* / 09 07 | */
/* / | */
/* . . */
/* / \ */
/* / \ */
/* / 10 06 \ */
/* / \ */
/* . . */
/* \ / */
/* \ 11 05 / */
/* \ / */
/* \ / */
/* . . */
/* / \ */
/* / 04 \ */
/* / 12 \ */
/* D / . */
/* # /\ 03 / */
/* | / \ 02 / */
/* | 13 01 / \ / */
/* | / \# */
/* | / B */
/* | 00 / */
/* ---------# */
/* A */
/* */
/* .---------. */
/* / 28 | */
/* / | */
/* / 29 27 | */
/* / | */
/* . . */
/* / \ */
/* / \ */
/* / 30 26 \ */
/* / \ */
/* . . */
/* \ / */
/* \ 31 25 / */
/* \ / */
/* \ / */
/* . . */
/* / \ */
/* / 24 \ */
/* / 32 \ */
/* / . */
/* . /\ 23 / */
/* | / \ 22 / */
/* | 33 21 / \ / */
/* | / \/ */
/* | / */
/* | 20 / */
/* --------- */
/* */
/* */
/* Les numeros correspondent aux numeros des Contextes Graphiques */
/* contenant l'ORIGINE de chaque segment definissant a un cote */
/* et les lettres {A,B,C,D,A} au "squelette" du "Spectre"... */
/* */
/* */
/* Definition des neuf hexagones et de leurs appariements */
/* destinee a une generation plus algorithmique (inutilisee */
/* a la date du 20230905134904...) : */
/* */
/* */
/* G : {0=m1,1=m4,2=p4,3=m7,4=m8,5=p1} */
/* */
/* D : {0=m6,1=p7,2=p1,3=m2,4=p4,5=m7} */
/* */
/* J : {0=m1,1=p7,2=p1,3=p5,4=p1,5=n3} */
/* */
/* L : {0=m1,1=p7,2=p1,3=m2,4=p4,5=m5} */
/* */
/* X : {0=m1,1=m4,2=p2,3=p5,4=p1,5=n3} */
/* */
/* P : {0=m1,1=m4,2=p2,3=m2,4=p4,5=m5} */
/* */
/* S : {0=p8,1=p6,2=p1,3=m2,4=p4,5=m7} */
/* */
/* F : {0=m1,1=p7,2=p1,3=m2,4=p2,5=n3} */
/* */
/* Y : {0=m1,1=m4,2=p2,3=m2,4=p2,5=n3} */
/* */
/* */
/* ou {0,1,2,3,4,5} sont les numeros des six cotes */
/* de chaque hexagone et '[pmn][12345678]' les "clefs" */
/* d'appariements suivant : */
/* */
/* p1 <--> m1 */
/* */
/* p2 <--> m2 */
/* */
/* n3 <--> n3 */
/* */
/* p4 <--> m4 */
/* */
/* p5 <--> m5 */
/* */
/* p6 <--> m6 */
/* */
/* p7 <--> m7 */
/* */
/* p8 <--> m8 */
/* */
/* */
/* Author of '$xrd/spectre.11$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20230905134904). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 : */
/* */
/*************************************************************************************************************************************/
#define NO_DEFINE_____premiers_entiers_naturels
/* Et ce a cause des collisions avec 'nom_des_CONTEXTES_0' ci-apres... */
#include INCLUDES_BASE
#include image_image_CONTOURS_EXT
#include image_image_ALPHABET_0_EXT
#include image_image_ALPHABET_1_EXT
#include image_image_ALPHABET_2_EXT
#include image_image_ALPHABET_3_EXT
#include image_image_ALPHABET_4_EXT
#include image_image_ALPHABET_5_EXT
#include image_image_ALPHABETS_EXT
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N S D E S C O N T E X T E S G R A P H I Q U E S D E F I N I S S A N T */
/* L ' O R I G I N E D E C H A Q U E S E G M E N T / C O T E D E S " S P E C T R E S " ; */
/* */
/*************************************************************************************************************************************/
#define SOMMET_DE_REFERENCE \
00
Denumer20(INIS(_00,INDEX0)
,_01
,_02
,_03
,_04
,_05
,_06
,_07
,_08
,_09
,_10
,_11
,_12
,_13
,_s1_14
,_s1_15
,_s1_16
,_s1_17
,_s2_18
,_s2_19
,nom_des_CONTEXTES_0
);
/* Nota : un nombre entier decimal ne peut commencer par un "0" sous peine d'etre traite */
/* comme un nombre octal avec donc un probleme pour "08" et "09". Dans ce cas, les */
/* contextes {01,02,...,12,13} sont donc definis sur un chiffre pour {01,02,...,08,09} */
/* et sur deux chiffres pour {10,11,12,13} et ce via 'Denumer14(....)'... */
Denumer20(INIS(_20,20)
,_21
,_22
,_23
,_24
,_25
,_26
,_27
,_28
,_29
,_30
,_31
,_32
,_33
,_s1_34
,_s1_35
,_s1_36
,_s1_37
,_s2_38
,_s2_39
,nom_des_CONTEXTES_2
);
/* Pour les contextes {20,21,...,32,33} il n'y a pas de differences entre l'acces direct */
/* et l'acces indexe en ce qui concerne les numeros qui sont sur deux chiffres et qui de */
/* de plus ne peuvent pas commencer par un "0"... */
#define ACCES_CONTEXTE_D(numero) \
vecteurs_____Gcon`numero
#define ACCES_CONTEXTE_I(numero) \
ITb0(INDIRECT(liste_des_____vecteurs_____Gcon),numero) \
/* Cas de l'acces indexe aux differents contextes graphiques... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N S D E S A N G L E S : */
/* */
/*************************************************************************************************************************************/
#define FAIRE_UNE_SYMETRIE_D_AXE_OY \
VRAI
#define NE_PAS_FAIRE_UNE_SYMETRIE_D_AXE_OY \
NOTL(FAIRE_UNE_SYMETRIE_D_AXE_OY)
DEFV(Local,DEFV(Logical,INIT(faire_une_symetrie_d_axe_OY,NE_PAS_FAIRE_UNE_SYMETRIE_D_AXE_OY)));
#define ROTATION_PLANE(angle) \
COND(IL_FAUT(faire_une_symetrie_d_axe_OY),NEGA(angle),NEUT(angle))
DEFV(Local,DEFV(Float,INIT(pi_sur_2,PI_SUR_2)));
DEFV(Local,DEFV(Float,INIT(pi_sur_3,PI_SUR_3)));
DEFV(Local,DEFV(Float,INIT(pi_sur_6,PI_SUR_6)));
#define _Rzero \
T_ROTATION_Z(ROTATION_PLANE(FZERO))
#define PRpis2 \
T_ROTATION_Z(ROTATION_PLANE(NEUT(pi_sur_2)))
#define MRpis2 \
T_ROTATION_Z(ROTATION_PLANE(NEGA(pi_sur_2)))
#define PRpis3 \
T_ROTATION_Z(ROTATION_PLANE(NEUT(pi_sur_3)))
#define MRpis3 \
T_ROTATION_Z(ROTATION_PLANE(NEGA(pi_sur_3)))
#define P0pis6 \
NEUT(GRO0(UN))
#define M0pis6 \
NEGA(GRO0(UN))
#define P1pis6 \
NEUT(GRO1(UN))
#define M1pis6 \
NEGA(GRO1(UN))
#define P2pis6 \
NEUT(GRO2(UN))
#define M2pis6 \
NEGA(GRO2(UN))
#define P3pis6 \
NEUT(GRO3(UN))
#define M3pis6 \
NEGA(GRO3(UN))
#define P4pis6 \
NEUT(GRO4(UN))
#define M4pis6 \
NEGA(GRO4(UN))
#define P5pis6 \
NEUT(GRO5(UN))
#define M5pis6 \
NEGA(GRO5(UN))
#define P6pis6 \
NEUT(GRO6(UN))
#define M6pis6 \
NEGA(GRO6(UN))
#define MINIMUM_pis6 \
INTE(M6pis6)
#define MAXIMUM_pis6 \
INTE(P6pis6)
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P O U R F A C I L I T E R L A D E T E R M I N A T I O N D E S A N G L E S E T D E S C O N T E X T E S : */
/* */
/*************************************************************************************************************************************/
#define NUMEROTER_LES_COTES \
VRAI
#define NE_PAS_NUMEROTER_LES_COTES \
NOTL(NUMEROTER_LES_COTES)
DEFV(Local,DEFV(Logical,INIT(numeroter_les_cotes,NE_PAS_NUMEROTER_LES_COTES)));
DEFV(Local,DEFV(Int,INIT(nombre_de_chiffres_des_numeros_des_cotes,DEUX)));
DEFV(Local,DEFV(Int,INIT(taille_des_caracteres_des_numeros_des_cotes,UN)));
/* Pour numeroter les cotes des spectres utiles... */
#define ANGLE_DE_ROTATION(rotation) \
ROTATION_PLANE(MUL2(FLOT(rotation),pi_sur_6))
#define ANGLE_D_INCLINAISON \
ANGLE_DE_ROTATION(angle_d_inclinaison)
DEFV(Local,DEFV(Int,INIT(angle_d_inclinaison,P0pis6)));
/* Pour trouver experimentalement l'inclinaison d'un spectre. Il s'agit de l'argument */
/* 'rotation' de la procedure 'NOUVEAU_SPECTRE_2(...)' en multiple de pi/6... */
DEFV(Local,DEFV(Int,INIT(contexte_0,_00)));
DEFV(Local,DEFV(Int,INIT(contexte_2,_20)));
/* Pour trouver experimentalement les contextes de reference (0) et nouveau (2)... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N S D E S T R A C E S G R A P H I Q U E S : */
/* */
/*************************************************************************************************************************************/
#define Zcentre_normalise \
_____cNORMALISE_OZ(Zcentre)
#define COTE \
QUATRE \
/* Definition du nombre d'unites sur un cote. */
#define G3 \
Bblock \
DO(COTE \
,BLOC(g3;) \
); \
Eblock
#define ECHELLES \
UN
#define NUMEROTER_SEGMENT(numeroter,numero,numero_minimal,numero_maximal,niveau_numeros_cotes,inverser_les_numeros) \
Bblock \
Test(IL_FAUT(numeroter)) \
Bblock \
DEFV(Int,INIT(numero_1,PRED(numero))); \
DEFV(Int,INIT(numero_2,MODU(numero,numero_minimal,numero_maximal))); \
DEFV(Int,INIT(numero_effectif \
,COND(IL_FAUT(inverser_les_numeros) \
,COND(IFGE(numero,_20) \
,SOUS(numero,_20) \
,ADD2(numero,_20) \
) \
,numero \
) \
) \
); \
\
CALS(FgMIC()); \
\
SET_CURSOR(NEUT(MOYE(ASD2(ACCES_CONTEXTE_I(numero_1),vecteurs_____cursor_3D,x) \
,ASD2(ACCES_CONTEXTE_I(numero_2),vecteurs_____cursor_3D,x) \
) \
) \
,NEUT(MOYE(ASD2(ACCES_CONTEXTE_I(numero_1),vecteurs_____cursor_3D,y) \
,ASD2(ACCES_CONTEXTE_I(numero_2),vecteurs_____cursor_3D,y) \
) \
) \
,ADD2(MOYE(ASD2(ACCES_CONTEXTE_I(numero_1),vecteurs_____cursor_3D,z) \
,ASD2(ACCES_CONTEXTE_I(numero_2),vecteurs_____cursor_3D,z) \
) \
,tgEPSILON \
) \
); \
/* Le decalage de la coordonnee 'Z' est destine a garantir que les numeros apparaitront */ \
/* bien au premier plan. On notera au passage que les "Spectres" sont traces deux fois */ \
/* (voir 'fGENERE_SPECTRE_2(...)' appele deux fois dans 'NOUVEAU_SPECTRE_2(...)'). */ \
/* */ \
/* On notera de plus que ce decalage rapprochant les chiffres de l'observateur a pour effet */ \
/* un tres leger zoom sur ces derniers... */ \
\
EGAL(Imessage_____facteur_scale_globale,GRO2(FRA4(FU))); \
CALS(Imessage(chain_numero(PRED(numero_effectif),nombre_de_chiffres_des_numeros_des_cotes) \
,Inoir_____NOIR \
,niveau_numeros_cotes \
,taille_des_caracteres_des_numeros_des_cotes \
,FAUX \
) \
); \
\
CALS(FgMOC()); \
\
gA; \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock
#define MEMORISER_LE_CONTEXTE \
VRAI
#define NE_PAS_MEMORISER_LE_CONTEXTE \
NOTL(MEMORISER_LE_CONTEXTE)
#define MARQUER_LE_CENTRE_DE_GRAVITE \
VRAI
#define NE_PAS_MARQUER_LE_CENTRE_DE_GRAVITE \
NOTL(MARQUER_LE_CENTRE_DE_GRAVITE)
DEFV(Local,DEFV(Logical,INIT(marquer_le_centre_de_gravite,NE_PAS_MARQUER_LE_CENTRE_DE_GRAVITE)));
DEFV(Local,DEFV(Int,INIT(nombre_de_segments,ZERO)));
DEFV(Local,DEFV(pointF_3D,centre_de_gravite));
#define GENERE_SEGMENT(memoriser,numero,numero_minimal,numero_maximal,rotation,numeroter,niveau_numeros_cotes,inverser_les_numeros) \
/* L'argument 'memoriser' permet de tracer le "Spectre" avec ou sans memorisation (via */ \
/* 'WCG(...)') de la definition... */ \
Bblock \
rotation; \
\
Test(IL_FAUT(memoriser)) \
Bblock \
WCG(ACCES_CONTEXTE_I(numero)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
G3;gB; \
\
Test(IL_FAUT(marquer_le_centre_de_gravite)) \
Bblock \
INCR(ASD1(centre_de_gravite,x),ASD2(ACCES_CONTEXTE_I(numero),vecteurs_____cursor_3D,x)); \
INCR(ASD1(centre_de_gravite,y),ASD2(ACCES_CONTEXTE_I(numero),vecteurs_____cursor_3D,y)); \
INCR(ASD1(centre_de_gravite,z),ASD2(ACCES_CONTEXTE_I(numero),vecteurs_____cursor_3D,z)); \
INCR(nombre_de_segments,I); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
NUMEROTER_SEGMENT(numeroter,numero,numero_minimal,numero_maximal,niveau_numeros_cotes,inverser_les_numeros); \
Eblock
#define MARQUER_LES_SQUELETTES_NIVEAU_0 \
VRAI
#define NE_PAS_MARQUER_LES_SQUELETTES_NIVEAU_0_NIVEAU_0 \
NOTL(MARQUER_LES_SQUELETTES_NIVEAU_0)
DEFV(Local,DEFV(Logical,INIT(marquer_les_squelettes_niveau_0,NE_PAS_MARQUER_LES_SQUELETTES_NIVEAU_0_NIVEAU_0)));
#define MARQUER_LE_PREMIER_SQUELETTE_NIVEAU_0 \
VRAI
#define NE_PAS_MARQUER_LE_PREMIER_SQUELETTE_NIVEAU_0 \
NOTL(MARQUER_LE_PREMIER_SQUELETTE_NIVEAU_0)
DEFV(Local,DEFV(Logical,INIT(marquer_le_premier_squelette_niveau_0,NE_PAS_MARQUER_LE_PREMIER_SQUELETTE_NIVEAU_0)));
#define NIVEAU_DE_TRACE_DES_SQUELETTES_NIVEAU_0 \
GRIS_2
DEFV(Local,DEFV(genere_p,INIT(niveau_de_trace_des_squelettes_niveau_0,NIVEAU_DE_TRACE_DES_SQUELETTES_NIVEAU_0)));
#define MARQUER_LE_SQUELETTE_NIVEAU_1 \
VRAI
#define NOMBRE_MINIMAL_DE_SPECTRES_POUR_DEFINIR_LE_SUPER_SQUELETTE \
HUIT
#define NE_PAS_MARQUER_LE_SQUELETTE_NIVEAU_1 \
NOTL(MARQUER_LE_SQUELETTE_NIVEAU_1)
DEFV(Local,DEFV(Logical,INIT(marquer_le_squelette_niveau_1,NE_PAS_MARQUER_LE_SQUELETTE_NIVEAU_1)));
#define NIVEAU_DE_TRACE_DU_SQUELETTE_NIVEAU_1 \
GRIS_4
DEFV(Local,DEFV(genere_p,INIT(niveau_de_trace_du_squelette_niveau_1,NIVEAU_DE_TRACE_DU_SQUELETTE_NIVEAU_1)));
/* Possibilite introduite le 20230906100908... */
#define DEFINITION_SQUELETTE_NIVEAU_1(contexteD,contexteA) \
Bblock \
CALS(FgMIC()); \
RCG(ACCES_CONTEXTE_I(contexteD)); \
WCG(ACCES_CONTEXTE_I(contexteA)); \
CALS(FgMOC()); \
Eblock
#define GENERE_SPECTRE_n(memoriser \
,co_00,co_01,co_02,co_03,co_04,co_05,co_06,co_07,co_08,co_09,co_10,co_11,co_12,co_13 \
,co_s1_14,co_s1_15,co_s1_16,co_s1_17 \
,numeroter \
,niv,inverser_les_numeros \
) \
Bblock \
gA; \
/* Debut de la definition du "Spectre" general. */ \
\
Test(I3ET(EST_AUTORISE(vecteurs_____etat_trace) \
,EST_FAUX(niveau_de_trace_incremental) \
,EST_VRAI(niveau_de_trace_visualisant_la_rotation) \
) \
) \
Bblock \
DEFV(Int,INIT(niveau_visualisant_la_rotation \
,MODU(COND(EST_FAUX(niveau_de_trace_visualisant_la_valeur_absolue_de_la_rotation) \
,AXPB(facteur_____du_niveau_de_trace_visualisant_la_rotation \
,NEUT(rotation_definissant_eventuellement_le_niveau) \
,translation_du_niveau_de_trace_visualisant_la_rotation \
) \
,AXPB(facteur_____du_niveau_de_trace_visualisant_la_valeur_absolue_de_la_rotation \
,ABSO(rotation_definissant_eventuellement_le_niveau) \
,translation_du_niveau_de_trace_visualisant_la_valeur_absolue_de_la_rotation \
) \
) \
,NOIR_PLANCHER \
,BLANC \
) \
) \
); \
EGAL(niveau_de_trace,GENP(niveau_visualisant_la_rotation)); \
\
SET_COULEURS(NOIR,niveau_de_trace); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(marquer_le_centre_de_gravite)) \
Bblock \
CLIR(nombre_de_segments); \
INITIALISATION_POINT_3D(centre_de_gravite,FZERO,FZERO,FZERO); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
GENERE_SEGMENT(memoriser \
,co_00,co_00,co_13 \
,_Rzero \
,NE_PAS_NUMEROTER_LES_COTES,niveau_numeros_cotes,inverser_les_numeros \
); \
/* Le premier numero ('co_00') ne peut apparaitre que lors de la definition du second */ \
/* segment... */ \
WCG(ACCES_CONTEXTE_I(co_s1_14)); \
GENERE_SEGMENT(memoriser,co_01,co_00,co_13,PRpis3,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
GENERE_SEGMENT(memoriser,co_02,co_00,co_13,MRpis2,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
WCG(ACCES_CONTEXTE_I(co_s1_15)); \
GENERE_SEGMENT(memoriser,co_03,co_00,co_13,PRpis3,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
GENERE_SEGMENT(memoriser,co_04,co_00,co_13,PRpis2,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
GENERE_SEGMENT(memoriser,co_05,co_00,co_13,MRpis3,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
GENERE_SEGMENT(memoriser,co_06,co_00,co_13,PRpis2,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
GENERE_SEGMENT(memoriser,co_07,co_00,co_13,MRpis3,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
GENERE_SEGMENT(memoriser,co_08,co_00,co_13,PRpis2,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
WCG(ACCES_CONTEXTE_I(co_s1_16)); \
GENERE_SEGMENT(memoriser,co_09,co_00,co_13,PRpis3,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
GENERE_SEGMENT(memoriser,co_10,co_00,co_13,_Rzero,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
GENERE_SEGMENT(memoriser,co_11,co_00,co_13,PRpis3,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
GENERE_SEGMENT(memoriser,co_12,co_00,co_13,MRpis2,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
WCG(ACCES_CONTEXTE_I(co_s1_17)); \
GENERE_SEGMENT(memoriser,co_13,co_00,co_13,PRpis3,numeroter,niveau_numeros_cotes,inverser_les_numeros); \
/* Fin de la definition du "Spectre" general. */ \
/* */ \
/* On notera l'inversion des signes des rotations par rapport a 'v $xrd/spectre.01$K'... */ \
\
NUMEROTER_SEGMENT(numeroter,SUCC(co_13),co_00,co_13,niveau_numeros_cotes,inverser_les_numeros); \
/* L'eventuel dernier numerotage est particulier puisque le sommet 'SUCC(co_13)' n'existe */ \
/* pas (c'est en fait 'co_00'...). */ \
\
Test(EST_AUTORISE(vecteurs_____etat_trace)) \
Bblock \
Test(IL_FAUT(marquer_les_squelettes_niveau_0)) \
Bblock \
Test(IFOU(IL_FAUT(marquer_le_premier_squelette_niveau_0) \
,IFET(IL_NE_FAUT_PAS(marquer_le_premier_squelette_niveau_0) \
,IZGT(nombre_de_spectres_traces) \
) \
) \
) \
Bblock \
CALS(FgMIC()); \
CALS(FgMIN()); \
\
RCG(ACCES_CONTEXTE_I(co_s1_14)); \
gA; \
RCG(ACCES_CONTEXTE_I(co_s1_15)); \
SET_COULEURS(NOIR,niveau_de_trace_des_squelettes_niveau_0); \
gB; \
RCG(ACCES_CONTEXTE_I(co_s1_16)); \
SET_COULEURS(NOIR,niveau_de_trace_des_squelettes_niveau_0); \
gB; \
RCG(ACCES_CONTEXTE_I(co_s1_17)); \
SET_COULEURS(NOIR,niveau_de_trace_des_squelettes_niveau_0); \
gB; \
RCG(ACCES_CONTEXTE_I(co_s1_14)); \
SET_COULEURS(NOIR,niveau_de_trace_des_squelettes_niveau_0); \
gB; \
\
CALS(FgMON()); \
CALS(FgMOC()); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(marquer_le_centre_de_gravite)) \
Bblock \
EGAL(ASD1(centre_de_gravite,x),DIVI(ASD1(centre_de_gravite,x),FLOT(nombre_de_segments))); \
EGAL(ASD1(centre_de_gravite,y),DIVI(ASD1(centre_de_gravite,y),FLOT(nombre_de_segments))); \
EGAL(ASD1(centre_de_gravite,z),DIVI(ASD1(centre_de_gravite,z),FLOT(nombre_de_segments))); \
\
CALS(FgMIC()); \
\
SET_CURSOR(ASD1(centre_de_gravite,x) \
,ASD1(centre_de_gravite,y) \
,ASD1(centre_de_gravite,z) \
); \
\
gA; \
gB; \
\
CALS(FgMOC()); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(I3ET(EST_AUTORISE(vecteurs_____etat_trace) \
,EST_VRAI(niveau_de_trace_incremental) \
,EST_FAUX(niveau_de_trace_visualisant_la_rotation) \
) \
) \
Bblock \
DEFV(Int,INIT(niveau_incremente,MODU(ADD2(INTE(niveau_de_trace),PAS_COULEURS),NOIR_PLANCHER,BLANC))); \
EGAL(niveau_de_trace,GENP(niveau_incremente)); \
\
SET_COULEURS(NOIR,niveau_de_trace); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock
#define ROTATION_INITIALE \
Bblock \
INITIALISATION_SYSTEMATIQUE_TRANSFORMATION; \
\
Test(IL_FAUT(faire_une_rotation_initiale)) \
Bblock \
Test(IL_FAUT(faire_une_symetrie_d_axe_OY)) \
Bblock \
TRZ(GRO3(PI_SUR_4)); \
/* On se retrouve alors dans le cas de 'v $xrd/spectre.01$K'... */ \
Eblock \
ATes \
Bblock \
TRZ(GRO1(PI_SUR_4)); \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock
#define GENERE_SPECTRE_0(memoriser,niveau,numeroter,niveau_numeros_cotes,inverser_les_numeros) \
Bblock \
SET_COULEURS(NOIR,niveau); \
GENERE_SPECTRE_n(memoriser \
,_00,_01,_02,_03,_04,_05,_06,_07,_08,_09,_10,_11,_12,_13,_s1_14,_s1_15,_s1_16,_s1_17 \
,numeroter,niveau_numeros_cotes,inverser_les_numeros \
); \
/* Definition du "Spectre" 0. */ \
\
INCR(nombre_de_spectres_traces,I); \
/* On notera que 'GENERE_SPECTRE_0(...)' est toujours execute (ce qui fait qu'on trace */ \
/* toujours au moins un "Spectre", le "Spectre" 0...), contrairement aux suivants via */ \
/* 'NOUVEAU_SPECTRE_2(...)' qui permet de n'en tracer que 1,2,3,... */ \
Eblock
#define GENERE_SPECTRE_2(memoriser,numeroter,niveau_numeros_cotes,inverser_les_numeros) \
Bblock \
GENERE_SPECTRE_n(memoriser \
,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_s1_34,_s1_35,_s1_36,_s1_37 \
,numeroter,niveau_numeros_cotes,inverser_les_numeros \
); \
/* Definition du "Spectre" 2. */ \
Eblock
#define TRANSLATION_CURSOR(contexteD,contexteA) \
Bblock \
SET_CURSOR(ADD2(ASD1(vecteurs_____cursor_3D,x) \
,SOUS(ASD2(ACCES_CONTEXTE_I(contexteA),vecteurs_____cursor_3D,x) \
,ASD2(ACCES_CONTEXTE_I(contexteD),vecteurs_____cursor_3D,x) \
) \
) \
,ADD2(ASD1(vecteurs_____cursor_3D,y) \
,SOUS(ASD2(ACCES_CONTEXTE_I(contexteA),vecteurs_____cursor_3D,y) \
,ASD2(ACCES_CONTEXTE_I(contexteD),vecteurs_____cursor_3D,y) \
) \
) \
,Zcentre_normalise \
); \
Eblock
#define NOUVEAU_SPECTRE_2_1(rotation,numeroter,niveau_numeros_cotes,inverser_les_numeros) \
Bblock \
RCG(ACCES_CONTEXTE_D(SOMMET_DE_REFERENCE)); \
ROTATION_INITIALE; \
TRZ(ANGLE_DE_ROTATION(rotation)); \
\
SET_TRACE(INTERDIT); \
CALS(fGENERE_SPECTRE_2(MEMORISER_LE_CONTEXTE,numeroter,niveau_numeros_cotes,inverser_les_numeros)); \
/* Pourquoi ne peut-on pas supprimer ce 'GENERE_SPECTRE_2(VRAI)' identique strictement */ \
/* a celui qui suit un peu plus bas ? Le 20230731093733, je note que la difference entre */ \
/* les deux est la presence de 'TRANSLATION_CURSOR(...)' entre eux... */ \
\
RCG(ACCES_CONTEXTE_D(SOMMET_DE_REFERENCE)); \
ROTATION_INITIALE; \
TRZ(ANGLE_DE_ROTATION(rotation)); \
Eblock
#define NOUVEAU_SPECTRE_2_2(niveau,numeroter,niveau_numeros_cotes,inverser_les_numeros) \
Bblock \
SET_TRACE(AUTORISE); \
SET_COULEURS(NOIR,niveau); \
CALS(fGENERE_SPECTRE_2(MEMORISER_LE_CONTEXTE,numeroter,niveau_numeros_cotes,inverser_les_numeros)); \
Eblock
DEFV(Local,DEFV(Int,INIT(rotation_definissant_eventuellement_le_niveau,P0pis6)));
/* Initialisation a priori sur le premier spectre 'GENERE_SPECTRE_0(...)'. */
#define DEPLACER__0_2 \
VRAI
#define NE_PAS_DEPLACER__0_2 \
NOTL(DEPLACER__0_2)
#define NOUVEAU_SPECTRE_2(deplacer__0_2,niveau,numeroter,niveau_numeros_cotes,inverser_les_numeros,rotation,contexteA,contexteD) \
Bblock \
Test(IFLT(nombre_de_spectres_traces,nombre_maximal_de_spectres)) \
/* Contrairement a 'GENERE_SPECTRE_0(...)' qui est inconditionnel, 'NOUVEAU_SPECTRE_2(...)' */ \
/* est conditionnel ce qui permet de ne tracer que 1,2,3,... "Spectre"s... */ \
Bblock \
EGAL(rotation_definissant_eventuellement_le_niveau,rotation); \
/* Au cas ou... */ \
\
Test(IL_FAUT(deplacer__0_2)) \
Bblock \
CALS(fMOVE_SPECTRE_0_2()); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
CALS(fNOUVEAU_SPECTRE_2_1(rotation,NE_PAS_NUMEROTER_LES_COTES,niveau_numeros_cotes,inverser_les_numeros)); \
\
TRANSLATION_CURSOR(contexteD,contexteA); \
\
CALS(fNOUVEAU_SPECTRE_2_2(niveau,numeroter,niveau_numeros_cotes,inverser_les_numeros)); \
\
INCR(nombre_de_spectres_traces,I); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock
#define MOVE_SPECTRE_0_2 \
Bblock \
MCG(vecteurs_____Gcon_00,vecteurs_____Gcon_20); \
MCG(vecteurs_____Gcon_01,vecteurs_____Gcon_21); \
MCG(vecteurs_____Gcon_02,vecteurs_____Gcon_22); \
MCG(vecteurs_____Gcon_03,vecteurs_____Gcon_23); \
MCG(vecteurs_____Gcon_04,vecteurs_____Gcon_24); \
MCG(vecteurs_____Gcon_05,vecteurs_____Gcon_25); \
MCG(vecteurs_____Gcon_06,vecteurs_____Gcon_26); \
MCG(vecteurs_____Gcon_07,vecteurs_____Gcon_27); \
MCG(vecteurs_____Gcon_08,vecteurs_____Gcon_28); \
MCG(vecteurs_____Gcon_09,vecteurs_____Gcon_29); \
MCG(vecteurs_____Gcon_10,vecteurs_____Gcon_30); \
MCG(vecteurs_____Gcon_11,vecteurs_____Gcon_31); \
MCG(vecteurs_____Gcon_12,vecteurs_____Gcon_32); \
MCG(vecteurs_____Gcon_13,vecteurs_____Gcon_33); \
Eblock
#define AIDES_DIVERSES_APRES_LE_TRACE \
Bblock \
Test(IL_FAUT(editer_les_mises_a_jour_a_effectuer)) \
Bblock \
CAL3(Prme4("\n\nclear%c;%csaut%c;%c$xrd/spectre.11$Z '",K_BLANC,K_BLANC,K_BLANC,K_BLANC)); \
CAL3(Prme2(",%c%1dpis6",COND(IZGE(angle_d_inclinaison),K_P,K_M),ABSO(angle_d_inclinaison))); \
CAL3(Prme2(",%c%02d",K_UNDERSCORE,contexte_0)); \
CAL3(Prme2(",%c%02d",K_UNDERSCORE,contexte_2)); \
CAL3(Prme2("' |& $EGRE ' reference | xrd$| cl '%c;%csaut\n\n",K_BLANC,K_BLANC)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(editer_le_nombre_de_spectres_traces)) \
Bblock \
CAL3(Prme1("NombreSpectres=%d\n",nombre_de_spectres_traces)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(trace_un_cadre_carre)) \
Bblock \
DEFV(Float,INIT(moyenne_des_extrema_Z \
,MOYE(DRAW_____minimum_Z__trace_AUTORISE,DRAW_____maximum_Z__trace_AUTORISE) \
) \
); \
\
Test(IFNE_a_peu_pres_absolu(moyenne_des_extrema_Z,Zcentre_normalise,tgEPSILON)) \
Bblock \
PRINT_ATTENTION("il y a un probleme avec la coordonnee 'Z'"); \
CAL1(Prer2("(la moyenne des extrema vaut %+.^^^ alors qu'elle devrait valoir %+.^^^)\n" \
,moyenne_des_extrema_Z \
,Zcentre_normalise \
) \
); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
SET_COULEURS(NOIR,niveau_du_cadre); \
\
SET_CURSOR(DRAW_____minimum_X__trace_AUTORISE \
,DRAW_____minimum_Y__trace_AUTORISE \
,moyenne_des_extrema_Z \
); \
gA; \
\
SET_CURSOR(DRAW_____maximum_X__trace_AUTORISE \
,DRAW_____minimum_Y__trace_AUTORISE \
,moyenne_des_extrema_Z \
); \
gB; \
\
SET_CURSOR(DRAW_____maximum_X__trace_AUTORISE \
,DRAW_____maximum_Y__trace_AUTORISE \
,moyenne_des_extrema_Z \
); \
gB; \
\
SET_CURSOR(DRAW_____minimum_X__trace_AUTORISE \
,DRAW_____maximum_Y__trace_AUTORISE \
,moyenne_des_extrema_Z \
); \
gB; \
\
SET_CURSOR(DRAW_____minimum_X__trace_AUTORISE \
,DRAW_____minimum_Y__trace_AUTORISE \
,moyenne_des_extrema_Z \
); \
gB; \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#define X_CENTRE_DU_PAVAGE \
DIVI(FLOT(230),FLOT(dimX_BASE))
#define Y_CENTRE_DU_PAVAGE \
DIVI(FLOT(256),FLOT(dimY_BASE))
/* Centre du pavage... */
#define NOMBRE_MAXIMAL_DE_SPECTRES \
INFINI
#define EDITER_LE_NOMBRE_DE_SPECTRES_TRACES \
FAUX
/* Pour gerer le nombre de spectres... */
#define EDITER_LES_MISES_A_JOUR_A_EFFECTUER \
FAUX \
/* Faut-il editer les mises a jour a effectuer dans ce '$K' ? */
#define FAIRE_UNE_ROTATION_INITIALE \
VRAI \
/* Faut-il faire une rotation initiale de (3.pi)/4 ? */
#define ECHELLE_GLOBALE \
GRO3(FRA2(FU)) \
/* Echelle globale... */
#define NIVEAU_DE_TRACE_DE_QUASIMENT_TOUS_LES_SPECTRES \
GRIS_1
#define NIVEAU_DE_TRACE_DU_SPECTRE_N_1 \
GRIS_3
#define NIVEAU_DE_TRACE_DU_SPECTRE_N \
GRIS_6
/* Niveau general de trace... */
#define NIVEAU_DE_TRACE_INCREMENTAL \
VRAI
#define NIVEAU_DE_TRACE_FIXE \
NOTL(NIVEAU_DE_TRACE_INCREMENTAL)
/* Gestion du niveau general de trace incremental... */
#define NIVEAU_DE_TRACE_VISUALISANT_LA_ROTATION \
VRAI
#define NIVEAU_DE_TRACE_NE_VISUALISANT_PAS_LA_ROTATION \
NOTL(NIVEAU_DE_TRACE_VISUALISANT_LA_ROTATION)
#define FACTEUR_____DU_NIVEAU_DE_TRACE_VISUALISANT_LA_ROTATION \
SEIZE
#define TRANSLATION_DU_NIVEAU_DE_TRACE_VISUALISANT_LA_ROTATION \
ADD2(GRIS_0,MOIT(COULEURS))
/* On notera qu'il y 13 angles possibles {-6,-5,-4,-3,-2,-1,0,+1,+2,+3,+4,+5,+6}. La */
/* symetrie par rapport a 0 implique que la translation des niveaux soient situees au */
/* milieu de {NOIR,BLANC}. Enfin, le facteur doit etre inferieur ou egal a la translation */
/* divisee par 7 (=6+1, soit le cardinal de {0,+1,+2,+3,+4,+5,+6}) qui est egal a 18.28 ; */
/* on prend donc 16... */
#define NIVEAU_DE_TRACE_VISUALISANT_LA_VALEUR_ABSOLUE_DE_LA_ROTATION \
VRAI
#define NIVEAU_DE_TRACE_NE_VISUALISANT_PAS_LA_VALEUR_ABSOLUE_DE_LA_ROTATION \
NOTL(NIVEAU_DE_TRACE_VISUALISANT_LA_VALEUR_ABSOLUE_DE_LA_ROTATION)
#define FACTEUR_____DU_NIVEAU_DE_TRACE_VISUALISANT_LA_VALEUR_ABSOLUE_DE_LA_ROTATION \
ADD2(GRO2(FACTEUR_____DU_NIVEAU_DE_TRACE_VISUALISANT_LA_ROTATION),CINQ)
#define TRANSLATION_DU_NIVEAU_DE_TRACE_VISUALISANT_LA_VALEUR_ABSOLUE_DE_LA_ROTATION \
ADD2(GRIS_1,DEUX)
/* Gestion du niveau general de trace visualisant la rotation. En fait il y a en "gros" */
/* un facteur 2 (a cause de la valeur absolue qui nous ramene a {0,+1,+2,+3,+4,+5,+6}) */
/* avec la parametrage du cas sans valeur absolue. Les parametres par defaut placent */
/* les niveaux de remplissage dans [$GRIS_1,$GRIS_8]... */
#define NIVEAU_DU_CADRE \
GRIS_4 \
/* Niveau du cadre... */
#define ANTI_ALIASING \
FAUX \
/* Etat de l'anti-aliasing... */
#define TRACE_UN_CADRE_CARRE \
FAUX \
/* Afin de pouvoir tracer un cadre carre englobant l'ensemble des spectres... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N S D E S T I N E E S A O P T I M I S E R L E C O D E : */
/* */
/*************************************************************************************************************************************/
DEFV(Local,DEFV(Int,INIT(nombre_de_spectres_traces,ZERO)));
DEFV(Local,DEFV(genere_p,INIT(niveau_de_trace,NIVEAU_DE_TRACE_DE_QUASIMENT_TOUS_LES_SPECTRES)));
DEFV(Local,DEFV(genere_p,INIT(niveau_de_trace_N_1,NIVEAU_DE_TRACE_DU_SPECTRE_N_1)));
DEFV(Local,DEFV(genere_p,INIT(niveau_de_trace_N,NIVEAU_DE_TRACE_DU_SPECTRE_N)));
/* Niveaux generaux de trace... */
DEFV(Local,DEFV(Logical,INIT(niveau_de_trace_incremental,NIVEAU_DE_TRACE_FIXE)));
DEFV(Local,DEFV(Logical,INIT(niveau_de_trace_visualisant_la_rotation,NIVEAU_DE_TRACE_NE_VISUALISANT_PAS_LA_ROTATION)));
DEFV(Local,DEFV(Int,INIT(facteur_____du_niveau_de_trace_visualisant_la_rotation
,FACTEUR_____DU_NIVEAU_DE_TRACE_VISUALISANT_LA_ROTATION
)
)
);
DEFV(Local,DEFV(Int,INIT(translation_du_niveau_de_trace_visualisant_la_rotation
,TRANSLATION_DU_NIVEAU_DE_TRACE_VISUALISANT_LA_ROTATION
)
)
);
DEFV(Local,DEFV(Logical,INIT(niveau_de_trace_visualisant_la_valeur_absolue_de_la_rotation
,NIVEAU_DE_TRACE_NE_VISUALISANT_PAS_LA_VALEUR_ABSOLUE_DE_LA_ROTATION
)
)
);
DEFV(Local,DEFV(Int,INIT(facteur_____du_niveau_de_trace_visualisant_la_valeur_absolue_de_la_rotation
,FACTEUR_____DU_NIVEAU_DE_TRACE_VISUALISANT_LA_VALEUR_ABSOLUE_DE_LA_ROTATION
)
)
);
DEFV(Local,DEFV(Int,INIT(translation_du_niveau_de_trace_visualisant_la_valeur_absolue_de_la_rotation
,TRANSLATION_DU_NIVEAU_DE_TRACE_VISUALISANT_LA_VALEUR_ABSOLUE_DE_LA_ROTATION
)
)
);
BFonctionV
DEFV(Local,DEFV(FonctionV,fGENERE_SPECTRE_0(memoriser,niveau,numeroter,niveau_numeros_cotes,inverser_les_numeros)))
DEFV(Argument,DEFV(Logical,memoriser));
DEFV(Argument,DEFV(genere_p,niveau));
DEFV(Argument,DEFV(Logical,numeroter));
DEFV(Argument,DEFV(genere_p,niveau_numeros_cotes));
DEFV(Argument,DEFV(Logical,inverser_les_numeros));
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
GENERE_SPECTRE_0(memoriser,niveau,numeroter,niveau_numeros_cotes,inverser_les_numeros);
RETU_VIDE
Eblock
EFonctionV
BFonctionV
DEFV(Local,DEFV(FonctionV,fGENERE_SPECTRE_2(memoriser,numeroter,niveau_numeros_cotes,inverser_les_numeros)))
DEFV(Argument,DEFV(Logical,memoriser));
DEFV(Argument,DEFV(Logical,numeroter));
DEFV(Argument,DEFV(genere_p,niveau_numeros_cotes));
DEFV(Argument,DEFV(Logical,inverser_les_numeros));
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
GENERE_SPECTRE_2(memoriser,numeroter,niveau_numeros_cotes,inverser_les_numeros);
RETU_VIDE
Eblock
EFonctionV
BFonctionV
DEFV(Local,DEFV(Logical,INIT(faire_une_rotation_initiale,FAIRE_UNE_ROTATION_INITIALE)));
/* Faut-il faire une rotation initiale de (3.pi)/4 ? */
DEFV(Local,DEFV(FonctionV,fNOUVEAU_SPECTRE_2_1(rotation,numeroter,niveau_numeros_cotes,inverser_les_numeros)))
DEFV(Argument,DEFV(Int,rotation));
DEFV(Argument,DEFV(Logical,numeroter));
DEFV(Argument,DEFV(genere_p,niveau_numeros_cotes));
DEFV(Argument,DEFV(Logical,inverser_les_numeros));
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
NOUVEAU_SPECTRE_2_1(rotation,numeroter,niveau_numeros_cotes,inverser_les_numeros);
RETU_VIDE
Eblock
EFonctionV
BFonctionV
DEFV(Local,DEFV(FonctionV,fNOUVEAU_SPECTRE_2_2(niveau,numeroter,niveau_numeros_cotes,inverser_les_numeros)))
DEFV(Argument,DEFV(genere_p,niveau));
DEFV(Argument,DEFV(Logical,numeroter));
DEFV(Argument,DEFV(genere_p,niveau_numeros_cotes));
DEFV(Argument,DEFV(Logical,inverser_les_numeros));
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
NOUVEAU_SPECTRE_2_2(niveau,numeroter,niveau_numeros_cotes,inverser_les_numeros);
RETU_VIDE
Eblock
EFonctionV
BFonctionV
DEFV(Local,DEFV(FonctionV,fMOVE_SPECTRE_0_2()))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
MOVE_SPECTRE_0_2;
RETU_VIDE
Eblock
EFonctionV
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T R A C E D U S P E C T R E : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
DEFV(Float,INIT(X_centre_du_pavage,X_CENTRE_DU_PAVAGE));
DEFV(Float,INIT(Y_centre_du_pavage,Y_CENTRE_DU_PAVAGE));
/* Centre du pavage... */
DEFV(Int,INIT(nombre_maximal_de_spectres,NOMBRE_MAXIMAL_DE_SPECTRES));
DEFV(Logical,INIT(editer_le_nombre_de_spectres_traces,EDITER_LE_NOMBRE_DE_SPECTRES_TRACES));
/* Pour gerer le nombre de spectres... */
DEFV(Logical,INIT(editer_les_mises_a_jour_a_effectuer,EDITER_LES_MISES_A_JOUR_A_EFFECTUER));
/* Pour editer les mises a jour a effectuer dans ce '$K' pour la prochaine iteration... */
DEFV(Float,INIT(echelle_globale,ECHELLE_GLOBALE));
/* Echelle globale... */
DEFV(Logical,INIT(anti_aliasing,ANTI_ALIASING));
/* Etat de l'anti-aliasing... */
DEFV(Logical,INIT(trace_un_cadre_carre,TRACE_UN_CADRE_CARRE));
/* Afin de pouvoir tracer un cadre carre englobant l'ensemble des spectres... */
DEFV(genere_p,INIT(niveau_du_cadre,NIVEAU_DU_CADRE));
/* Niveau general de trace... */
/*..............................................................................................................................*/
GET_ARGUMENTSv(nombre_d_arguments
,BLOC(GET_ARGUMENT_L("SX_SY_SZ_____compatibilite_20070416=""compatibilite_20070416="
,SX_SY_SZ_____compatibilite_20070416
);
GET_ARGUMENT_L("Ipoint_anti_aliase_segment_____compatibilite_20110420=""compatibilite_20110420="
,Ipoint_anti_aliase_segment_____compatibilite_20110420
);
GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_L("rotation_initiale=""ri=",faire_une_rotation_initiale);
GET_ARGUMENT_L("symetrie_OY=""sOY=",faire_une_symetrie_d_axe_OY);
GET_ARGUMENT_F("pis2=""p2=",pi_sur_2);
GET_ARGUMENT_F("pis3=""p3=",pi_sur_3);
GET_ARGUMENT_F("pis6=""p6=",pi_sur_6);
GET_ARGUMENT_F("X_centre=""Xc=",X_centre_du_pavage);
GET_ARGUMENT_F("Y_centre=""Yc=",Y_centre_du_pavage);
GET_ARGUMENT_I("nombre_maximal_spectres=""nms=",nombre_maximal_de_spectres);
/* Pour obtenir les deux "clusters" interessant de "Spectres"s (incluant un "Mystic" au */
/* passage), il faut choisir respectivement : */
/* */
/* nombre_maximal_spectres=8 */
/* nombre_maximal_spectres=9 */
/* */
GET_ARGUMENT_L("editer_nombre_spectres=""ens=",editer_le_nombre_de_spectres_traces);
GET_ARGUMENT_L("mises_a_jour=""maj=",editer_les_mises_a_jour_a_effectuer);
GET_ARGUMENT_L("numeroter_cotes=""nc=",numeroter_les_cotes);
GET_ARGUMENT_I("angle_inclinaison=""ai=",angle_d_inclinaison);
GET_ARGUMENT_I("contexte_0=""c0=",contexte_0);
GET_ARGUMENT_I("contexte_2=""c2=",contexte_2);
/* Sur '$LACT1B', on definira : */
/* */
/* alias spectre 'set ArGs=(\!*) ; \ */
/* clear ; \ */
/* $xrd/spectre.11$X maj=VRAI nc=FAUX $ArGs | $xci/display$X & \ */
/* ' */
/* */
/* Puis, on essaiera heuristiquement les parametres suivants : */
/* */
/* spectre ai=... co=... c2=... */
/* */
/* Lorsque le nouveau spectre (GRIS_6=jaune) s'accolera parfaitement au precedent */
/* (GRIS_3=magenta), alors les commandes editees du type : */
/* */
/* clear ; saut ; $xrd/spectre.11$Z ',...' |& $EGRE ' reference | xrd$| cl ' ; saut */
/* */
/* seront copiees-collees sur '$LACT19', ce qui mettra a jour automatiquement le source */
/* de 'v $xrd/spectre.11$K' (sur '$LACT19') et on bouclera sur ce processus... */
GET_ARGUMENT_L("squelettes=""ms=""squelette_0=""ms0=",marquer_les_squelettes_niveau_0);
GET_ARGUMENT_L("premier_squelette=""mps=""premier_squelette_0=""mps0=",marquer_le_premier_squelette_niveau_0);
GET_ARGUMENT_P("niveau_squelette=""ns=""niveau_squelette_0=""ns0=",niveau_de_trace_des_squelettes_niveau_0);
/* Le marquage optionnel du premier squelette est lie a l'existence des deux "clusters" */
/* interessant de "Spectres"s (incluant un "Mystic" au passage) pour lesquels le premier */
/* squelette ne doit pas etre marque... */
GET_ARGUMENT_L("super_squelette=""mss=""squelette_1=""ms1="
,marquer_le_squelette_niveau_1
);
GET_ARGUMENT_P("niveau_super_squelette=""nss=""niveau_squelette_1=""ns1="
,niveau_de_trace_du_squelette_niveau_1
);
/* Arguments introduits le 20230906100908... */
GET_ARGUMENT_L("centre_gravite=""G=",marquer_le_centre_de_gravite);
GET_ARGUMENT_F("echelle=",echelle_globale);
GET_ARGUMENT_P("niveau=""n=",niveau_de_trace);
GET_ARGUMENT_P("niveauN1=""nN1=",niveau_de_trace_N_1);
GET_ARGUMENT_P("niveauN=""nN=",niveau_de_trace_N);
GET_ARGUMENT_L("niveau_incremental=""ni=",niveau_de_trace_incremental);
GET_ARGUMENT_L("niveau_rotation=""nr=",niveau_de_trace_visualisant_la_rotation);
GET_ARGUMENT_I("Aniveau_rotation=""Anr=",facteur_____du_niveau_de_trace_visualisant_la_rotation);
GET_ARGUMENT_I("Bniveau_rotation=""Bnr=",translation_du_niveau_de_trace_visualisant_la_rotation);
GET_ARGUMENT_L("niveau_rotation_absolue=""nra="
,niveau_de_trace_visualisant_la_valeur_absolue_de_la_rotation
);
GET_ARGUMENT_I("Aniveau_rotation_absolue=""Anra="
,facteur_____du_niveau_de_trace_visualisant_la_valeur_absolue_de_la_rotation
);
GET_ARGUMENT_I("Bniveau_rotation_absolue=""Bnra="
,translation_du_niveau_de_trace_visualisant_la_valeur_absolue_de_la_rotation
);
GET_ARGUMENT_L("anti_aliasing=""aa=",anti_aliasing);
GET_ARGUMENT_L("editer_vecteurs=""ev=",IFsegment_____editer_le_vecteur_bidimensionnel);
GET_ARGUMENT_L("trier_vecteurs=""tv=",IFsegment_____trier_puis_editer_le_vecteur_bidimensionnel);
/* L'argument de tri a ete introduit le 20231012142526... */
GET_ARGUMENT_L("cadre=""cc=",trace_un_cadre_carre);
GET_ARGUMENT_P("niveau_cadre=""nk=",niveau_du_cadre);
)
);
Test(IFNE(SOMMET_DE_REFERENCE,_00))
Bblock
PRINT_ERREUR("le numerotage des contextes graphiques est incoherent, on aborte donc");
CAL1(Prer2("(le sommet de reference est %d alors que le premier contexte est %d)\n",SOMMET_DE_REFERENCE,_00));
Exit(PROBLEMES);
Eblock
ATes
Bblock
Eblock
ETes
Test(IFLT(nombre_maximal_de_spectres,UN))
Bblock
PRINT_ATTENTION("au moins un 'Spectre' va etre trace");
EGAL(nombre_maximal_de_spectres,UN);
Eblock
ATes
Bblock
Eblock
ETes
Test(IFET(IL_FAUT(marquer_le_squelette_niveau_1)
,IFLT(nombre_maximal_de_spectres,NOMBRE_MINIMAL_DE_SPECTRES_POUR_DEFINIR_LE_SUPER_SQUELETTE)
)
)
Bblock
PRINT_ATTENTION("il n'y a pas assez de 'Spectre's pour marquer le 'super-squelette'");
CAL1(Prer1("(il en faut au moins %d)\n",NOMBRE_MINIMAL_DE_SPECTRES_POUR_DEFINIR_LE_SUPER_SQUELETTE));
EGAL(marquer_le_squelette_niveau_1,FAUX);
Eblock
ATes
Bblock
Eblock
ETes
Test(NINCff(contexte_0,_00,_13))
Bblock
PRINT_ERREUR("le numero de contexte 0 est mauvais, il est donc reinitialise");
EGAL(contexte_0,_00);
Eblock
ATes
Bblock
Eblock
ETes
Test(NINCff(angle_d_inclinaison,MINIMUM_pis6,MAXIMUM_pis6))
Bblock
PRINT_ERREUR("l'angle d'inclinaison est mauvais, il est donc reinitialise");
CAL1(Prer3("(il vaut %+d, alors qu'il doit etre dans [%+d,%+d])\n"
,angle_d_inclinaison
,MINIMUM_pis6
,MAXIMUM_pis6
)
);
EGAL(angle_d_inclinaison,P0pis6);
Eblock
ATes
Bblock
Eblock
ETes
Test(NINCff(contexte_2,_20,_33))
Bblock
PRINT_ERREUR("le numero de contexte 2 est mauvais, il est donc reinitialise");
EGAL(contexte_2,_20);
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(numeroter_les_cotes))
Bblock
EGAL(FgL0_00_____remplacer_par_un_O,VRAI);
/* Pour plus de lisibilite... */
Eblock
ATes
Bblock
Eblock
ETes
SUPER_ECHELLE_PETIT_CARRE;
/* Choix du format des figures obtenues : */
/* */
/* SUPER_ECHELLE_RECTANGULAIRE; */
/* SUPER_ECHELLE_PETIT_CARRE; */
/* SUPER_ECHELLE_GRAND_CARRE; */
/* */
CALi(Inoir(ImageR));
/* Initialisation de l'image Resultat. */
CALS(FgERASE());
/* Clear... */
SET_FILTRAGE(ACTIF);
CALS(Iinit_Z_Buffer());
SET_ANTI_ALIASING(anti_aliasing);
SKH(ECHELLES);
/* Definition de l'echelle globale. */
SXH(ECHELLES);
/* Definition de l'echelle sur l'axe des 'X'. */
SYH(ECHELLES);
/* Definition de l'echelle sur l'axe des 'Y'. */
SET_CURSOR(X_centre_du_pavage
,Y_centre_du_pavage
,Zcentre_normalise
);
SKH(echelle_globale);
/* Changement de l'echelle globale. */
SET_TRACE(AUTORISE);
EGAL(DRAW_____initialiser_les_extrema_de_X_Y_Z,VRAI);
ROTATION_INITIALE;
CALS(fGENERE_SPECTRE_0(MEMORISER_LE_CONTEXTE,niveau_de_trace,NE_PAS_NUMEROTER_LES_COTES,GRIS_5,FAUX));
/* Definition et generation du "Spectre" central (de base)... */
#define NIVEAU_SPECTRE \
niveau_de_trace
#define NUMEROTER_COTES \
NE_PAS_NUMEROTER_LES_COTES
#define NIVEAU_NUMEROS \
GRIS_4
#include xrd/spectre.11.1.I"
#redefine NIVEAU_SPECTRE \
niveau_de_trace_N_1
#redefine NUMEROTER_COTES \
numeroter_les_cotes
#redefine NIVEAU_NUMEROS \
GRIS_4
#include xrd/spectre.11.2.I"
#redefine NIVEAU_SPECTRE \
niveau_de_trace_N
#redefine NUMEROTER_COTES \
numeroter_les_cotes
#redefine NIVEAU_NUMEROS \
GRIS_5
NOUVEAU_SPECTRE_2(DEPLACER__0_2,NIVEAU_SPECTRE,NUMEROTER_COTES,NIVEAU_NUMEROS,FAUX
,angle_d_inclinaison,contexte_0,contexte_2
);
/* Afin de permettre le parametrage du dernier 'NOUVEAU_SPECTRE_2(...)'... */
AIDES_DIVERSES_APRES_LE_TRACE;
Test(EST_AUTORISE(vecteurs_____etat_trace))
Bblock
Test(IL_FAUT(marquer_le_squelette_niveau_1))
/* Possibilite introduite le 20230906102051... */
Bblock
CALS(FgMIC());
CALS(FgMIN());
RCG(ACCES_CONTEXTE_I(_s2_18));
gA;
RCG(ACCES_CONTEXTE_I(_s2_19));
SET_COULEURS(NOIR,niveau_de_trace_du_squelette_niveau_1);
gB;
RCG(ACCES_CONTEXTE_I(_s2_38));
SET_COULEURS(NOIR,niveau_de_trace_du_squelette_niveau_1);
gB;
RCG(ACCES_CONTEXTE_I(_s2_39));
SET_COULEURS(NOIR,niveau_de_trace_du_squelette_niveau_1);
gB;
RCG(ACCES_CONTEXTE_I(_s2_18));
SET_COULEURS(NOIR,niveau_de_trace_du_squelette_niveau_1);
gB;
CALS(FgMON());
CALS(FgMOC());
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
SET_FILTRAGE(INACTIF);
CALS(Imove(ImageR,ImageG));
CALi(Iupdate_image(nom_imageR,ImageR));
RETU_Commande;
Eblock
ECommande