_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N S G R A P H I Q U E S : */
/* */
/* */
/* Definition : */
/* */
/* Dans ce fichier se trouvent toutes */
/* les fonctions et les macros utiles */
/* pour tracer des vecteurs dans des images */
/* raster. */
/* */
/* */
/* Author of '$xiii/vecteurs$FON' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 19870000000000). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C O M P A T I B I L I T E A N T E R I E U R E : */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(SX_SY_SZ_____compatibilite_20070416,FAUX)));
/* Introduit le 20070416154721 a cause du probleme 'v $xiii/vecteurs$DEF 20070416150831'... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* N O T I O N D E " C A D R E " : */
/* */
/* */
/* Definition : */
/* */
/* On appelle "cadre" courant, une */
/* fenetre definie par (Xgauche,Xdroite,Yinferieur,Ysuperieur) */
/* dans l'espace [Xmin,Xmax][Ymin,Ymax] */
/* initialisee telle qu'elle n'existe */
/* pas. Il peut etre redefini */
/* a tout moment par 'SET_CADRE', mais */
/* de plus, lors du marquage d'un point */
/* appartenant a un vecteur 2D, on */
/* regarde si ses coordonnee {X,Y} */
/* sortent du cadre courant ; si oui, */
/* on modifie ce dernier, afin qu'il */
/* englobe ce nouveau point. */
/* */
/* Ainsi, lorsque ces valeurs ont ete */
/* prealablement correctement initialisees, */
/* on peut savoir a l'interieur de quel */
/* "cadre" se trouve un vecteur donne. */
/* */
/* L'initialisation correct de ce */
/* cadre se fait par : */
/* */
/* INITIALISATION_CADRE; */
/* */
/* et son positionnement par : */
/* */
/* SET_CADRE(Xgauche,Xdroite,Yinferieur,Ysuperieur); */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Int,ZINT(Ipoint_segment_____cadre_Xgauche,X_gauche_implicite)));
/* Definition de la gauche du "cadre", */
DEFV(Common,DEFV(Int,ZINT(Ipoint_segment_____cadre_Xdroite,X_droite_implicite)));
/* Definition de la droite du "cadre", */
DEFV(Common,DEFV(Int,ZINT(Ipoint_segment_____cadre_Yinferieur,Y_inferieur_implicite)));
/* Definition de l'inferieur du "cadre", */
DEFV(Common,DEFV(Int,ZINT(Ipoint_segment_____cadre_Ysuperieur,Y_superieur_implicite)));
/* Definition du superieur du "cadre", */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* N O T I O N D E " D E P T H - C U E I N G " : */
/* */
/* */
/* Definition : */
/* */
/* le niveau lumineux impose a */
/* chaque point d'un vecteur peut */
/* etre module par la profondeur 'Z', */
/* c'est le "depth-cueing". */
/* Il est controle par une va- */
/* riable 'Ipoint_segment_____taux_depth_cueing', */
/* qui appartient a [0,1] ; la */
/* valeur '0' correspond a l'absence */
/* de "depth-cueing", alors qu'avec */
/* la valeur '1', le phenomene est */
/* maximale. */
/* */
/* SET_DEPTH_CUEING(taux,Ipoint_segment_____Zed_min,Ipoint_segment_____Zed_max); */
/* */
/* permet de fixer le taux, ainsi que */
/* les bornes de variation de la */
/* coordonnee 'Z'... */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Float,ZINT(Ipoint_segment_____Zed_min,MOIT(F_MOINS_L_INFINI))));
/* Definition de la valeur minimale de 'Z'. On notera le 'MOIT(...)' destine a eviter */
/* des problemes du type : */
/* */
/* Floating point exception */
/* */
/* lors du calcul de : */
/* */
/* SOUS(Ipoint_segment_____Zed_max,Ipoint_segment_____Zed_min) */
/* */
/* dans la procedure : */
/* */
/* DEPTH_CUEING(niveau,profondeur) */
/* */
/* ci-dessous... */
/* */
/* ATTENTION, il y avait autrefois : */
/* */
/* DEFV(Common,DEFV(Float,INIT(Ipoint_segment_____Zed_min,MOINS_L_INFINI))); */
/* */
/* pour eviter simplement le probleme evoque ci-dessus... */
DEFV(Common,DEFV(Float,ZINT(Ipoint_segment_____Zed_max,MOIT(F_INFINI))));
/* Definition de la valeur maximale de 'Z'. On notera le 'MOIT(...)' destine a eviter */
/* des problemes du type : */
/* */
/* Floating point exception */
/* */
/* lors du calcul de : */
/* */
/* SOUS(Ipoint_segment_____Zed_max,Ipoint_segment_____Zed_min) */
/* */
/* dans la procedure : */
/* */
/* DEPTH_CUEING(niveau,profondeur) */
/* */
/* ci-dessous... */
/* */
/* ATTENTION, il y avait autrefois : */
/* */
/* DEFV(Common,DEFV(Float,INIT(Ipoint_segment_____Zed_max,INFINI))); */
/* */
/* pour eviter simplement le probleme evoque ci-dessus... */
/* */
/* On notera que 'Ipoint_segment_____Zed_min' et 'Ipoint_segment_____Zed_max' ne peuvent */
/* etre egales afin d'eviter des divisions par 0 la premiere fois que 'DEPTH_CUEING(...)' */
/* est utilisee... */
DEFV(Common,DEFV(Float,ZINT(Ipoint_segment_____taux_depth_cueing,PAS_DE_DEPTH_CUEING)));
/* Definition du taux de "depth-cueing" ; la valeur initiale est telle */
/* qu'il n'y en aura pas... */
/* ATTENTION, nota important : la variable 'noir_plancher_des_vecteurs' (niveau minimal */
/* utilise lors du marquage des points d'un vecteur ; cette variable est introduite pour */
/* permettre une generation correcte des mires de barres) se situe dans le fichier */
/* '$xiii/Images$STR' et non pas dans '$xiii/vecteurs$FON' car en effet elle est referencee */
/* d'une part par 'SET_FILTRAGE(INACTIF)' et d'autre part par la fonction "incontournable" */
/* 'Nsubstitution(...)' via la procedure 'CAS_ACCES_LISTE_DE_SUBSTITUTION(...)' ; ainsi */
/* cette variable est positionnee meme si les fonctions vectorielles ne sont par utilisees. */
#define DEPTH_CUEING(niveau,profondeur) \
COND(IFEQ(niveau,NOIR) \
,niveau \
,MAX2(MUL2(COMP(SCAL(Ipoint_segment_____taux_depth_cueing \
,SOUS(Ipoint_segment_____Zed_max,Ipoint_segment_____Zed_min) \
,SOUS(Ipoint_segment_____Zed_max \
,COND(IFLT(profondeur,Ipoint_segment_____Zed_min) \
,Ipoint_segment_____Zed_min \
,COND(IFGT(profondeur,Ipoint_segment_____Zed_max) \
,Ipoint_segment_____Zed_max \
,FLOT(profondeur) \
) \
) \
) \
) \
) \
,niveau \
) \
,noir_plancher_des_vecteurs \
) \
) \
/* Modulation de 'niveau' par la 'profondeur' ; on notera que sauf si */ \
/* le 'niveau' argument est 'NOIR', le niveau calcule apres "depth- */ \
/* cueing" est seuille par 'noir_plancher_des_vecteurs'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* A T T R I B U T S V A R I A B L E S D ' U N V E C T E U R : */
/* */
/* */
/* Definition : */
/* */
/* A l'origine et a l'extremite */
/* d'un vecteur plan, on attache */
/* un attribut dit "origine" et */
/* "extremite" ; un coefficient */
/* barycentrique "lambda" varie */
/* dans [0,1] lors du balayage */
/* du vecteur. Ainsi, au point */
/* courant du vecteur est associe */
/* un attribut variable ayant pour */
/* valeur : */
/* */
/* BARY(origine,extremite,lambda), */
/* */
/* avec comme application la gestion */
/* de l'elimination des parties */
/* cachees pour les vecteurs 3D ; */
/* l'attribut est alors la troisieme */
/* dimension 'Z'. */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Float,INIT(IIsegment_____attribut_origine,FLOT__UNDEF)));
/* Valeur de l'attribut a l'origine d'un vecteur 2D, */
DEFV(Common,DEFV(Float,INIT(IIsegment_____attribut_extremite,FLOT__UNDEF)));
/* Valeur de l'attribut a l'extremite d'un vecteur 2D. */
DEFV(Common,DEFV(Float,INIT(IIsegment_____attribut_intermediaire,FLOT__UNDEF)));
/* Coefficient barycentrique de parcours de [origine,extremite]. */
#define coordonnee_Z \
BARY(IIsegment_____attribut_origine,IIsegment_____attribut_extremite,IIsegment_____attribut_intermediaire) \
/* Definition de la troisieme coordonnee. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* E D I T I O N D E S C O O R D O N N E E S B I D I M E N S I O N N E L L E S E T D U N I V E A U : */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_coordonnees_X_Y_et_les_niveaux,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_coordonnees_X_Y_en_entiers,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_points_hors_image,VRAI)));
/* Introduit le 20230511092206 pour 'v $xci/message$K editer_les_coordonnees_X_Y' et */
/* modifie le 20230517092722 afin de pouvoir editer memes les points hors-image... */
#define EDITION_DES_VECTEURS_BIDIMENSIONNELS(editer,Xf,Yf,X,Y,niveau) \
/* Les arguments {Xf,Yf} ont ete introduits le 20230520102205 pour 'v $xiirv/PEAN.P1'... */ \
Bblock \
Test(IL_FAUT(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_coordonnees_X_Y_et_les_niveaux)) \
/* Possibilite introduite le 20230511092206... */ \
Bblock \
Test(IL_FAUT(editer)) \
/* Possibilite introduite le 20230517092722... */ \
Bblock \
Test(IL_FAUT(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_coordonnees_X_Y_en_entiers)) \
/* Possibilite introduite le 20230520102205... */ \
Bblock \
CAL3(Prme3("X=%d Y=%d N=%d\n",X,Y,niveau)); \
/* On notera que malheureusement ce sont les coordonnees bidimensionnelles entieres {X,Y} */ \
/* qui sont editees. En effet, il est impossible d'en faire de meme avec les coordonnees */ \
/* tridimensionnelles flottantes {Xf,Yf,Zf} car, en effet, ces dernieres ne sont utilisees */ \
/* que pour les extremites des vecteurs et non point pour les points interpoles entre elles. */ \
/* L'interpolation porte sur les projections 'Projection_O?(...)' et donc sur des points */ \
/* bidimensionnels... */ \
Eblock \
ATes \
Bblock \
CAL3(Prme3("X=%+.^^^ Y=%+.^^^ N=%d\n",Xf,Yf,niveau)); \
/* L'edition flottante a ete introduite le 20230520102205 pour 'v $xiirv/PEAN.P1'... */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Edition conditionnelle des points bidimensionnels et de leur niveau... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E G R A D E D E S N I V E A U X L E L O N G D ' U N V E C T E U R : */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(genere_p,ZINT(fonction_interpolation_degrade_des_vecteurs_____niveau_de_NOIR_du_degrade_d_un_vecteur,NOIR)));
/* Niveau minimal utilise par la fonction 'fonction_interpolation_degrade_des_vecteurs()'. */
#define store_point_vector(valeur,imageR,Xf,Yf,X,Y,Vf) \
Bblock \
DEFV(genere_p,INIT(valeur_effective,APPLY(degrade_des_vecteurs,valeur))); \
\
EDITION_DES_VECTEURS_BIDIMENSIONNELS(NOTL(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_points_hors_image) \
,Xf,Yf \
,X,Y \
,valeur_effective \
); \
\
store_point_valide(valeur_effective,imageR,X,Y,Vf); \
Eblock \
/* Rangement d'un point graphique avec application de l'apply de degrade. */
BFonctionP
DEFV(Common,DEFV(FonctionP,fAPPLY_____fonction_neutre_____degrade_des_vecteurs(niveau)))
/* Le 20101222201837 "fAPPLY_____" a ete ajoute pour 'v $xcg/LArgTypFo$vv$Z 20101222210652'. */
DEFV(Argument,DEFV(genere_p,niveau));
/* Niveau a laisser intact. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(NEUT(niveau));
Eblock
EFonctionP
BFonctionP
DEFV(Common,DEFV(FonctionP,fAPPLY_____fonction_interpolation_____degrade_des_vecteurs(niveau)))
/* Le 20101222201837 "fAPPLY_____" a ete ajoute pour 'v $xcg/LArgTypFo$vv$Z 20101222210652'. */
DEFV(Argument,DEFV(genere_p,niveau));
/* Niveau maximum, l'interpolation ayant lieu entre 'NOIR' et 'niveau' suivant la */
/* coordonnee barycentrique 'IIsegment_____attribut_intermediaire'. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(BARY(fonction_interpolation_degrade_des_vecteurs_____niveau_de_NOIR_du_degrade_d_un_vecteur
,niveau
,IIsegment_____attribut_intermediaire
)
);
Eblock
EFonctionP
BPointeurFonctionP
DEFINITION_D_UN_APPLY(degrade_des_vecteurs,PointeurFonctionP,fonction_neutre); /* Common,DEFV(Fonction,) : degrade des vecteurs. */
/* definition de l'apply relatif au degrade des vecteurs. */
/* */
/* Le passage de 'genere_p' a 'FonctionP' a eu lieu le 20040619105717 afin de permettre, en */
/* 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', le traitement de */
/* l'argument d'une telle fonction par 'v $xcc/cpp$Z 20040618143320'. */
/* */
/* Le 20101222152407, "Common,DEFV(Fonction,) :" a remplace "Common :" errone... */
EPointeurFonctionP
/* Ceci a ete introduit le 20051125212447 ('v $xcc/cpp$Z .xccp.PASSE_4.NomF')... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M I S E A J O U R D U C A D R E : */
/* */
/*************************************************************************************************************************************/
#define mise_a_jour_du_cadre(x,y) \
Bblock \
EGAL(Ipoint_segment_____cadre_Xgauche,MIN2(Ipoint_segment_____cadre_Xgauche,x)); \
EGAL(Ipoint_segment_____cadre_Xdroite,MAX2(Ipoint_segment_____cadre_Xdroite,x)); \
EGAL(Ipoint_segment_____cadre_Yinferieur,MIN2(Ipoint_segment_____cadre_Yinferieur,y)); \
EGAL(Ipoint_segment_____cadre_Ysuperieur,MAX2(Ipoint_segment_____cadre_Ysuperieur,y)); \
Eblock \
/* Mise a jour du cadre courant pour le point {x,y}. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T R A C E D ' U N P O I N T A N T I _ A L I A S E D ' U N V E C T E U R 2 D Q U E L C O N Q U E : */
/* */
/*************************************************************************************************************************************/
BFonctionI
DEFV(Common,DEFV(Logical,SINT(Ipoint_anti_aliase_segment_____compatibilite_20110420,FAUX)));
/* Permet de generer des images suivant la methode anterieure au 20110420120752 en */
/* ce qui concerne l'anti-aliasing... */
DEFV(Local,DEFV(FonctionI,Ipoint_anti_aliase_segment(intensite_minimale,intensite_maximale
,amplitude_intensite
,imageAR
,Xf,Yf
,X,Y
,coefficient_de_pente
)
)
)
DEFV(Argument,DEFV(genere_p,intensite_minimale));
/* Intensite lumineuse minimale du point lors d'un trace anti-aliasing, */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
/* Intensite lumineuse du point s'il n'y a pas d'anti-aliasing de demande, */
/* et sinon, intensite lumineuse maximale. */
DEFV(Argument,DEFV(Int,amplitude_intensite));
/* Donne la difference intensite_maximale - intensite_minimale pour les */
/* traces anti-aliasing. */
DEFV(Argument,DEFV(image,imageAR));
/* Image a la fois Argument et Resultat... */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
/* Coordonnees flottantes 'Xf' et 'Yf' (introduites le 20230520102205). */
DEFV(Argument,DEFV(Int,X));
DEFV(Argument,DEFV(Int,Y));
/* Coordonnees entieres 'X' et 'Y'. */
DEFV(Argument,DEFV(Float,coefficient_de_pente));
/* Coefficient de ponderation des niveaux compris dans [0,1] permettant de */
/* mettre en place des niveaux d'anti-aliasing. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
DEFV(Float,INIT(niveau_du_point,ADD2(intensite_minimale,MUL2(coefficient_de_pente,amplitude_intensite))));
/* niveau provisoire a attribuer au point courant. */
DEFV(Float,INIT(niveau_anterieur,FLOT(loadS_point_valide(imageAR,X,Y))));
/* Niveau present anterieurement au marquage demande. */
DEFV(Float,INIT(niveau_interpole,FLOT__NIVEAU_UNDEF));
DEFV(genere_p,INIT(niveau_effectif,NIVEAU_UNDEF));
/*..............................................................................................................................*/
EGAL(niveau_interpole
,MUL2(COND(IFOU(IFET(IL_FAUT(Ipoint_anti_aliase_segment_____compatibilite_20110420)
,IFEQ(niveau_anterieur,niveau_du_point)
)
,IFET(IL_NE_FAUT_PAS(Ipoint_anti_aliase_segment_____compatibilite_20110420)
,IFEQ_a_peu_pres_absolu(niveau_anterieur,niveau_du_point,UN_MOINS_EPSILON)
)
)
,NOIR
,niveau_anterieur
)
,COMP(coefficient_de_pente)
)
);
/* Le 20110420120752 fut introduit le 'IFEQ_a_peu_pres_absolu(...)' car, en effet, le */
/* niveau 'niveau_du_point' est un nombre flottant qui peut avoir une partie decimale a */
/* cause du 'MUL2(...)', alors que 'niveau_anterieur' est un nombre flottant qui egal a */
/* un nombre entier puisqu'il vient de 'imageAR' qui est de type 'image'... */
EGAL(niveau_effectif
,GENP(ARRO(COND(IFEQ(intensite_minimale,NOIR)
,ADD2(niveau_interpole,niveau_du_point)
,niveau_du_point
)
)
)
);
EDITION_DES_VECTEURS_BIDIMENSIONNELS(NEUTL(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_points_hors_image)
,Xf,Yf
,X,Y
,niveau_effectif
);
/* L'introduction le 20230517092722 de la possibilite d'editer meme les points hors-image */
/* a contraint de sortir de 'TEST_Z_Buffer_(...)' la definition de 'niveau_interpole' et */
/* de 'niveau_effectif' ; ils sont donc calcules meme s'ils sony finalement inutiles... */
TEST_Z_Buffer_(X,Y,coordonnee_Z
,BLOC(
mise_a_jour_du_cadre(X,Y);
store_point_vector(niveau_effectif
,imageAR
,Xf,Yf
,X,Y
,FVARIABLE
);
/* On notera que le niveau final du point {X,Y} est aux "COND(...)'s pres de la forme : */
/* */
/* BARY(niveau_anterieur,intensite_maximale,coefficient_de_pente) */
/* */
)
);
RETU_ERROR;
Eblock
EFonctionI
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T R A C E D ' U N P O I N T D ' U N V E C T E U R 2 D Q U E L C O N Q U E : */
/* */
/*************************************************************************************************************************************/
BFonctionI
DEFV(Common,DEFV(Logical,SINT(Ipoint_segment_____si__anti_aliasing__entourer_meme_les_points_non_isoles,FAUX)));
/* Ceci fut introduit le 20110501171130 pour 'v $xiia/ESCA.E1' afin de faire des points */
/* NOIRs en petit nombre qui apparaissaient... */
#define marque_point_anti_aliase(xf,yf,x,y,coefficient_de_pente) \
Bblock \
CALS(Ipoint_anti_aliase_segment(intensite_minimale,intensite_maximale \
,amplitude_intensite \
,imageAR \
,xf,yf \
,x,y \
,coefficient_de_pente \
) \
); \
Eblock
#define pente_faible \
IZEQ(indicateur_de_pente)
#define pente_forte \
IZGT(indicateur_de_pente)
DEFV(Local,DEFV(FonctionI,Ipoint_segment(intensite_minimale,intensite_maximale
,amplitude_intensite
,imageAR
,Xf,Yf
,point_isole
,pente,ordonnee_a_l_origine
,anti_aliasing
,ARGUMENT_POINTEUR(liste_des_vecteurs_____pointilles)
)
)
)
DEFV(Argument,DEFV(genere_p,intensite_minimale));
/* Intensite lumineuse minimale du point lors d'un trace anti-aliasing, */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
/* Intensite lumineuse du point s'il n'y a pas d'anti-aliasing de demande, */
/* et sinon, intensite lumineuse maximale. */
DEFV(Argument,DEFV(Int,amplitude_intensite));
/* Donne la difference intensite_maximale - intensite_minimale pour les */
/* traces anti-aliasing. */
DEFV(Argument,DEFV(image,imageAR));
/* Image a la fois Argument et Resultat... */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
/* Coordonnees flottantes du point a marquer. */
DEFV(Argument,DEFV(Logical,point_isole));
/* Indique si le trace se reduit a un point isole ('VRAI') ou pas ('FAUX'). */
DEFV(Argument,DEFV(Float,pente));
/* Pente 'A' de la droite Y=A.X+B support du point a tracer, */
DEFV(Argument,DEFV(Float,ordonnee_a_l_origine));
/* Et son ordonnee a l'origine 'B'. */
DEFV(Argument,DEFV(Logical,anti_aliasing));
/* Indicateur demandant un trace anti-aliase ('VRAI') ou normal ('FAUX'). */
DEFV(Argument,DEFV(binaire,POINTEUR(liste_des_vecteurs_____pointilles)));
/* Cette liste subit a chaque sortie de cette fonction un decalage circulaire */
/* apres le trace de chaque nouveau point ; le bit de signe correspond a chaque */
/* instant au point courant {X,Y} : lorsqu'il est a 1, le point est marque, */
/* s'il est a 0, il est ignore. Ainsi, on peut faire des vecteurs_____pointilles de forme */
/* quelconque et de periode 'NBITMO'. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
DEFV(Int,INIT(X,UNDEF));
DEFV(Int,INIT(Y,UNDEF));
/* Coordonnees entieres 'X' et 'Y'. */
DEFV(Int,INIT(indicateur_de_pente,UNDEF));
/* Cet indicateur indique, lorsqu'un trace anti-aliase est demande, */
/* si la pente de la droite support du point est faible (=0), forte (>0) */
/* ou enfin si elle est verticale (<0). */
DEFV(Float,INIT(coefficient_de_pente,FLOT__UNDEF));
/* Coefficient compris dans [0,1] permettant de ponderer les niveaux voisins. */
/*..............................................................................................................................*/
Test(PRESENT(TBIT(INDIRECT(liste_des_vecteurs_____pointilles),BIT0)))
Bblock
Test(EST_VRAI(point_isole))
Bblock
EGAL(X,INTE(Xf));
EGAL(Y,INTE(Yf));
EGAL(indicateur_de_pente,UNDEF);
EGAL(coefficient_de_pente,MOIT(FU));
/* Cas des points isoles. */
Eblock
ATes
Bblock
Test(IZEQ(pente))
Bblock
EGAL(X,INTE(Xf));
EGAL(Y,INTE(Yf));
EGAL(indicateur_de_pente,ZERO);
EGAL(coefficient_de_pente,MOIT(FU));
/* Cas des droites horizontales. */
Eblock
ATes
Bblock
Eblock
ETes
Test(IFEQ(pente,MOINS_L_INFINI))
Bblock
EGAL(X,INTE(Xf));
EGAL(Y,INTE(Yf));
EGAL(indicateur_de_pente,MOINS_L_INFINI);
EGAL(coefficient_de_pente,MOIT(FU));
/* Cas des droites verticales. */
Eblock
ATes
Bblock
Eblock
ETes
Test(IFET(IZNE(pente),IFNE(pente,MOINS_L_INFINI)))
Bblock
/* Cas des droites ni horizontales, ni verticales. */
EGAL(indicateur_de_pente,INTE(ABSO(pente)));
Test(IFEQ(ABSO(pente),DIVI(FLOT(UNITE),FLOT(UNITE))))
Bblock
/* Cas des droites dont la pente est a 45 degres ; par la suite, elles seront considerees, */
/* dans le cas de l'anti-aliasing, comme des droites a forte pente... */
EGAL(X,ARRO(Xf));
EGAL(Y,ARRO(Yf));
EGAL(coefficient_de_pente,MOIT(FU));
Eblock
ATes
Bblock
/* Cas des droites qui ne sont pas a 45 degres... */
Test(pente_faible)
Bblock
EGAL(X,ARRO(Xf));
EGAL(Y,INTE(Yf));
EGAL(coefficient_de_pente,SOUA(FLOT(Y),Yf));
/* Lorsque la pente est faible et non nulle, la ponderation est fonction */
/* de l'ordonnee. */
Eblock
ATes
Bblock
Eblock
ETes
Test(pente_forte)
Bblock
EGAL(X,INTE(Xf));
EGAL(Y,ARRO(Yf));
EGAL(coefficient_de_pente,SOUA(FLOT(X),Xf));
/* Lorsque la pente est forte et non infinie, la ponderation est fonction */
/* de l'abscisse. */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETes
EDITION_DES_VECTEURS_BIDIMENSIONNELS(NEUTL(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_points_hors_image)
,Xf,Yf
,X,Y
,GENP(intensite_maximale)
);
TEST_Z_Buffer_(X,Y,coordonnee_Z
,BLOC(mise_a_jour_du_cadre(X,Y);
store_point_vector(GENP(intensite_maximale)
,imageAR
,Xf,Yf
,X,Y
,FVARIABLE
);
)
);
/* Trace du point demande, ou du point central dans le cas d'un trace */
/* en mode anti-aliasing ; a noter, que ce trace se fait avec gestion */
/* du 'Z-Buffer'. */
Test(IL_FAUT(anti_aliasing))
Bblock
gPUSH_ECHANTILLONNAGE;
gSET_ECHANTILLONNAGE(PasX,PasY);
/* A cause des fonctions du type 'SUCY(...)' qui suivent. Ceci a ete introduit le */
/* 19970912103254 suite a des modifications de 'v $xci/etoile.01$K' */
Test(IFOU(IL_FAUT(Ipoint_segment_____si__anti_aliasing__entourer_meme_les_points_non_isoles)
,EST_VRAI(point_isole)
)
)
Bblock
/* Cas des points isoles : on les entoure completement, en notant que cette possibilite */
/* fut offerte en option aux autres points le 20110501171130... */
marque_point_anti_aliase(NEUT(Xf),SUCY(Yf),NEUT(X),SUCY(Y),coefficient_de_pente);
marque_point_anti_aliase(PREX(Xf),SUCY(Yf),PREX(X),SUCY(Y),coefficient_de_pente);
marque_point_anti_aliase(PREX(Xf),NEUT(Yf),PREX(X),NEUT(Y),coefficient_de_pente);
marque_point_anti_aliase(PREX(Xf),PREY(Yf),PREX(X),PREY(Y),coefficient_de_pente);
marque_point_anti_aliase(NEUT(Xf),PREY(Yf),NEUT(X),PREY(Y),coefficient_de_pente);
marque_point_anti_aliase(SUCX(Xf),PREY(Yf),SUCX(X),PREY(Y),coefficient_de_pente);
marque_point_anti_aliase(SUCX(Xf),NEUT(Yf),SUCX(X),NEUT(Y),coefficient_de_pente);
marque_point_anti_aliase(SUCX(Xf),SUCY(Yf),SUCX(X),SUCY(Y),coefficient_de_pente);
Eblock
ATes
Bblock
Test(pente_faible)
Bblock
/* Cas des droites de faible pente. */
marque_point_anti_aliase(NEUT(Xf),SUCY(Yf),NEUT(X),SUCY(Y),NEUT(coefficient_de_pente));
marque_point_anti_aliase(NEUT(Xf),PREY(Yf),NEUT(X),PREY(Y),COMP(coefficient_de_pente));
Eblock
ATes
Bblock
/* Cas des droites de forte pente. */
marque_point_anti_aliase(SUCX(Xf),NEUT(Yf),SUCX(X),NEUT(Y),NEUT(coefficient_de_pente));
marque_point_anti_aliase(PREX(Xf),NEUT(Yf),PREX(X),NEUT(Y),COMP(coefficient_de_pente));
Eblock
ETes
Eblock
ETes
gPULL_ECHANTILLONNAGE;
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
EGAL(INDIRECT(liste_des_vecteurs_____pointilles),SCLS(INDIRECT(liste_des_vecteurs_____pointilles),I));
RETU_ERROR;
Eblock
#undef pente_forte
#undef pente_faible
#undef marque_point_anti_aliase
EFonctionI
#undef store_point_vector
#undef EDITION_DES_VECTEURS_BIDIMENSIONNELS
#undef mise_a_jour_du_cadre
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T R A C E D ' U N V E C T E U R 2 D E N T I E R Q U E L C O N Q U E : */
/* */
/*************************************************************************************************************************************/
BFonctionI
#define marque_point(numero_du_point,nombre_de_points) \
Bblock \
EGAL(IIsegment_____attribut_intermediaire \
,DIVZ(FLOT(ABSO(numero_du_point)) \
,FLOT(ABSO(nombre_de_points)) \
) \
); \
/* Calcul du coefficient barycentrique sur le vecteur. */ \
EGAL(depth_maximale,DEPTH_CUEING(intensite_maximale,coordonnee_Z)); \
/* Application du "depth-cueing". */ \
Test(IL_FAUT(anti_aliasing)) \
Bblock \
EGAL(depth_minimale,DEPTH_CUEING(intensite_minimale,coordonnee_Z)); \
/* Application du "depth-cueing". */ \
EGAL(amplitude_intensite,INTE(SOUS(depth_maximale,depth_minimale))); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
CALS(Ipoint_segment(depth_minimale,depth_maximale \
,amplitude_intensite \
,imageAR \
,Xf,Yf \
,point_isole \
,pente,ordonnee_a_l_origine \
,anti_aliasing \
,ADRESSE(liste_des_vecteurs_____pointilles) \
) \
); \
Eblock
DEFV(Local,DEFV(FonctionI,IIsegment(imageAR
,ARGUMENT_POINTERs(Ivecteur)
,vecteurs_____pointilles
,intensite_minimale,intensite_maximale
,anti_aliasing
,attrib_origine,attrib_extremite
)
)
)
DEFV(Argument,DEFV(image,imageAR));
/* Image a la fois Argument et Resultat... */
DEFV(Argument,DEFV(vectorI_2D,POINTERs(Ivecteur)));
/* Vecteur entier argument dont les coordonnees ne sont pas normalisees... */
DEFV(Argument,DEFV(binaire,vecteurs_____pointilles));
/* Definit la forme (ou "pattern") de trace des vecteurs en vecteurs_____pointilles ; */
/* par exemple 'MMOT' permet le trace en traits pleins. */
DEFV(Argument,DEFV(genere_p,intensite_minimale));
/* Intensite minimale lumineuse du vecteur lorsque l'anti-aliasing */
/* est demande pour ce vecteur. */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
/* Intensite lumineuse du vecteur lorsque l'anti-aliasing n'est pas */
/* demande, et dans le cas contraire, intensite maximale. */
DEFV(Argument,DEFV(Logical,anti_aliasing));
/* Indicateur demandant un trace anti-aliase ('VRAI') ou normal ('FAUX'). */
DEFV(Argument,DEFV(Float,attrib_origine));
/* Valeur de l'attribut a l'origine d'un vecteur 2D, */
DEFV(Argument,DEFV(Float,attrib_extremite));
/* Valeur de l'attribut a l'extremite d'un vecteur 2D. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
DEFV(Float,INIT(Xf,FLOT__UNDEF));
DEFV(Float,INIT(Yf,FLOT__UNDEF));
/* Coordonnees du point courant a marquer. */
DEFV(Int,INIT(index,UNDEF));
/* Index du point courant a marquer. */
DEFV(deltaF_2D,accroissement);
/* Donne les accroissements horizontaux et verticaux du vecteur courant. */
DEFV(Float,INIT(nombre_de_pas,FLOT__UNDEF));
/* Donne MAX2(ABSO(ASD1(accroissement,dx)),ABSO(ASD1(accroissement,dy))). */
DEFV(Logical,INIT(point_isole,FAUX));
/* Indique si le trace se reduit a un point isole ('VRAI') ou pas ('FAUX') ; */
/* on suppose a priori qu'il ne s'agit pas d'un point isole... */
DEFV(Float,INIT(pente,FLOT__UNDEF));
/* Pente 'A' de la droite Y=A.X+B support du point a tracer, */
DEFV(Float,INIT(ordonnee_a_l_origine,FLOT__UNDEF));
/* Et son ordonnee a l'origine 'B'. */
DEFV(genere_p,INIT(depth_minimale,NIVEAU_UNDEF));
/* Intensite minimale lumineuse du vecteur lorsque l'anti-aliasing */
/* est demande pour ce vecteur, apres application du "depth-cueing". */
DEFV(genere_p,INIT(depth_maximale,NIVEAU_UNDEF));
/* Intensite lumineuse du vecteur lorsque l'anti-aliasing n'est pas */
/* demande, et dans le cas contraire, intensite maximale, apres application */
/* du "depth-cueing". */
DEFV(Int,INIT(amplitude_intensite,UNDEF));
/* Donne la difference (depth_maximale-depth_minimale) pour les */
/* traces anti-aliasing. */
DEFV(binaire,INIT(liste_des_vecteurs_____pointilles,UNDEF));
/* Afin de permettre l'integrite de la liste des pointilles "vecteurs_____pointilles" */
/* argument. */
/*..............................................................................................................................*/
EGAL(liste_des_vecteurs_____pointilles,vecteurs_____pointilles);
/* Recuperation de la "pattern" des vecteurs_____pointilles, puisqu'en effet la fonction */
/* ici presente la modifie... */
EGAL(IIsegment_____attribut_origine,attrib_origine);
EGAL(IIsegment_____attribut_extremite,attrib_extremite);
/* Recuperation de l'attribut du vecteur sous la forme [origine,extremite]. */
INITIALISATION_ACCROISSEMENT_2D(accroissement
,FLOT(SOUS(ASI2(Ivecteur,extremite,x),ASI2(Ivecteur,origine,x)))
,FLOT(SOUS(ASI2(Ivecteur,extremite,y),ASI2(Ivecteur,origine,y)))
);
Test(IFET(IZEQ(ASD1(accroissement,dx)),IZNE(ASD1(accroissement,dy))))
Bblock
EGAL(Xf,FLOT(ASI2(Ivecteur,origine,x)));
/* L'abscisse est constante... */
EGAL(pente,MOINS_L_INFINI);
/* Cas des droites verticales ; la pente est initialisee avec cette */
/* valeur afin de pouvoir retrouver lors du marquage des points */
/* les droites verticales. */
EGAL(ordonnee_a_l_origine,MOINS_L_INFINI);
Test(IZGE(ASD1(accroissement,dy)))
Bblock
DoIn(Yf,FLOT(ASI2(Ivecteur,origine,y)),FLOT(ASI2(Ivecteur,extremite,y)),FLOT(pasY))
Bblock
marque_point(SOUS(Yf,FLOT(ASI2(Ivecteur,origine,y)))
,FLOT(SOUS(ASI2(Ivecteur,extremite,y),ASI2(Ivecteur,origine,y)))
);
Eblock
EDoI
Eblock
ATes
Bblock
DoDe(Yf,FLOT(ASI2(Ivecteur,extremite,y)),FLOT(ASI2(Ivecteur,origine,y)),FLOT(pasY))
Bblock
marque_point(SOUS(Yf,FLOT(ASI2(Ivecteur,origine,y)))
,FLOT(SOUS(ASI2(Ivecteur,extremite,y),ASI2(Ivecteur,origine,y)))
);
Eblock
EDoD
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Test(IZEQ(ASD1(accroissement,dy)))
Bblock
EGAL(Yf,FLOT(ASI2(Ivecteur,origine,y)));
/* L'ordonnee est constante... */
EGAL(pente,FZERO);
/* Cas des droites horizontales ou des points isoles. */
EGAL(ordonnee_a_l_origine,FLOT(ASI2(Ivecteur,origine,y)));
Test(IZEQ(ASD1(accroissement,dx)))
Bblock
EGAL(point_isole,VRAI);
/* En fait, la droite horizontale se reduit a un point isole. */
Eblock
ATes
Bblock
Eblock
ETes
Test(IZGE(ASD1(accroissement,dx)))
Bblock
DoIn(Xf,FLOT(ASI2(Ivecteur,origine,x)),FLOT(ASI2(Ivecteur,extremite,x)),FLOT(pasX))
Bblock
marque_point(SOUS(Xf,FLOT(ASI2(Ivecteur,origine,x)))
,FLOT(SOUS(ASI2(Ivecteur,extremite,x),ASI2(Ivecteur,origine,x)))
);
Eblock
EDoI
Eblock
ATes
Bblock
DoDe(Xf,FLOT(ASI2(Ivecteur,extremite,x)),FLOT(ASI2(Ivecteur,origine,x)),FLOT(pasX))
Bblock
marque_point(SOUS(Xf,FLOT(ASI2(Ivecteur,origine,x)))
,FLOT(SOUS(ASI2(Ivecteur,extremite,x),ASI2(Ivecteur,origine,x)))
);
Eblock
EDoD
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Test(IFET(IZNE(ASD1(accroissement,dx)),IZNE(ASD1(accroissement,dy))))
Bblock
EGAL(pente,DIVI(ASD1(accroissement,dy),ASD1(accroissement,dx)));
EGAL(ordonnee_a_l_origine
,SOUS(FLOT(ASI2(Ivecteur,origine,y))
,MUL2(pente,FLOT(ASI2(Ivecteur,origine,x)))
)
);
/* Calcul des caracteristiques de la droite support du segment. */
EGAL(nombre_de_pas
,ARRO(MAX2(ABSO(ASD1(accroissement,dx))
,ABSO(ASD1(accroissement,dy))
)
)
);
DoIn(index,ZERO,INTE(nombre_de_pas),I)
Bblock
EGAL(Xf
,ADD2(FLOT(ASI2(Ivecteur,origine,x))
,SCAL(ASD1(accroissement,dx)
,nombre_de_pas
,index
)
)
);
EGAL(Yf
,ADD2(MUL2(pente,Xf)
,ordonnee_a_l_origine
)
);
marque_point(index,nombre_de_pas);
Eblock
EDoI
Eblock
ATes
Bblock
Eblock
ETes
RETU_ERROR;
Eblock
#undef marque_point
#undef coordonnee_Z
EFonctionI
#undef DEPTH_CUEING
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T R A C E D ' U N V E C T E U R 2 D F L O T T A N T Q U E L C O N Q U E : */
/* */
/*************************************************************************************************************************************/
BFonctionI
/* Avant le 20001222141952, les parametres 'super_echelle_OX' et 'super_echelle_OY' */
/* figuraient ici. Ils ont du etre deplace dans '$xiii/Images$STR' pour des raisons de */
/* simplicite et de generalite. Ceci est du a l'utilisation des super-echelles */
/* dans 'v $xiii/di_image$FON SUPER_ECHELLE' pour la fonction 'IFdensite(...)'. */
DEFV(Common,DEFV(Logical,SINT(IFsegment_____editer_le_vecteur_bidimensionnel,FAUX)));
/* Indicateur permettant d'editer en option les coordonnees et les niveaux d'un vecteur */
/* bidimensionnel. Ceci fut introduit le 20080908174725. */
DEFV(Common,DEFV(Logical,SINT(IFsegment_____trier_puis_editer_le_vecteur_bidimensionnel,FAUX)));
/* Indicateur permettant d'editer en option les coordonnees et les niveaux d'un vecteur */
/* apres avoir trie les coordonnees. Ceci fut introduit le 20231012141022. L'interet de */
/* ceci est de pouvoir eliminer des segments qui apparaitraient plusieurs fois, parcourus */
/* dans deux sens differents (AB et BA), cette elimination se faisant a l'aide d'un tri */
/* via '$SOR -u' ('v $xiirv/.SMIT.81.1.$U SOR.' par exemple). On aura alors interet a */
/* reduire le nombre de decimales des coordonnees via : */
/* */
/* ChiffresFlot=... */
/* */
/* afin d'eviter les problemes d'arrondis... */
/* */
/* On notera que la valeur par defaut garantit la compatibilite anterieure... */
DEFV(Common,DEFV(Float,SINT(IFsegment_____X_centre_des_symetries_par_rapport_aux_axes_X_et_Y,FZERO)));
DEFV(Common,DEFV(Float,SINT(IFsegment_____Y_centre_des_symetries_par_rapport_aux_axes_X_et_Y,FZERO)));
DEFV(Common,DEFV(Logical,SINT(IFsegment_____symetrie_par_rapport_a_l_axe_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(IFsegment_____symetrie_par_rapport_a_l_axe_Y,FAUX)));
/* Introduit le 20231001100806 pour 'v $xrd/spectre.14$K IFsegment_____symetrie_.'... */
DEFV(Local,DEFV(FonctionI,IFsegment(imageAR
,ARGUMENT_POINTERs(Fvecteur)
,vecteurs_____pointilles
,intensite_minimale,intensite_maximale
,anti_aliasing
,attrib_origine,attrib_extremite
)
)
)
DEFV(Argument,DEFV(image,imageAR));
/* Image a la fois Argument et Resultat... */
DEFV(Argument,DEFV(vectorF_2D,POINTERs(Fvecteur)));
/* Vecteur flottant argument dont les coordonnees sont normalisees dans [0,1[. */
DEFV(Argument,DEFV(binaire,vecteurs_____pointilles));
/* Definit la forme (ou "pattern") de trace des vecteurs en pointilles ; */
/* par exemple 'MMOT' permet le trace en traits pleins. */
DEFV(Argument,DEFV(genere_p,intensite_minimale));
/* Intensite minimale lumineuse du vecteur lorsque l'anti-aliasing */
/* est demande pour ce vecteur. */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
/* Intensite lumineuse du vecteur lorsque l'anti-aliasing n'est pas */
/* demande, et dans le cas contraire, intensite maximale. */
DEFV(Argument,DEFV(Logical,anti_aliasing));
/* Indicateur demandant un trace anti-aliase ('VRAI') ou normal ('FAUX'). */
DEFV(Argument,DEFV(Float,attrib_origine));
/* Valeur de l'attribut a l'origine d'un vecteur 2D, */
DEFV(Argument,DEFV(Float,attrib_extremite));
/* Valeur de l'attribut a l'extremite d'un vecteur 2D. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
DEFV(vectorF_2D,Fvecteur_transforme);
/* Vecteur flottant argument transforme eventuellement (introduit le 20231001100806)... */
DEFV(vectorI_2D,Ivecteur);
/* Vecteur flottant argument converti en entier. */
/*..............................................................................................................................*/
gTRANSFERT_VECTEUR_2D(Fvecteur_transforme,Fvecteur,ASD2,ASI2);
Test(IL_FAUT(IFsegment_____symetrie_par_rapport_a_l_axe_X))
Bblock
INITIALISATION_VECTEUR_2D(Fvecteur_transforme
,NEUT(ASD2(Fvecteur_transforme,origine,x))
,SOUS(IFsegment_____Y_centre_des_symetries_par_rapport_aux_axes_X_et_Y
,SOUS(ASD2(Fvecteur_transforme,origine,y)
,IFsegment_____Y_centre_des_symetries_par_rapport_aux_axes_X_et_Y
)
)
,NEUT(ASD2(Fvecteur_transforme,extremite,x))
,SOUS(IFsegment_____Y_centre_des_symetries_par_rapport_aux_axes_X_et_Y
,SOUS(ASD2(Fvecteur_transforme,extremite,y)
,IFsegment_____Y_centre_des_symetries_par_rapport_aux_axes_X_et_Y
)
)
);
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(IFsegment_____symetrie_par_rapport_a_l_axe_Y))
Bblock
INITIALISATION_VECTEUR_2D(Fvecteur_transforme
,SOUS(IFsegment_____X_centre_des_symetries_par_rapport_aux_axes_X_et_Y
,SOUS(ASD2(Fvecteur_transforme,origine,x)
,IFsegment_____X_centre_des_symetries_par_rapport_aux_axes_X_et_Y
)
)
,NEUT(ASD2(Fvecteur_transforme,origine,y))
,SOUS(IFsegment_____X_centre_des_symetries_par_rapport_aux_axes_X_et_Y
,SOUS(ASD2(Fvecteur_transforme,extremite,x)
,IFsegment_____X_centre_des_symetries_par_rapport_aux_axes_X_et_Y
)
)
,NEUT(ASD2(Fvecteur_transforme,extremite,y))
);
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(IFsegment_____editer_le_vecteur_bidimensionnel))
Bblock
Test(IL_FAUT(IFsegment_____trier_puis_editer_le_vecteur_bidimensionnel))
/* Le 20231012141022 fut introduit la possibilite de trier les coordonnees... */
Bblock
Test(IFOU(IFGT(ASD2(Fvecteur_transforme,origine,x),ASD2(Fvecteur_transforme,extremite,x))
,IFET(IFEQ(ASD2(Fvecteur_transforme,origine,x),ASD2(Fvecteur_transforme,extremite,x))
,IFGT(ASD2(Fvecteur_transforme,origine,y),ASD2(Fvecteur_transforme,extremite,y))
)
)
)
Bblock
fSWAP(ASD2(Fvecteur_transforme,origine,x),ASD2(Fvecteur_transforme,extremite,x));
fSWAP(ASD2(Fvecteur_transforme,origine,y),ASD2(Fvecteur_transforme,extremite,y));
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
CALS(FPrme0("Vecteur={"));
CAL3(Prme2("Origine={X=%+.^^^,Y=%+.^^^}"
,ASD2(Fvecteur_transforme,origine,x)
,ASD2(Fvecteur_transforme,origine,y)
)
);
/* Le 20091123122744, le format "^^g" est passe a "^^^" pour plus de souplesse... */
CALS(FPrme0("},"));
CALS(FPrme0("{"));
CAL3(Prme2("Extremite={X=%+.^^^,Y=%+.^^^}"
,ASD2(Fvecteur_transforme,extremite,x)
,ASD2(Fvecteur_transforme,extremite,y)
)
);
/* Le 20091123122744, le format "^^g" est passe a "^^^" pour plus de souplesse... */
CALS(FPrme0("}"));
CAL3(Prme1(",Niveau=%d",intensite_maximale));
CALS(Fsauts_de_lignes(UN));
/* Edition du vecteur bidimensionnel argument dont les coordonnees sont normalisees */
/* dans [0,1[ (ceci fut introduit le 20080908174725...). */
Eblock
ATes
Bblock
Eblock
ETes
INITIALISATION_VECTEUR_2D(Ivecteur
,SUPER_cDENORMALISE_OX(ASD2(Fvecteur_transforme,origine,x))
,SUPER_cDENORMALISE_OY(ASD2(Fvecteur_transforme,origine,y))
,SUPER_cDENORMALISE_OX(ASD2(Fvecteur_transforme,extremite,x))
,SUPER_cDENORMALISE_OY(ASD2(Fvecteur_transforme,extremite,y))
);
/* ATTENTION, dans le format 'Pal', on notera que l'on peut avoir : */
/* */
/* F__cDENORMALISE_OY(ASI2(Fvecteur,origine,y)) */
/* */
/* different d'une unite de : */
/* */
/* INTE(F__cDENORMALISE_OY(ASI2(Fvecteur,origine,y)) */
/* */
/* Ceci s'est vu avec le programme 'v $xci/entrelace$K' generant de la stereoscopie. */
/* Le phenomene se manifestant, lorsque l'on part de 'Ymin' pour l'ordonnee 24 (flottante) */
/* qui donne alors la valeur 23 en entier (voir le programme 'v $xtc/Pal.11$c'). Ce probleme */
/* a ete resolu par l'introduction de 'gINTE(...)' dans '_?DENORMALISE_AXES(...)' */
/* (voir le fichier 'v $xiif/format$DEF'). Simultanement, j'ai introduit 'LONGUEUR(...)' */
/* dans 'F__?DENORMALISE_AXES(...)'. */
CALS(IIsegment(imageAR
,ADRESSE(Ivecteur)
,vecteurs_____pointilles
,intensite_minimale,intensite_maximale
,anti_aliasing
,attrib_origine,attrib_extremite
)
);
RETU_ERROR;
Eblock
EFonctionI
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T R A C E D ' U N V E C T E U R F L O T T A N T 2 D Q U E L C O N Q U E : */
/* */
/*************************************************************************************************************************************/
BFonctionI
DEFV(Common,DEFV(FonctionI,IFseg2D(imageAR
,ARGUMENT_POINTERs(vector_2D)
,vecteurs_____pointilles
,intensite_minimale,intensite_maximale
,anti_aliasing
,Zf
)
)
)
DEFV(Argument,DEFV(image,imageAR));
/* Image a la fois Argument et Resultat... */
DEFV(Argument,DEFV(vectorF_2D,POINTERs(vector_2D)));
/* Vecteur flottant argument dont les coordonnees sont normalisees dans [0,1[. */
DEFV(Argument,DEFV(binaire,vecteurs_____pointilles));
/* Definit la forme (ou "pattern") de trace des vecteurs en pointilles ; */
/* par exemple 'MMOT' permet le trace en traits pleins. */
DEFV(Argument,DEFV(genere_p,intensite_minimale));
/* Intensite minimale lumineuse du vecteur lorsque l'anti-aliasing */
/* est demande pour ce vecteur. */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
/* Intensite lumineuse du vecteur lorsque l'anti-aliasing n'est pas */
/* demande, et dans le cas contraire, intensite maximale. */
DEFV(Argument,DEFV(Logical,anti_aliasing));
/* Indicateur demandant un trace anti-aliase ('VRAI') ou normal ('FAUX'). */
DEFV(Argument,DEFV(Float,Zf));
/* Definit (eventuellement arbitraitrement) la composante 'Z' dans [0,1[ d'un */
/* plan vertical dans lequel inserer le vecteur 2D a tracer. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
/*..............................................................................................................................*/
CALS(IFsegment(imageAR
,vector_2D
,vecteurs_____pointilles
,intensite_minimale,intensite_maximale
,anti_aliasing
,Zf,Zf
)
);
/* Nota : 'vector_2D' est deja un pointeur, donc on n'utilise pas 'ADRESSE'. */
RETU_ERROR;
Eblock
EFonctionI
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E L A P R O J E C T I O N P L A N E G E N E R A L E : */
/* */
/*************************************************************************************************************************************/
#ifdef PROJECTION_3D_2D_VERSION_02
# define COEFFICIENT_A_DU_PLAN_DE_PROJECTION \
FZERO
# define COEFFICIENT_B_DU_PLAN_DE_PROJECTION \
FZERO
# define COEFFICIENT_C_DU_PLAN_DE_PROJECTION \
FU
# define COEFFICIENT_D_DU_PLAN_DE_PROJECTION \
FZERO
/* Definition du plan de projection : on utilise le plan (OX,OY), soit Z=0. */
# define COORDONNEE_X_DE_L_OBSERVATEUR \
COXA(ADD2(COXR(Xcentre) \
,MUL2(COZR(COORDONNEE_Z_DE_L_OBSERVATEUR) \
,TANG(Projection_OX_OY_____decalage_angulaire_de_l_observateur) \
) \
) \
)
# define COORDONNEE_Y_DE_L_OBSERVATEUR \
Ycentre
# define COORDONNEE_Z_DE_L_OBSERVATEUR \
COZA(GRO1(FRA1(INTE(MUL2(Projection_OX_OY_____facteur_d_eloignement_en_Z_de_l_observateur,FLOT(COZR(Zmax)))))))
/* Definition de la position de l'observateur : il est en (Xcentre,Ycentre,FRAi(Zmax)). */
/* ATTENTION : ces trois coordonnees seront DENORMALISEES par la suite... */
#Aifdef PROJECTION_3D_2D_VERSION_02
#Eifdef PROJECTION_3D_2D_VERSION_02
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O J E C T I O N S E L O N L E S A X E S ' O X ' E T ' O Y ' : */
/* */
/*************************************************************************************************************************************/
#ifdef PROJECTION_3D_2D_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */
DEFV(Common,DEFV(Logical,_____PROJECTION_3D_2D_VERSION_01));
#Aifdef PROJECTION_3D_2D_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */
#Eifdef PROJECTION_3D_2D_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */
#ifdef PROJECTION_3D_2D_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */
DEFV(Common,DEFV(Logical,_____PROJECTION_3D_2D_VERSION_02));
#Aifdef PROJECTION_3D_2D_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */
#Eifdef PROJECTION_3D_2D_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */
#ifdef PROJECTION_3D_2D_VERSION_01 /* Common,DEFV(Fonction,) : projection 2D --> 3D. */
BFonctionF
DEFV(Common,DEFV(FonctionF,Projection_OX(Xf,Yf,Zf)))
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
/* Coordonnees flottantes du point a projeter. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(PROJECTION_OX(Xf,Yf,Zf));
Eblock
EFonctionF
BFonctionF
DEFV(Common,DEFV(FonctionF,Projection_OY(Xf,Yf,Zf)))
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
/* Coordonnees flottantes du point a projeter. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(PROJECTION_OY(Xf,Yf,Zf));
Eblock
EFonctionF
#Aifdef PROJECTION_3D_2D_VERSION_01 /* Common,DEFV(Fonction,) : projection 2D --> 3D. */
#Eifdef PROJECTION_3D_2D_VERSION_01 /* Common,DEFV(Fonction,) : projection 2D --> 3D. */
#ifdef PROJECTION_3D_2D_VERSION_02 /* Common,DEFV(Fonction,) : projection 2D --> 3D. */
BFonctionF
/* ATTENTION : les donnees 'Projection_OX_OY_____position_de_l_observateur' et */
/* 'Projection_OX_OY_____plan_de_projection' sont rendues */
/* visibles a l'exterieur (le 1993041400), mais leur contenu n'a de sens qu'apres un appel */
/* a l'une des fonctions 'Projection_OX(...)' ou 'Projection_OY(...)'... */
DEFV(Common,DEFV(Logical,SINT(Projection_OX_OY_____etat_de_la_projection,INVALIDE)));
/* Tant qu'un premier appel aux fonctions 'Projection_OX(...)' ou 'Projection_OY(...)' n'a */
/* pas ete effectue, les valeurs 'Projection_OX_OY_____position_de_l_observateur' et */
/* 'Projection_OX_OY_____plan_de_projection' sont invalides... */
/* */
/* ATTENTION, de plus a chaque appel de 'SET_DECALAGE_ANGULAIRE_DE_L_OBSERVATEUR(...)', */
/* 'Projection_OX_OY_____etat_de_la_projection' est remis a l'etat 'INVALIDE' afin que */
/* la nouvelle position de l'observateur soit recalculee... */
DEFV(Common,DEFV(pointF_3D,Projection_OX_OY_____position_de_l_observateur));
/* Definition de la position de l'observateur. */
DEFV(Common,DEFV(plan_3D,Projection_OX_OY_____plan_de_projection));
/* Definition du plan de projection. */
# define donnees_de_Projection_OX_OY \
DEFV(pointF_3D,point_3D_a_projeter); \
/* Point flottant argument dont les coordonnees sont normalisees dans [0,1[, */ \
DEFV(pointF_3D,point_projete) \
/* Point projete qui est en fait a l'intersection du plan de projection et de la droite */ \
/* joignant l'observateur au point tri-dimensionnel a projeter. */ \
/* */ \
/* donnees necessaires a la projection 2D --> 3D, mais ATTENTION a l'absence de ";" a la */ \
/* fin de la derniere declaration due au mode d'appel. */
# define Projection_OX_OY \
Bblock \
INITIALISATION_POINT_3D(point_3D_a_projeter,Xf,Yf,Zf); \
/* Mise en place du point a projeter ; on notera malgre tout qu'il peut s'agir aussi, */ \
/* par exemple, des composantes d'un vecteur... */ \
TRANSFERT_POINT_3D(point_projete,point_3D_a_projeter); \
/* Le 19981102152819 ce transfert sans projection a ete rendu inconditionnel, alors que */ \
/* precedemment, il n'etait fait que dans le cas des points bidimensionnels... */ \
\
Test(IL_FAUT(Projection_OX_OY_____faire_de_la_vraie_projection_parallele)) \
Bblock \
/* Dans le cas de la projection parallele, il n'y a rien a faire : 'point_projete' est */ \
/* deja correct... */ \
Eblock \
ATes \
Bblock \
Test(IFEQ(ASD1(point_3D_a_projeter,z),COEFFICIENT_D_DU_PLAN_DE_PROJECTION)) \
Bblock \
/* Cas des points bidimensionnels, il n'est pas souhaitable de projeter. */ \
/* */ \
/* Ce test, a priori inutile, est mis ici malgre tout pour eviter d'eventuelles erreurs */ \
/* infinitesimales sur les coordonnees 'X' et 'Y' lorsque le point correspondant est dans */ \
/* le plan de projection. En effet, dans ce cas, 'X' et 'Y' doivent rester inchangees, ce */ \
/* qui, apparemment n'est pas le cas, et ce ne va pas sans poser quelques problemes lorsque */ \
/* l'on travaille en bidimensionnel et que l'on revient aux coordonnees d'ecran... */ \
/* */ \
/* ATTENTION, il y avait ici : */ \
/* */ \
/* TRANSFERT_POINT_3D(point_projete,point_3D_a_projeter); */ \
/* */ \
/* avant le 19981102152819. */ \
\
Test(IFNE(COEFFICIENT_D_DU_PLAN_DE_PROJECTION,FZorigine)) \
Bblock \
PRINT_ATTENTION("le plan de projection n'est pas le plan de 'Zmin'"); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
/* Cas des points tridimensionnels, il est obligatoire de projeter : */ \
Test(EST_INVALIDE(Projection_OX_OY_____etat_de_la_projection)) \
Bblock \
EGAL(ASD1(Projection_OX_OY_____plan_de_projection,pA),COEFFICIENT_A_DU_PLAN_DE_PROJECTION); \
EGAL(ASD1(Projection_OX_OY_____plan_de_projection,pB),COEFFICIENT_B_DU_PLAN_DE_PROJECTION); \
EGAL(ASD1(Projection_OX_OY_____plan_de_projection,pC),COEFFICIENT_C_DU_PLAN_DE_PROJECTION); \
EGAL(ASD1(Projection_OX_OY_____plan_de_projection,pD),COEFFICIENT_D_DU_PLAN_DE_PROJECTION); \
/* Mise en place du plan de projection ; il s'agit du plan (OX,OY). */ \
INITIALISATION_POINT_3D(Projection_OX_OY_____position_de_l_observateur \
,_____cNORMALISE_OX(COORDONNEE_X_DE_L_OBSERVATEUR) \
,_____cNORMALISE_OY(COORDONNEE_Y_DE_L_OBSERVATEUR) \
,_____cNORMALISE_OZ(COORDONNEE_Z_DE_L_OBSERVATEUR) \
); \
/* Mise en place de l'observateur... */ \
EGAL(Projection_OX_OY_____etat_de_la_projection,VALIDE); \
/* Apres un premier appel aux fonctions 'Projection_OX(...)' ou 'Projection_OY(...)', les */ \
/* valeurs 'Projection_OX_OY_____position_de_l_observateur' et */ \
/* 'Projection_OX_OY_____plan_de_projection' sont valides... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IFEQ(LIZ3(ASD1(Projection_OX_OY_____plan_de_projection,pA),ASD1(point_3D_a_projeter,x) \
,ASD1(Projection_OX_OY_____plan_de_projection,pB),ASD1(point_3D_a_projeter,y) \
,ASD1(Projection_OX_OY_____plan_de_projection,pC),ASD1(point_3D_a_projeter,z) \
) \
,LIZ3(ASD1(Projection_OX_OY_____plan_de_projection,pA) \
,ASD1(Projection_OX_OY_____position_de_l_observateur,x) \
,ASD1(Projection_OX_OY_____plan_de_projection,pB) \
,ASD1(Projection_OX_OY_____position_de_l_observateur,y) \
,ASD1(Projection_OX_OY_____plan_de_projection,pC) \
,ASD1(Projection_OX_OY_____position_de_l_observateur,z) \
) \
) \
) \
Bblock \
/* Le plan de projection a pour equation : */ \
/* */ \
/* A.X + B.Y + C.Z + D = 0 */ \
/* */ \
/* un plan parallele a celui-ci et passant par l'observateur (X0,Y0,Z0) a pour equation : */ \
/* , */ \
/* A.X + B.Y + C.Z + D = 0 */ \
/* */ \
/* avec : */ \
/* , */ \
/* A.X0 + B.Y0 + C.Z0 + D = 0 */ \
/* */ \
/* d'ou, si le point a projeter (Xp,Yp,Zp) = {Xf,Yf,Zf} est dans un plan parallele au */ \
/* plan de projection et passant par l'observateur (appele "plan d'observation" dans ce */ \
/* qui suit) : */ \
/* */ \
/* A.Xp + B.Yp + C.Zp = A.X0 + B.Y0 + C.Z0 */ \
/* */ \
/* d'ou le test ci-dessus... */ \
PRINT_ERREUR("le point a projeter est dans le plan d'observation"); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
PROJECTION_PLANE_QUELCONQUE(point_projete \
,point_3D_a_projeter \
,Projection_OX_OY_____plan_de_projection \
,Projection_OX_OY_____position_de_l_observateur \
); \
/* Projection de l'origine du vecteur tri-dimensionnel, */ \
Eblock \
ETes \
Eblock \
ETes \
Eblock \
/* Projection generale sur les axes 'OX' et 'OY'. */
DEFV(Common,DEFV(Logical,SINT(Projection_OX_OY_____faire_de_la_vraie_projection_parallele,FAUX)));
/* Afin de faire simplement de la projection parallele (introduit le 19981102152819). */
DEFV(Common,DEFV(Float,SINT(Projection_OX_OY_____facteur_d_eloignement_en_Z_de_l_observateur
,FACTEUR_D_ELOIGNEMENT_EN_Z_DE_L_OBSERVATEUR
)
)
);
/* Facteur destine a deplacer l'observateur le long de l'axe 'OZ', et ce afin de simuler */
/* la projection parallele, c'est-a-dire celle qui realise : {X,Y,Z} --> {X,Y}. */
DEFV(Common,DEFV(Float,SINT(Projection_OX_OY_____decalage_angulaire_de_l_observateur,DECALAGE_ANGULAIRE_POUR_UNE_VISION_CYCLOPIQUE)));
/* Facteur destine a simuler la vision stereoscopique, et initialiser sur une vision */
/* monoculaire (dite "cyclopique"...) ; ce facteur est un angle mesure dans le plan (OX,OZ). */
DEFV(Common,DEFV(FonctionF,Projection_OX(Xf,Yf,Zf)))
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
/* Coordonnees flottantes du point a projeter dans [0,1[. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
donnees_de_Projection_OX_OY;
/*..............................................................................................................................*/
Projection_OX_OY;
/* Projection sur les deux axes 'OX' et 'OY'. */
RETU(ASD1(point_projete,x));
Eblock
EFonctionF
BFonctionF
DEFV(Common,DEFV(FonctionF,Projection_OY(Xf,Yf,Zf)))
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
/* Coordonnees flottantes du point a projeter dans [0,1[. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
donnees_de_Projection_OX_OY;
/*..............................................................................................................................*/
Projection_OX_OY;
/* Projection sur les deux axes 'OX' et 'OY'. */
RETU(ASD1(point_projete,y));
Eblock
EFonctionF
# undef Projection_OX_OY
# undef donnees_de_Projection_OX_OY
#Aifdef PROJECTION_3D_2D_VERSION_02 /* Common,DEFV(Fonction,) : projection 2D --> 3D. */
#Eifdef PROJECTION_3D_2D_VERSION_02 /* Common,DEFV(Fonction,) : projection 2D --> 3D. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T R A C E D ' U N V E C T E U R F L O T T A N T 3 D Q U E L C O N Q U E : */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(DEBUT_CENTRAGE_____compatibilite_20080909,FAUX)));
/* Introduit le 20080909140617... */
DEFV(Common,DEFV(Logical,PINT(DRAW_____initialiser_les_extrema_de_X_Y_Z,VRAI)));
/* Afin de pouvoir forcer l'initialisation des extrema qui suivent... */
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_X,F_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_Y,F_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_Z,F_INFINI)));
/* Minima courant des coordonnees {X,Y,Z} (introduit le 20080909140617) et ce quel que soit */
/* 'vecteurs_____etat_trace'... */
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_X,F_MOINS_L_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_Y,F_MOINS_L_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_Z,F_MOINS_L_INFINI)));
/* Maxima courant des coordonnees {X,Y,Z} (introduit le 20080909140617) et ce quel que soit */
/* 'vecteurs_____etat_trace'... */
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_X__trace_AUTORISE,F_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_Y__trace_AUTORISE,F_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_Z__trace_AUTORISE,F_INFINI)));
/* Minima courant des coordonnees {X,Y,Z} (introduit le 20230809171130) qui ne conncernent */
/* que les cas 'EST_AUTORISE(vecteurs_____etat_trace)'... */
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_X__trace_AUTORISE,F_MOINS_L_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_Y__trace_AUTORISE,F_MOINS_L_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_Z__trace_AUTORISE,F_MOINS_L_INFINI)));
/* Maxima courant des coordonnees {X,Y,Z} (introduit le 20230809171130) qui ne conncernent */
/* que les cas 'EST_AUTORISE(vecteurs_____etat_trace)'... */
BFonctionI
DEFV(Common,DEFV(Logical,SINT(IFseg3D_____editer_le_vecteur_tridimensionnel,FAUX)));
/* Indicateur permettant d'editer en option les coordonnees et les niveaux d'un vecteur */
/* tridimensionnel. Ceci fut introduit le 20080908174725 afin de, par exemple, recuperer */
/* les formes paradoxales de 'v $xiii/alphabet.3$FON'... */
DEFV(Common,DEFV(FonctionI,IFseg3D(imageAR
,ARGUMENT_POINTERs(vecteurs_____vector_3D)
,vecteurs_____pointilles
,intensite_minimale,intensite_maximale
,anti_aliasing
)
)
)
DEFV(Argument,DEFV(image,imageAR));
/* Image a la fois Argument et Resultat... */
DEFV(Argument,DEFV(vectorF_3D,POINTERs(vecteurs_____vector_3D)));
/* Vecteur flottant argument dont les coordonnees sont normalisees dans [0,1[. */
DEFV(Argument,DEFV(binaire,vecteurs_____pointilles));
/* Definit la forme (ou "pattern") de trace des vecteurs en pointilles ; */
/* par exemple 'MMOT' permet le trace en traits pleins. */
DEFV(Argument,DEFV(genere_p,intensite_minimale));
/* Intensite minimale lumineuse du vecteur lorsque l'anti-aliasing */
/* est demande pour ce vecteur. */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
/* Intensite lumineuse du vecteur lorsque l'anti-aliasing n'est pas */
/* demande, et dans le cas contraire, intensite maximale. */
DEFV(Argument,DEFV(Logical,anti_aliasing));
/* Indicateur demandant un trace anti-aliase ('VRAI') ou normal ('FAUX'). */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
DEFV(vectorF_2D,vector_2D);
/* Vecteur flottant 2D (projection du vecteur 3D). */
/*..............................................................................................................................*/
Test(IL_FAUT(IFseg3D_____editer_le_vecteur_tridimensionnel))
Bblock
CALS(FPrme0("Vecteur={"));
CAL3(Prme3("Origine={X=%+.^^^,Y=%+.^^^,Z=%+.^^^}"
,ASI2(vecteurs_____vector_3D,origine,x)
,ASI2(vecteurs_____vector_3D,origine,y)
,ASI2(vecteurs_____vector_3D,origine,z)
)
);
/* Le 20091123122744, le format "^^g" est passe a "^^^" pour plus de souplesse... */
CALS(FPrme0("},"));
CALS(FPrme0("{"));
CAL3(Prme3("Extremite={X=%+.^^^,Y=%+.^^^,Z=%+.^^^}"
,ASI2(vecteurs_____vector_3D,extremite,x)
,ASI2(vecteurs_____vector_3D,extremite,y)
,ASI2(vecteurs_____vector_3D,extremite,z)
)
);
/* Le 20091123122744, le format "^^g" est passe a "^^^" pour plus de souplesse... */
CALS(FPrme0("}"));
CAL3(Prme1(",Niveau=%d",intensite_maximale));
CALS(Fsauts_de_lignes(UN));
/* Edition du vecteur tridimensionnel argument dont les coordonnees sont normalisees */
/* dans [0,1[ (ceci fut introduit le 20080908174725...). */
Eblock
ATes
Bblock
Eblock
ETes
INITIALISATION_VECTEUR_2D(vector_2D
,Projection_OX(ASI2(vecteurs_____vector_3D,origine,x)
,ASI2(vecteurs_____vector_3D,origine,y)
,ASI2(vecteurs_____vector_3D,origine,z)
)
,Projection_OY(ASI2(vecteurs_____vector_3D,origine,x)
,ASI2(vecteurs_____vector_3D,origine,y)
,ASI2(vecteurs_____vector_3D,origine,z)
)
,Projection_OX(ASI2(vecteurs_____vector_3D,extremite,x)
,ASI2(vecteurs_____vector_3D,extremite,y)
,ASI2(vecteurs_____vector_3D,extremite,z)
)
,Projection_OY(ASI2(vecteurs_____vector_3D,extremite,x)
,ASI2(vecteurs_____vector_3D,extremite,y)
,ASI2(vecteurs_____vector_3D,extremite,z)
)
);
CALS(IFsegment(imageAR
,ADRESSE(vector_2D)
,vecteurs_____pointilles
,intensite_minimale,intensite_maximale
,anti_aliasing
,ASI2(vecteurs_____vector_3D,origine,z),ASI2(vecteurs_____vector_3D,extremite,z)
)
);
/* Vers le trace du vecteur projete sur le plan de l'ecran. */
RETU_ERROR;
Eblock
EFonctionI
#ifdef PROJECTION_3D_2D_VERSION_02
# undef COORDONNEE_Z_DE_L_OBSERVATEUR
# undef COORDONNEE_Y_DE_L_OBSERVATEUR
# undef COORDONNEE_X_DE_L_OBSERVATEUR
# undef COEFFICIENT_D_DU_PLAN_DE_PROJECTION
# undef COEFFICIENT_C_DU_PLAN_DE_PROJECTION
# undef COEFFICIENT_B_DU_PLAN_DE_PROJECTION
# undef COEFFICIENT_A_DU_PLAN_DE_PROJECTION
#Aifdef PROJECTION_3D_2D_VERSION_02
#Eifdef PROJECTION_3D_2D_VERSION_02
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D O N N E E S G R A P H I Q U E S U T I L E S : */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(vecteurs_____cursor_3D__ramener_la_coordonnee_X_dans_l_image,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(vecteurs_____cursor_3D__ramener_la_coordonnee_Y_dans_l_image,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(vecteurs_____cursor_3D__ramener_la_coordonnee_Z_dans_l_image,FAUX)));
/* Introduits le 20180620134829 pour permettre a 'v $xci/grille.01$K 20180620140957' de */
/* generer des cadres inclus dans l'image ('v $xiio/RADRE$R16' par exemple...). */
#if (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) /* Common,DEFV(Fonction,) */
DEFV(Common,DEFV(vectorF_3D,ZINS(vecteurs_____vector_3D
,IstructH102(IstructL03(FXorigine
,FYorigine
,FZorigine
)
,IstructL03(FXorigine
,FYorigine
,FZorigine
)
)
)
)
);
/* Vecteur tri-dimensionnel courant exprime en flottant pour avoir un */
/* maximum de precision dans des unites telles que : */
/* [Xmin,Xmax]*[Ymin,Ymax]*[Zmin,Zmax] soit represente par [0,1[*[0,1[*[0,1[. */
/* ATTENTION : cette definition est mise sur plusieurs lignes afin principalement de */
/* faciliter le travail de '$xcg/gen.ext$Z'... */
DEFV(Common,DEFV(pointF_3D,ZINS(vecteurs_____cursor_3D
,IstructL03(FXorigine
,FYorigine
,FZorigine
)
)
)
);
/* Curseur virtuel courant exprime en flottant pour avoir un */
/* maximum de precision dans des unites telles que : */
/* [Xmin,Xmax]*[Ymin,Ymax]*[Zmin,Zmax] soit represente par [0,1[*[0,1[*[0,1[. */
/* ATTENTION : cette definition est mise sur plusieurs lignes afin principalement de */
/* faciliter le travail de '$xcg/gen.ext$Z'... */
DEFV(Common,DEFV(Logical,ZINT(vecteurs_____renormaliser_scale_globale,VRAI)));
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_globale,ECHELLES_INITIALES)));
/* Echelle globale. Le controle de la renormalisation de 'vecteurs_____scale_globale' a */
/* ete introduit le 20160527135040 ('v $xiii/vecteurs$DEF 20160527135104' afin de justifier */
/* cela...). */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OX,_____lNORMALISE_OX(ECHELLES_INITIALES))));
/* Echelle sur l'axe des 'X', */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OY,_____lNORMALISE_OY(ECHELLES_INITIALES))));
/* Echelle sur l'axe des 'Y', */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OZ,_____lNORMALISE_OZ(ECHELLES_INITIALES))));
/* Echelle sur l'axe des 'Z'. */
#Aif (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) /* Common,DEFV(Fonction,) */
#Eif (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) /* Common,DEFV(Fonction,) */
#if ((dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) || (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03))) /* Common,DEFV(Fonction,) */
/* Nota : malheureusement, dans 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02', on ne peut plus */
/* utiliser des expressions du type 'FXorigine', car malheureusement elles */
/* referencent des variables et non plus des expressions constantes, comme cela etait le */
/* cas dans 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01', d'ou les initialisations suivantes */
/* a l'aide de 'FZERO'... */
# define COORDONNEES_INITIALES_DENORMALISEES \
FZERO \
/* Valeurs initiales des composantes de 'vecteurs_____vector_3D' et */ \
/* 'vecteurs_____cursor_3D'... */
DEFV(Common,DEFV(vectorF_3D,ZINS(vecteurs_____vector_3D
,IstructH102(IstructL03(COORDONNEES_INITIALES_DENORMALISEES
,COORDONNEES_INITIALES_DENORMALISEES
,COORDONNEES_INITIALES_DENORMALISEES
)
,IstructL03(COORDONNEES_INITIALES_DENORMALISEES
,COORDONNEES_INITIALES_DENORMALISEES
,COORDONNEES_INITIALES_DENORMALISEES
)
)
)
)
);
/* Vecteur tri-dimensionnel courant exprime en flottant pour avoir un */
/* maximum de precision dans des unites telles que : */
/* [Xmin,Xmax]*[Ymin,Ymax]*[Zmin,Zmax] soit represente par [0,1[*[0,1[*[0,1[. */
/* ATTENTION : cette definition est mise sur plusieurs lignes afin principalement de */
/* faciliter le travail de '$xcg/gen.ext$Z'... */
DEFV(Common,DEFV(pointF_3D,ZINS(vecteurs_____cursor_3D
,IstructL03(COORDONNEES_INITIALES_DENORMALISEES
,COORDONNEES_INITIALES_DENORMALISEES
,COORDONNEES_INITIALES_DENORMALISEES
)
)
)
);
/* Curseur virtuel courant exprime en flottant pour avoir un */
/* maximum de precision dans des unites telles que : */
/* [Xmin,Xmax]*[Ymin,Ymax]*[Zmin,Zmax] soit represente par [0,1[*[0,1[*[0,1[. */
/* ATTENTION : cette definition est mise sur plusieurs lignes afin principalement de */
/* faciliter le travail de '$xcg/gen.ext$Z'... */
# undef COORDONNEES_INITIALES_DENORMALISEES
DEFV(Common,DEFV(Logical,ZINT(vecteurs_____renormaliser_scale_globale,VRAI)));
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_globale,INITIALISER_LES_ECHELLES)));
/* Echelle globale. Le controle de la renormalisation de 'vecteurs_____scale_globale' a */
/* ete introduit le 20160527135040 ('v $xiii/vecteurs$DEF 20160527135104' afin de justifier */
/* cela...). */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OX,INITIALISER_LES_ECHELLES)));
/* Echelle sur l'axe des 'X', */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OY,INITIALISER_LES_ECHELLES)));
/* Echelle sur l'axe des 'Y', */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OZ,INITIALISER_LES_ECHELLES)));
/* Echelle sur l'axe des 'Z'. */
#Aif ((dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) || (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03))) /* Common,DEFV(Fonction,) */
#Eif ((dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) || (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03))) /* Common,DEFV(Fonction,) */
DEFV(Common,DEFV(Logical,ZINT(vecteurs_____etat_trace,AUTORISE)));
/* Indicateur de l'etat du trace : il est autorise ('AUTORISE') ou inhibe */
/* ('INTERDIT'). */
DEFV(Common,DEFV(Logical,ZINT(vecteurs_____etat_anti_aliasing,FAUX)));
/* Indicateur de mode de trace avec ('VRAI') ou sans ('FAUX') anti-aliasing. */
DEFV(Common,DEFV(genere_p,ZINT(vecteurs_____niveau_minimal,NOIR)));
/* Niveau minimal lors d'un trace anti-aliasing. */
DEFV(Common,DEFV(genere_p,ZINT(vecteurs_____niveau_maximal,BLANC)));
/* Niveau de trace, ou niveau maximal lors d'un trace anti-aliasing. */
DEFV(Common,DEFV(binaire,ZINT(vecteurs_____pointilles,PAS_DE_POINTILLES)));
/* Definition de la pattern de trace des vecteurs ; 'MMOT' permet un trace continu. */
DEFV(Common,DEFV(Logical,ZINT(vecteurs_____SET_COULEURS,AUTORISE)));
/* A cause de 'v $xiii/alphabets$FON SET_COULEURS.niveau_fond,niveau_fond.', cet indicateur */
/* fut introduit le 20181023140445 afin de bloquer le fonctionnement de 'SET_COULEURS(...)' */
/* et donc ne pas modifier {vecteurs_____niveau_minimal,vecteurs_____niveau_maximal}... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* N O T I O N D E P I L E G R A P H I Q U E : */
/* */
/* */
/* Definition : */
/* */
/* La plupart des donnes graphiques */
/* peuvent etre sauvegardees dans une */
/* pile. */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(l_element,INIT(POINTERs(vecteurs_____pile_graphique),PILE_UNDEF)));
/* Definition de la pile de gestion des entites graphiques. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* N O T I O N D E T R A N S F O R M A T I O N G E O M E T R I Q U E : */
/* */
/* */
/* Definition : */
/* */
/* On va disposer a tout instant d'une */
/* matrice de transformation geometrique */
/* qui sera appliquee lors de l'operation */
/* MOVE(dX,dY,dZ) du curseur virtuel. */
/* */
/* */
/* ATTENTION : */
/* */
/* Il n'est pas possible de placer en */
/* tete les donnees suivantes relatives */
/* a la transformation geometrique en tete */
/* afin de pouvoir etre placee dans un bloc */
/* de type '$a' autonome. En effet elles */
/* sont utilisees dans de nombreuses fonctions */
/* locales. C'est dommage, car en effet, elles */
/* sont souvent utilisees independamment des */
/* autre outils ici definis (c'est par exemple */
/* le cas des rotations tridimensionnelles de */
/* 'ROTATION_TRIDIMENSIONNELLE_DANS_HC(...)'). */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Float,ZINT(vecteurs_____rapport_de_zoom_cumule_courant,ABSENCE_D_EFFET_DE_ZOOM)));
/* Rapport du zoom courant integrant tous les modifications anterieures. Celui-ci est */
/* utilise dans les procedures : */
/* */
/* T_ZOOM(...) */
/* */
/* et */
/* */
/* TRANSFORMATION_GEOMETRIQUE_3D_Fx(...) */
/* */
/* afin de garantir que les translations imposees subissent elles-aussi l'effet de zoom... */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____angle_de_rotation,FZERO)));
/* Angle courant de rotation (introduit le 20230722112439 lors de la mise au point de */
/* 'v $xrd/spectre.01$K')... */
DEFV(Common,DEFV(matrixF_3D,vecteurs_____matrix_3D));
/* Matrice de transformation courante dans l'espace 3D. */
DEFV(Common,DEFV(Logical,INIT(vecteurs_____etat_matrix,INVALIDE)));
/* Indicateur logique indiquant si le contenu de la matrice est correct */
/* ('VALIDE') ou incorrect ou encore non initialise ('INVALIDE'). */
Denumer04(INIS(_ORDRE_DE_LA_ROTATION_0X,_____BEAUCOUP)
,_ORDRE_DE_LA_ROTATION_0Y
,_ORDRE_DE_LA_ROTATION_0Z
,DERNIER_ORDRE_DE_LA_ROTATION
,liste_des_ORDRE_DES_ROTATIONS
);
/* La valeur tres elevee donnee a ces indicateurs est destinee a garantir presque surement */
/* que les rotations absentes en tant qu'argument n'auront pas des ordres identiques a ceux */
/* des rotations presentes... */
/* Tout ce qui concerne l'ordre des rotations vient de 'v $xrq/nucleon.LX.2$I' et a ete */
/* deplace le 19971104162912. */
#define ORDRE_DE_LA_ROTATION_0X \
ENUM(_ORDRE_DE_LA_ROTATION_0X)
#define ORDRE_DE_LA_ROTATION_0Y \
ENUM(_ORDRE_DE_LA_ROTATION_0Y)
#define ORDRE_DE_LA_ROTATION_0Z \
ENUM(_ORDRE_DE_LA_ROTATION_0Z)
DEFV(Common,DEFV(Int,ZINT(vecteurs_____ordre_de_la_ROTATION_0X,ORDRE_DE_LA_ROTATION_0X)));
DEFV(Common,DEFV(Int,ZINT(vecteurs_____ordre_de_la_ROTATION_0Y,ORDRE_DE_LA_ROTATION_0Y)));
DEFV(Common,DEFV(Int,ZINT(vecteurs_____ordre_de_la_ROTATION_0Z,ORDRE_DE_LA_ROTATION_0Z)));
/* Comme les rotations de l'espace tridimensionnel ne commutent pas, on va memoriser par */
/* ce biais l'ordre dans lequel elles sont definies, et donc l'ordre dans lequel elles */
/* seront appliquees. Pour avoir un exemple de memorisation de l'ordre courant des rotations */
/* on pourra voir le fichier 'v $xrv/champs_5.1A$I vecteurs_____ordre_de_la_ROTATION_0X', */
/* via la procedure 'PROCESS_ARGUMENTS_GEOMETRIQUES'... */
#undef ORDRE_DE_LA_ROTATION_0X
#undef ORDRE_DE_LA_ROTATION_0Y
#undef ORDRE_DE_LA_ROTATION_0Z
/* Tout ce qui concerne l'ordre des rotations vient de 'v $xrq/nucleon.LX.2$I' et a ete */
/* deplace le 19971104162912. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* N O T I O N D E C O N T E X T E : */
/* */
/* */
/* Definition : */
/* */
/* Le contexte est constitue de */
/* l'ensemble des donnees necessaires */
/* au trace graphique. Il est possible */
/* de le sauvegarder et de la restaurer */
/* globalement, et ce de facon "aleatoire", */
/* c'est-a-dire sans pile ni liste. */
/* */
/* A cause des problemes d'initialisation */
/* des structures a la compilation, les */
/* donnees graphiques courante ne sont pas */
/* rangees dans une structure de type "con- */
/* texte"... */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_00));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_01));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_02));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_03));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_04));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_05));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_06));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_07));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_08));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_09));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_10));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_11));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_12));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_13));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_14));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_15));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_16));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_17));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_18));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_19));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_20));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_21));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_22));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_23));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_24));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_25));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_26));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_27));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_28));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_29));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_30));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_31));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_32));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_33));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_34));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_35));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_36));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_37));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_38));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_39));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_40));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_41));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_42));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_43));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_44));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_45));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_46));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_47));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_48));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_49));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_50));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_51));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_52));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_53));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_54));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_55));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_56));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_57));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_58));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_59));
/* Generation des contextes graphiques. */
/* */
/* Le 20230906150540 ont ete introduits les contextes {40,41,42,43,44,45,46,47,48,49}. */
/* */
/* Le 20230926180744 ont ete introduits les contextes {50,51,52,53,54,55,56,57,58,59}. */
DEFV(Common,DEFV(Gcontexte,INIS(POINTERs(DTb0(liste_des_____vecteurs_____Gcon))
/* ATTENTION : ce qui precede doit absolument etre sur une seule et meme ligne et ce a */
/* caause de 'v $xcg/gen$EXT$Z' via 'v $xcg/gen$EXT$D/GetCommon$vv$Y'... */
,IstructL60(ADRESSE(vecteurs_____Gcon_00)
,ADRESSE(vecteurs_____Gcon_01)
,ADRESSE(vecteurs_____Gcon_02)
,ADRESSE(vecteurs_____Gcon_03)
,ADRESSE(vecteurs_____Gcon_04)
,ADRESSE(vecteurs_____Gcon_05)
,ADRESSE(vecteurs_____Gcon_06)
,ADRESSE(vecteurs_____Gcon_07)
,ADRESSE(vecteurs_____Gcon_08)
,ADRESSE(vecteurs_____Gcon_09)
,ADRESSE(vecteurs_____Gcon_10)
,ADRESSE(vecteurs_____Gcon_11)
,ADRESSE(vecteurs_____Gcon_12)
,ADRESSE(vecteurs_____Gcon_13)
,ADRESSE(vecteurs_____Gcon_14)
,ADRESSE(vecteurs_____Gcon_15)
,ADRESSE(vecteurs_____Gcon_16)
,ADRESSE(vecteurs_____Gcon_17)
,ADRESSE(vecteurs_____Gcon_18)
,ADRESSE(vecteurs_____Gcon_19)
,ADRESSE(vecteurs_____Gcon_20)
,ADRESSE(vecteurs_____Gcon_21)
,ADRESSE(vecteurs_____Gcon_22)
,ADRESSE(vecteurs_____Gcon_23)
,ADRESSE(vecteurs_____Gcon_24)
,ADRESSE(vecteurs_____Gcon_25)
,ADRESSE(vecteurs_____Gcon_26)
,ADRESSE(vecteurs_____Gcon_27)
,ADRESSE(vecteurs_____Gcon_28)
,ADRESSE(vecteurs_____Gcon_29)
,ADRESSE(vecteurs_____Gcon_30)
,ADRESSE(vecteurs_____Gcon_31)
,ADRESSE(vecteurs_____Gcon_32)
,ADRESSE(vecteurs_____Gcon_33)
,ADRESSE(vecteurs_____Gcon_34)
,ADRESSE(vecteurs_____Gcon_35)
,ADRESSE(vecteurs_____Gcon_36)
,ADRESSE(vecteurs_____Gcon_37)
,ADRESSE(vecteurs_____Gcon_38)
,ADRESSE(vecteurs_____Gcon_39)
,ADRESSE(vecteurs_____Gcon_40)
,ADRESSE(vecteurs_____Gcon_41)
,ADRESSE(vecteurs_____Gcon_42)
,ADRESSE(vecteurs_____Gcon_43)
,ADRESSE(vecteurs_____Gcon_44)
,ADRESSE(vecteurs_____Gcon_45)
,ADRESSE(vecteurs_____Gcon_46)
,ADRESSE(vecteurs_____Gcon_47)
,ADRESSE(vecteurs_____Gcon_48)
,ADRESSE(vecteurs_____Gcon_49)
,ADRESSE(vecteurs_____Gcon_50)
,ADRESSE(vecteurs_____Gcon_51)
,ADRESSE(vecteurs_____Gcon_52)
,ADRESSE(vecteurs_____Gcon_53)
,ADRESSE(vecteurs_____Gcon_54)
,ADRESSE(vecteurs_____Gcon_55)
,ADRESSE(vecteurs_____Gcon_56)
,ADRESSE(vecteurs_____Gcon_57)
,ADRESSE(vecteurs_____Gcon_58)
,ADRESSE(vecteurs_____Gcon_59)
)
)
)
);
/* Introduit le 20230730120025 afin de pourvoir indexer les 'vecteurs_____Gcon_*'... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* N O T I O N D E " B I B L I O T H E Q U E " : */
/* */
/* */
/* Definition : */
/* */
/* Certaines primitives sont en */
/* fait constituees d'un aiguillage */
/* portant sur la valeur de l'indicateur */
/* 'vecteurs_____num_bibliotheque' et qui fait */
/* qu'alors tel ou tel code est */
/* execute. */
/* */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Int,ZINT(vecteurs_____num_bibliotheque,BIBLIOTHEQUE_00)));
/* Numero de la bibliotheque courante. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T R A I T E M E N T D E S D E F I N I T I O N S I N E X I S T A N T E S : */
/* */
/*************************************************************************************************************************************/
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgLinex,PARENTHESES_DES_FONCTIONS,Linex)) /* Common,DEFV(Fonction,) : */
EFonctionI
/* Definition inexistante. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N N E U T R E : */
/* */
/*************************************************************************************************************************************/
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgLneutre,PARENTHESES_DES_FONCTIONS /* Common,DEFV(Fonction,) : */
,BLOC(
)
)
)
EFonctionI
/* Caractere "neutre". */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* Q U E L Q U E S M A C R O S G R A P H I Q U E S U T I L E S */
/* P O U R L A G E S T I O N D E S B I B L I O T H E Q U E S : */
/* */
/* */
/* Utilisation : */
/* */
/* SET_BIBLIOTHEQUE(nom de bibliotheque); */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R I M I T I V E S G R A P H I Q U E S D E B A S E : */
/* */
/* */
/* Definitions : */
/* */
/* "PO;" : mise du curseur a l'origine. */
/* "PA;" : definition de l'origine d'un segment. */
/* "PS;" : definition de l'extremite d'un segment et trace. */
/* "PB;" : definition de l'extremite d'un segment et trace, puis chainage. */
/* "M1;" : deplacement 'EST', */
/* "M3;" : deplacement 'OUEST'. */
/* "M2;" : deplacement 'NORD', */
/* "M4;" : deplacement 'SUD'. */
/* "M5;" : deplacement 'AVANT', */
/* "M6;" : deplacement 'ARRIERE'. */
/* "SK(k);" : definition de l'echelle globale telle que l'unite soit l'inter-point "physique", */
/* "SKH(k);" : definition homothetique de l'echelle globale telle que l'unite soit dans le */
/* rapport des dimensions de l'image courante definies dans 'format' aux */
/* dimensions de l'image de BASE definies aussi dans 'format'. */
/* "SX(x);" : definition de l'echelle sur l'axe des 'X', */
/* "SY(y);" : definition de l'echelle sur l'axe des 'Y', */
/* "SZ(z);" : definition de l'echelle sur l'axe des 'Z'. */
/* "XADDI;" : incrementation de l'echelle sur l'axe des 'X', */
/* "XSOUS;" : incrementation de l'echelle sur l'axe des 'X', */
/* "XMULT;" : multiplication de l'echelle sur l'axe des 'X', */
/* "XDIVI;" : division de l'echelle sur l'axe des 'X', */
/* "YADDI;" : incrementation de l'echelle sur l'axe des 'Y', */
/* "YSOUS;" : incrementation de l'echelle sur l'axe des 'Y', */
/* "YMULT;" : multiplication de l'echelle sur l'axe des 'Y', */
/* "YDIVI;" : division de l'echelle sur l'axe des 'Y', */
/* "ZADDI;" : incrementation de l'echelle sur l'axe des 'Z', */
/* "ZSOUS;" : incrementation de l'echelle sur l'axe des 'Z', */
/* "ZMULT;" : multiplication de l'echelle sur l'axe des 'Z', */
/* "ZDIVI;" : division de l'echelle sur l'axe des 'Z', */
/* "MIK;" : empilement de l'echelle globale. */
/* "MIX;" : empilement de l'echelle sur l'axe des 'X', */
/* "MIY;" : empilement de l'echelle sur l'axe des 'Y', */
/* "MIZ;" : empilement de l'echelle sur l'axe des 'Z'. */
/* "MI1;" : empilement de l'abscisse du curseur, */
/* "MI2;" : empilement de l'ordonnee du curseur, */
/* "MI3;" : empilement de la profondeur du curseur. */
/* "MIC;" : empilement des trois coordonnees du curseur dans l'ordre (Z,Y,X), */
/* "MIT;" : empilement de la matrice de transformation courante. */
/* "MIN;" : empilement des niveaux et des etats de trace dans l'ordre (min,max). */
/* "MON;" : depilement des niveaux et des etats de trace dans l'ordre (min,max). */
/* "MOT;" : depilement de la matrice de transformation courante. */
/* "MOC;" : depilement des trois coordonnees du curseur dans l'ordre {X,Y,Z}. */
/* "MO3;" : depilement de la profondeur du curseur, */
/* "MO2;" : depilement de l'ordonnee du curseur, */
/* "MO1;" : depilement de l'abscisse du curseur. */
/* "MOZ;" : depilement de l'echelle sur l'axe des 'Z', */
/* "MOY;" : depilement de l'echelle sur l'axe des 'Y', */
/* "MOX;" : depilement de l'echelle sur l'axe des 'X'. */
/* "MOK;" : depilement de l'echelle globale. */
/* "T_INIT;" : (re-)initialisation de la transformation courante. */
/* "TRX1;" : rotation autour de l'axe des 'X' de +pi/2, */
/* "TRX3;" : rotation autour de l'axe des 'X' de -pi/2. */
/* "TRX(a);" : rotation autour de l'axe des 'X' d'un angle exprime en radian. */
/* "TRY1;" : rotation autour de l'axe des 'Y' de +pi/2, */
/* "TRY3;" : rotation autour de l'axe des 'Y' de -pi/2. */
/* "TRY(a);" : rotation autour de l'axe des 'Y' d'un angle exprime en radian. */
/* "TRZ1;" : rotation autour de l'axe des 'Z' de +pi/2, */
/* "TRZ3;" : rotation autour de l'axe des 'Z' de -pi/2. */
/* "TRZ(a);" : rotation autour de l'axe des 'Z' d'un angle exprime en radian. */
/* "TSO;" : symetrie origine (qui est le produit de trois symetries planes), */
/* "TSXY;" : symetrie par rapport au plan 'XY', */
/* "TSYZ;" : symetrie par rapport au plan 'YZ', */
/* "TSZX;" : symetrie par rapport au plan 'ZX', */
/* "ERASE;" : effacement de l'image de trace... */
/* */
/*************************************************************************************************************************************/
#define PO \
Bblock \
SET_CURSOR(FXorigine,FYorigine,FZorigine); \
Eblock \
/* "O" : mise du curseur a l'origine. */
#define PA \
Bblock \
ORIGINE(ASD1(vecteurs_____cursor_3D,x),ASD1(vecteurs_____cursor_3D,y),ASD1(vecteurs_____cursor_3D,z)); \
Eblock \
/* "A" : definition de l'origine d'un segment. */
#define PS \
Bblock \
EXTREMITE(ASD1(vecteurs_____cursor_3D,x),ASD1(vecteurs_____cursor_3D,y),ASD1(vecteurs_____cursor_3D,z)); \
DRAW; \
Eblock \
/* "S" : definition de l'extremite d'un segment et trace. */
#define PB \
Bblock \
PS; \
PA; \
Eblock \
/* "B" : definition de l'extremite d'un segment et trace, puis chainage. */
#define MOINS_I \
NEGA(I)
#define ___ZERO \
ZERO
#define PLUS__I \
NEUT(I)
/* Uniquement afin de faire une belle presentation des 'MOVE' qui suivent... */
#define M1 \
Bblock \
MOVE(PLUS__I,___ZERO,___ZERO); \
Eblock \
/* "1" : deplacement 'EST', */
#define M3 \
Bblock \
MOVE(MOINS_I,___ZERO,___ZERO); \
Eblock \
/* "3" : deplacement 'OUEST'. */
#define M2 \
Bblock \
MOVE(___ZERO,PLUS__I,___ZERO); \
Eblock \
/* "2" : deplacement 'NORD', */
#define M4 \
Bblock \
MOVE(___ZERO,MOINS_I,___ZERO); \
Eblock \
/* "4" : deplacement 'SUD'. */
#define M5 \
Bblock \
MOVE(___ZERO,___ZERO,PLUS__I); \
Eblock \
/* "5" : deplacement 'AVANT', */
#define M6 \
Bblock \
MOVE(___ZERO,___ZERO,MOINS_I); \
Eblock \
/* "6" : deplacement 'ARRIERE'. */
#define SCALE_GLOBALE_OX \
_____lNORMALISE_OX(I___vecteurs_____scale_globale) \
/* En effet, pour 'XADDI' et 'XSOUS', ce n'est pas 'vecteurs_____scale_globale' qui est a */ \
/* utiliser, mais plutot une version denormalisee (dans [0,1])... */
#define SCALE_GLOBALE_OY \
_____lNORMALISE_OY(I___vecteurs_____scale_globale) \
/* En effet, pour 'YADDI' et 'YSOUS', ce n'est pas 'vecteurs_____scale_globale' qui est a */ \
/* utiliser, mais plutot une version denormalisee (dans [0,1])... */
#define SCALE_GLOBALE_OZ \
_____lNORMALISE_OZ(I___vecteurs_____scale_globale) \
/* En effet, pour 'ZADDI' et 'ZSOUS', ce n'est pas 'vecteurs_____scale_globale' qui est a */ \
/* utiliser, mais plutot une version denormalisee (dans [0,1])... */
#define XADDI \
Bblock \
EGAL(vecteurs_____scale_OX,ADD2(I___vecteurs_____scale_OX,SCALE_GLOBALE_OX)); \
Eblock \
/* "X+" : incrementation de l'echelle sur l'axe des 'X', */
#define XSOUS \
Bblock \
EGAL(vecteurs_____scale_OX,SOUS(I___vecteurs_____scale_OX,SCALE_GLOBALE_OX)); \
Eblock \
/* "X-" : incrementation de l'echelle sur l'axe des 'X', */
#define XMULT \
Bblock \
EGAL(vecteurs_____scale_OX,MUL2(I___vecteurs_____scale_OX,I___vecteurs_____scale_globale)); \
Eblock \
/* "X*" : multiplication de l'echelle sur l'axe des 'X', */
#define XDIVI \
Bblock \
EGAL(vecteurs_____scale_OX,DIVZ(I___vecteurs_____scale_OX,I___vecteurs_____scale_globale)); \
Eblock \
/* "X/" : division de l'echelle sur l'axe des 'X', */
#define YADDI \
Bblock \
EGAL(vecteurs_____scale_OY,ADD2(I___vecteurs_____scale_OY,SCALE_GLOBALE_OY)); \
Eblock \
/* "Y+" : incrementation de l'echelle sur l'axe des 'Y', */
#define YSOUS \
Bblock \
EGAL(vecteurs_____scale_OY,SOUS(I___vecteurs_____scale_OY,SCALE_GLOBALE_OY)); \
Eblock \
/* "Y-" : incrementation de l'echelle sur l'axe des 'Y', */
#define YMULT \
Bblock \
EGAL(vecteurs_____scale_OY,MUL2(I___vecteurs_____scale_OY,I___vecteurs_____scale_globale)); \
Eblock \
/* "Y*" : multiplication de l'echelle sur l'axe des 'Y', */
#define YDIVI \
Bblock \
EGAL(vecteurs_____scale_OY,DIVZ(I___vecteurs_____scale_OY,I___vecteurs_____scale_globale)); \
Eblock \
/* "Y/" : division de l'echelle sur l'axe des 'Y', */
#define ZADDI \
Bblock \
EGAL(vecteurs_____scale_OZ,ADD2(I___vecteurs_____scale_OZ,SCALE_GLOBALE_OZ)); \
Eblock \
/* "Z+" : incrementation de l'echelle sur l'axe des 'Z', */
#define ZSOUS \
Bblock \
EGAL(vecteurs_____scale_OZ,SOUS(I___vecteurs_____scale_OZ,SCALE_GLOBALE_OZ)); \
Eblock \
/* "Z-" : incrementation de l'echelle sur l'axe des 'Z', */
#define ZMULT \
Bblock \
EGAL(vecteurs_____scale_OZ,MUL2(I___vecteurs_____scale_OZ,I___vecteurs_____scale_globale)); \
Eblock \
/* "Z*" : multiplication de l'echelle sur l'axe des 'Z', */
#define ZDIVI \
Bblock \
EGAL(vecteurs_____scale_OZ,DIVZ(I___vecteurs_____scale_OZ,I___vecteurs_____scale_globale)); \
Eblock \
/* "Z/" : division de l'echelle sur l'axe des 'Z', */
#define MIK \
Bblock \
GpushF(I___vecteurs_____scale_globale); \
Eblock \
/* "MIK;" : empilement de l'echelle globale. */
#define MIX \
Bblock \
GpushF(I___vecteurs_____scale_OX); \
Eblock \
/* "MIX;" : empilement de l'echelle sur l'axe des 'X', */
#define MIY \
Bblock \
GpushF(I___vecteurs_____scale_OY); \
Eblock \
/* "MIY;" : empilement de l'echelle sur l'axe des 'Y', */
#define MIZ \
Bblock \
GpushF(I___vecteurs_____scale_OZ); \
Eblock \
/* "MIZ;" : empilement de l'echelle sur l'axe des 'Z'. */
#define MI1 \
Bblock \
GpushF(ASD1(vecteurs_____cursor_3D,x)); \
Eblock \
/* "MI1;" : empilement de l'abscisse du curseur, */
#define MI2 \
Bblock \
GpushF(ASD1(vecteurs_____cursor_3D,y)); \
Eblock \
/* "MI2;" : empilement de l'ordonnee du curseur, */
#define MI3 \
Bblock \
GpushF(ASD1(vecteurs_____cursor_3D,z)); \
Eblock \
/* "MI3;" : empilement de la profondeur du curseur. */
#define MIC \
Bblock \
MI3; \
MI2; \
MI1; \
Eblock \
/* "MIC;" : empilement des trois coordonnees du curseur dans l'ordre (Z,Y,X), */
#define MIT \
Bblock \
GpushI(vecteurs_____etat_matrix); \
\
GpushF(vecteurs_____rapport_de_zoom_cumule_courant); \
\
GpushF(vecteurs_____angle_de_rotation); \
\
GpushF(ASD2(vecteurs_____matrix_3D,cx,cx)); \
GpushF(ASD2(vecteurs_____matrix_3D,cx,cy)); \
GpushF(ASD2(vecteurs_____matrix_3D,cx,cz)); \
\
GpushF(ASD2(vecteurs_____matrix_3D,cy,cx)); \
GpushF(ASD2(vecteurs_____matrix_3D,cy,cy)); \
GpushF(ASD2(vecteurs_____matrix_3D,cy,cz)); \
\
GpushF(ASD2(vecteurs_____matrix_3D,cz,cx)); \
GpushF(ASD2(vecteurs_____matrix_3D,cz,cy)); \
GpushF(ASD2(vecteurs_____matrix_3D,cz,cz)); \
Eblock \
/* "MIT;" : empilement de la matrice de transformation courante. */
#define MIN \
Bblock \
GpushI(vecteurs_____niveau_minimal); \
GpushI(vecteurs_____niveau_maximal); \
GpushI(vecteurs_____pointilles); \
GpushI(vecteurs_____etat_trace); \
GpushI(vecteurs_____etat_anti_aliasing); \
GpushI(noir_plancher_des_vecteurs); \
Eblock \
/* Empilement des niveaux, des etats de trace et du "noir-plancher" des vecteurs. */
#define MON \
Bblock \
GpullI(GENP,noir_plancher_des_vecteurs); \
GpullI(LOGI,vecteurs_____etat_anti_aliasing); \
GpullI(LOGI,vecteurs_____etat_trace); \
GpullI(POSI,vecteurs_____pointilles); \
GpullI(GENP,vecteurs_____niveau_maximal); \
GpullI(GENP,vecteurs_____niveau_minimal); \
Eblock \
/* Depilement des niveaux, des etats de trace et du "noir-plancher" des vecteurs. */
#define MOT \
Bblock \
GpullF(ASD2(vecteurs_____matrix_3D,cz,cz)); \
GpullF(ASD2(vecteurs_____matrix_3D,cz,cy)); \
GpullF(ASD2(vecteurs_____matrix_3D,cz,cx)); \
\
GpullF(ASD2(vecteurs_____matrix_3D,cy,cz)); \
GpullF(ASD2(vecteurs_____matrix_3D,cy,cy)); \
GpullF(ASD2(vecteurs_____matrix_3D,cy,cx)); \
\
GpullF(ASD2(vecteurs_____matrix_3D,cx,cz)); \
GpullF(ASD2(vecteurs_____matrix_3D,cx,cy)); \
GpullF(ASD2(vecteurs_____matrix_3D,cx,cx)); \
\
GpullF(vecteurs_____angle_de_rotation); \
\
GpullF(vecteurs_____rapport_de_zoom_cumule_courant); \
\
GpullI(LOGI,vecteurs_____etat_matrix); \
Eblock \
/* "MOT;" : depilement de la matrice de transformation courante. */
#define MOC \
Bblock \
MO1; \
MO2; \
MO3; \
Eblock \
/* "MOC;" : depilement des trois coordonnees du curseur dans l'ordre {X,Y,Z}. */
#define MO3 \
Bblock \
GpullF(ASD1(vecteurs_____cursor_3D,z)); \
Eblock \
/* "MO3;" : depilement de la profondeur du curseur, */
#define MO2 \
Bblock \
GpullF(ASD1(vecteurs_____cursor_3D,y)); \
Eblock \
/* "MO2;" : depilement de l'ordonnee du curseur, */
#define MO1 \
Bblock \
GpullF(ASD1(vecteurs_____cursor_3D,x)); \
Eblock \
/* "MO1;" : depilement de l'abscisse du curseur. */
#define MOZ \
Bblock \
GpullF(vecteurs_____scale_OZ); \
Eblock \
/* "MOZ;" : depilement de l'echelle sur l'axe des 'Z', */
#define MOY \
Bblock \
GpullF(vecteurs_____scale_OY); \
Eblock \
/* "MOY;" : depilement de l'echelle sur l'axe des 'Y', */
#define MOX \
Bblock \
GpullF(vecteurs_____scale_OX); \
Eblock \
/* "MOX;" : depilement de l'echelle sur l'axe des 'X'. */
#define MOK \
Bblock \
GpullF(vecteurs_____scale_globale); \
Eblock \
/* "MOK;" : depilement de l'echelle globale. */
#define __________________FZERO \
FZERO \
/* Uniquement afin de faire une belle presentation des 'MOVE' qui suivent... */
#define T_INIT \
Bblock \
EGAL(vecteurs_____rapport_de_zoom_cumule_courant,ABSENCE_D_EFFET_DE_ZOOM); \
EGAL(vecteurs_____angle_de_rotation,ABSENCE_DE_ROTATION); \
INITIALISATION_MATRICE_3D \
(vecteurs_____matrix_3D \
,ABSENCE_D_EFFET_DE_ZOOM,__________________FZERO,__________________FZERO \
,__________________FZERO,ABSENCE_D_EFFET_DE_ZOOM,__________________FZERO \
,__________________FZERO,__________________FZERO,ABSENCE_D_EFFET_DE_ZOOM \
); \
EGAL(vecteurs_____etat_matrix,VALIDE); \
Eblock \
/* (re-)initialisation de la transformation courante. */
#define TRX1 \
Bblock \
T_ROTATION_X(NEUT(PI_SUR_2)) \
Eblock \
/* "TRX1;" : rotation autour de l'axe des 'X' de +pi/2, */
#define TRX3 \
Bblock \
T_ROTATION_X(NEGA(PI_SUR_2)) \
Eblock \
/* "TRX3;" : rotation autour de l'axe des 'X' de -pi/2. */
#define TRY1 \
Bblock \
T_ROTATION_Y(NEUT(PI_SUR_2)) \
Eblock \
/* "TRY1;" : rotation autour de l'axe des 'Y' de +pi/2, */
#define TRY3 \
Bblock \
T_ROTATION_Y(NEGA(PI_SUR_2)) \
Eblock \
/* "TRY3;" : rotation autour de l'axe des 'Y' de -pi/2. */
#define TRZ1 \
Bblock \
T_ROTATION_Z(NEUT(PI_SUR_2)) \
Eblock \
/* "TRZ1;" : rotation autour de l'axe des 'Z' de +pi/2, */
#define TRZ3 \
Bblock \
T_ROTATION_Z(NEGA(PI_SUR_2)) \
Eblock \
/* "TRZ3;" : rotation autour de l'axe des 'Z' de -pi/2. */
#define TSO \
Bblock \
TSXY;TSYZ;TSZX; \
Eblock \
/* "TSO;" : symetrie origine (qui est le produit de trois symetries planes), */
#define TSXY \
Bblock \
T_PRODUIT_MATRICIEL(vecteurs_____matrix_3D \
,FU ,FZERO ,FZERO \
,FZERO ,FU ,FZERO \
,FZERO ,FZERO ,NEGA(FU) \
); \
Eblock \
/* "TSXY;" : symetrie par rapport au plan 'XY', */
#define TSYZ \
Bblock \
T_PRODUIT_MATRICIEL(vecteurs_____matrix_3D \
,NEGA(FU) ,FZERO ,FZERO \
,FZERO ,FU ,FZERO \
,FZERO ,FZERO ,FU \
); \
Eblock \
/* "TSYZ;" : symetrie par rapport au plan 'YZ', */
#define TSZX \
Bblock \
T_PRODUIT_MATRICIEL(vecteurs_____matrix_3D \
,FU ,FZERO ,FZERO \
,FZERO ,NEGA(FU) ,FZERO \
,FZERO ,FZERO ,FU \
); \
Eblock \
/* "TSZX;" : symetrie par rapport au plan 'ZX', */
#define ERASE \
Bblock \
CALi(Inoir(ImageG)); \
Eblock \
/* Effacement de l'image de trace. ATTENTION, il y avait autrefois : */ \
/* */ \
/* CALS(Inoir(ImageG)); */ \
/* */ \
/* mais c'est en fait plus sage d'utiliser 'CALi(...)'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N S G R A P H I Q U E S P R I M I T I V E S : */
/* */
/* */
/* Definitions : */
/* */
/* "FgSET_CURSOR(ARGUMENT_POINTERs(point_3D));" */
/* : positionnement absolu du curseur. */
/* "FgPO();" : mise du curseur a l'origine. */
/* "FgPA();" : definition de l'origine d'un segment. */
/* "FgPS();" : definition de l'extremite d'un segment et trace. */
/* "FgPB();" : definition de l'extremite d'un segment et trace, puis chainage. */
/* "FgM1();" : deplacement 'EST', */
/* "FgM3();" : deplacement 'OUEST'. */
/* "FgM2();" : deplacement 'NORD', */
/* "FgM4();" : deplacement 'SUD'. */
/* "FgM5();" : deplacement 'AVANT', */
/* "FgM6();" : deplacement 'ARRIERE'. */
/* "FgXADDI();" : incrementation de l'echelle sur l'axe des 'X', */
/* "FgXSOUS();" : incrementation de l'echelle sur l'axe des 'X', */
/* "FgXMULT();" : multiplication de l'echelle sur l'axe des 'X', */
/* "FgXDIVI();" : division de l'echelle sur l'axe des 'X', */
/* "FgYADDI();" : incrementation de l'echelle sur l'axe des 'Y', */
/* "FgYSOUS();" : incrementation de l'echelle sur l'axe des 'Y', */
/* "FgYMULT();" : multiplication de l'echelle sur l'axe des 'Y', */
/* "FgYDIVI();" : division de l'echelle sur l'axe des 'Y', */
/* "FgZADDI();" : incrementation de l'echelle sur l'axe des 'Z', */
/* "FgZSOUS();" : incrementation de l'echelle sur l'axe des 'Z', */
/* "FgZMULT();" : multiplication de l'echelle sur l'axe des 'Z', */
/* "FgZDIVI();" : division de l'echelle sur l'axe des 'Z', */
/* "FgMIK();" : empilement de l'echelle globale. */
/* "FgMIX();" : empilement de l'echelle sur l'axe des 'X', */
/* "FgMIY();" : empilement de l'echelle sur l'axe des 'Y', */
/* "FgMIZ();" : empilement de l'echelle sur l'axe des 'Z'. */
/* "FgMI1();" : empilement de l'abscisse du curseur, */
/* "FgMI2();" : empilement de l'ordonnee du curseur, */
/* "FgMI3();" : empilement de la profondeur du curseur. */
/* "FgMIC();" : empilement des trois coordonnees du curseur dans l'ordre (Z,Y,X), */
/* "FgMIT();" : empilement de la matrice de transformation courante. */
/* "FgMIN();" : empilement des niveaux, des etats de trace et du "noir-plancher" des vecteurs. */
/* "FgMON();" : depilement des niveaux, des etats de trace et du "noir-plancher" des vecteurs. */
/* "FgMOT();" : depilement de la matrice de transformation courante. */
/* "FgMOC();" : depilement des trois coordonnees du curseur dans l'ordre {X,Y,Z}. */
/* "FgMO3();" : depilement de la profondeur du curseur, */
/* "FgMO2();" : depilement de l'ordonnee du curseur, */
/* "FgMO1();" : depilement de l'abscisse du curseur. */
/* "FgMOZ();" : depilement de l'echelle sur l'axe des 'Z', */
/* "FgMOY();" : depilement de l'echelle sur l'axe des 'Y', */
/* "FgMOX();" : depilement de l'echelle sur l'axe des 'X'. */
/* "FgMOK();" : depilement de l'echelle globale. */
/* "FgT_INIT();" : (re-)initialisation de la transformation courante. */
/* "FgTRX1();" : rotation autour de l'axe des 'X' de +pi/2, */
/* "FgTRX3();" : rotation autour de l'axe des 'X' de -pi/2. */
/* "FgTRY1();" : rotation autour de l'axe des 'Y' de +pi/2, */
/* "FgTRY3();" : rotation autour de l'axe des 'Y' de -pi/2. */
/* "FgTRZ1();" : rotation autour de l'axe des 'Z' de +pi/2, */
/* "FgTRZ3();" : rotation autour de l'axe des 'Z' de -pi/2. */
/* "FgTSO();" : symetrie origine (qui est le produit de trois symetries planes), */
/* "FgTSXY();" : symetrie par rapport au plan 'XY', */
/* "FgTSYZ();" : symetrie par rapport au plan 'YZ', */
/* "FgTSZX();" : symetrie par rapport au plan 'ZX', */
/* "FgERASE();" : effacement de l'image de trace... */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P O S I T I O N N E M E N T D U C U R S E U R G R A P H I Q U E : */
/* */
/*************************************************************************************************************************************/
BFonctionI
DEFV(Common,DEFV(FonctionI,FgSET_CURSOR(ARGUMENT_POINTERs(point_3D))))
DEFV(Argument,DEFV(pointF_3D,POINTERs(point_3D)));
/* Point flottant argument dont les coordonnees sont normalisees dans [0,1[, */
/* et sur lequel on va positionner le curseur graphique. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
/*..............................................................................................................................*/
SET_CURSOR(ASI1(point_3D,x),ASI1(point_3D,y),ASI1(point_3D,z));
/* Et ainsi, on positionne le curseur graphique... */
RETU_ERROR;
Eblock
EFonctionI
/*===================================================================================================================================*/
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgT_INIT,PARENTHESES_DES_FONCTIONS,T_INIT)) /* Common,DEFV(Fonction,) : */
EFonctionI
/* ATTENTION : la fonction 'FgT_INIT(...)' doit etre la premiere car beaucoup d'autres */
/* la referencent via 'INITIALISATION_TRANSFORMATION' dans 'MOVE(dX,dY,dZ)'... */
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgPO,PARENTHESES_DES_FONCTIONS,PO)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgPA,PARENTHESES_DES_FONCTIONS,PA)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgPS,PARENTHESES_DES_FONCTIONS,PS)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgPB,PARENTHESES_DES_FONCTIONS,PB)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM1,PARENTHESES_DES_FONCTIONS,M1)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM2,PARENTHESES_DES_FONCTIONS,M2)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM3,PARENTHESES_DES_FONCTIONS,M3)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM4,PARENTHESES_DES_FONCTIONS,M4)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM5,PARENTHESES_DES_FONCTIONS,M5)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM6,PARENTHESES_DES_FONCTIONS,M6)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgXADDI,PARENTHESES_DES_FONCTIONS,XADDI)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgXSOUS,PARENTHESES_DES_FONCTIONS,XSOUS)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgXMULT,PARENTHESES_DES_FONCTIONS,XMULT)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgXDIVI,PARENTHESES_DES_FONCTIONS,XDIVI)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgYADDI,PARENTHESES_DES_FONCTIONS,YADDI)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgYSOUS,PARENTHESES_DES_FONCTIONS,YSOUS)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgYMULT,PARENTHESES_DES_FONCTIONS,YMULT)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgYDIVI,PARENTHESES_DES_FONCTIONS,YDIVI)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgZADDI,PARENTHESES_DES_FONCTIONS,ZADDI)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgZSOUS,PARENTHESES_DES_FONCTIONS,ZSOUS)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgZMULT,PARENTHESES_DES_FONCTIONS,ZMULT)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgZDIVI,PARENTHESES_DES_FONCTIONS,ZDIVI)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIK,PARENTHESES_DES_FONCTIONS,MIK)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIX,PARENTHESES_DES_FONCTIONS,MIX)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIY,PARENTHESES_DES_FONCTIONS,MIY)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIZ,PARENTHESES_DES_FONCTIONS,MIZ)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMI1,PARENTHESES_DES_FONCTIONS,MI1)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMI2,PARENTHESES_DES_FONCTIONS,MI2)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMI3,PARENTHESES_DES_FONCTIONS,MI3)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIC,PARENTHESES_DES_FONCTIONS,MIC)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIT,PARENTHESES_DES_FONCTIONS,MIT)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIN,PARENTHESES_DES_FONCTIONS,MIN)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMON,PARENTHESES_DES_FONCTIONS,MON)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOT,PARENTHESES_DES_FONCTIONS,MOT)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOC,PARENTHESES_DES_FONCTIONS,MOC)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMO3,PARENTHESES_DES_FONCTIONS,MO3)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMO2,PARENTHESES_DES_FONCTIONS,MO2)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMO1,PARENTHESES_DES_FONCTIONS,MO1)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOZ,PARENTHESES_DES_FONCTIONS,MOZ)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOY,PARENTHESES_DES_FONCTIONS,MOY)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOX,PARENTHESES_DES_FONCTIONS,MOX)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOK,PARENTHESES_DES_FONCTIONS,MOK)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRX1,PARENTHESES_DES_FONCTIONS,TRX1)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRX3,PARENTHESES_DES_FONCTIONS,TRX3)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRY1,PARENTHESES_DES_FONCTIONS,TRY1)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRY3,PARENTHESES_DES_FONCTIONS,TRY3)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRZ1,PARENTHESES_DES_FONCTIONS,TRZ1)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRZ3,PARENTHESES_DES_FONCTIONS,TRZ3)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTSO,PARENTHESES_DES_FONCTIONS,TSO)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTSXY,PARENTHESES_DES_FONCTIONS,TSXY)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTSYZ,PARENTHESES_DES_FONCTIONS,TSYZ)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTSZX,PARENTHESES_DES_FONCTIONS,TSZX)) /* Common,DEFV(Fonction,) : */
EFonctionI
BFonctionI
DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgERASE,PARENTHESES_DES_FONCTIONS,ERASE)) /* Common,DEFV(Fonction,) : */
EFonctionI
#undef PO
#undef PA
#undef PS
#undef PB
#undef PLUS__I
#undef ___ZERO
#undef MOINS_I
#undef M1
#undef M3
#undef M2
#undef M4
#undef M5
#undef M6
#undef SCALE_GLOBALE_OZ
#undef SCALE_GLOBALE_OY
#undef SCALE_GLOBALE_OX
#undef XADDI
#undef XSOUS
#undef XMULT
#undef XDIVI
#undef YADDI
#undef YSOUS
#undef YMULT
#undef YDIVI
#undef ZADDI
#undef ZSOUS
#undef ZMULT
#undef ZDIVI
#undef MIK
#undef MIX
#undef MIY
#undef MIZ
#undef MI1
#undef MI2
#undef MI3
#undef MIC
#undef MIT
#undef MIN
#undef MON
#undef MOT
#undef MOC
#undef MO3
#undef MO2
#undef MO1
#undef MOZ
#undef MOY
#undef MOX
#undef T_INIT
#undef __________________FZERO
#undef MOK
#undef TRX1
#undef TRX3
#undef TRY1
#undef TRY3
#undef TRZ1
#undef TRZ3
#undef TSO
#undef TSXY
#undef TSYZ
#undef TSZX
#undef ERASE
_______________________________________________________________________________________________________________________________________