_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* 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 _______________________________________________________________________________________________________________________________________