/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D U S I G L E " D E N I A U - C O N S E I L S " : */ /* */ /* */ /* Author of '$xrd/Deniau.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1990??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE #include image_image_CONTOURS_EXT #include maths_fonct_COURBES_1_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define TRES_PETITE_DIMENSION \ UN \ /* Tres petite dimension du sigle. */ #define PETITE_DIMENSION \ DOUB(TRES_PETITE_DIMENSION) \ /* Petite dimension du sigle. */ #define MOYENNE_DIMENSION \ DOUB(PETITE_DIMENSION) \ /* Moyenne dimension du sigle. */ #define GRANDE_DIMENSION \ DOUB(MOYENNE_DIMENSION) \ /* Grande dimension du sigle. */ #define REMPLIR(contexte,couleur) \ Bblock \ Test(IL_FAUT(remplir_les_contours)) \ Bblock \ RCG(contexte); \ /* Recuperation du contexte associe au contour a remplir. */ \ INITIALISATION_POINT_2D(point_de_depart,ASD1(vecteurs_____cursor_3D,x),ASD1(vecteurs_____cursor_3D,y)); \ /* Positionnement du point de depart de remplissage du contour. On notera que l'on */ \ /* n'utilise pas 'TRANSFERT_POINT_2D(...)' car 'vecteurs_____cursor_3D' est tridimensionnel. */ \ INITIALISATION_POINT_2D(coin_inferieur_gauche,Xmin,Ymin); \ /* Definition du coin inferieur gauche de remplissage, */ \ INITIALISATION_POINT_2D(coin_superieur_droite,Xmax,Ymax); \ /* Definition du coin superieur droite de remplissage. */ \ CALS(Iremplissage(ImageR \ ,ImageR \ ,ADRESSE(point_de_depart) \ ,ADRESSE(coin_inferieur_gauche) \ ,ADRESSE(coin_superieur_droite) \ ,fond,bord \ ,VRAI,VRAI,VRAI,VRAI \ ,FAUX,FAUX,FAUX,FAUX \ ,couleur \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Remplissage du contour repere par 'contexte' avec 'couleur' dans 'ImageR'. */ #define GET_POINT_COURANT \ Bblock \ GET_CURSOR(ASD1(pointF_courant,x),ASD1(pointF_courant,y),ASD1(pointF_courant,z)); \ Eblock \ /* Recuperation du curseur courant dans [0,1]... */ #define dZ0 \ FZERO \ /* Pour contenir les arcs de courbe dans le plan (OX,OY). */ #define dZn \ FZERO \ /* Pour contenir les arcs de courbe dans le plan (OX,OY). */ #define SET_ORIGINE(dX0,dY0) \ Bblock \ GET_POINT_COURANT; \ TRANSFERT_POINT_3D(pointF_origine,pointF_courant); \ INITIALISATION_ACCROISSEMENT_3D(derivee_a_l_origine \ ,MUL2(DELTA_AXE(vecteurs_____scale_OX,dX0),tension_des_arcs) \ ,MUL2(DELTA_AXE(vecteurs_____scale_OY,dY0),tension_des_arcs) \ ,MUL2(DELTA_AXE(vecteurs_____scale_OZ,dZ0),tension_des_arcs) \ ); \ Eblock \ /* Definition du point origine. */ #define SET_EXTREMITE(dXn,dYn) \ Bblock \ GET_POINT_COURANT; \ TRANSFERT_POINT_3D(pointF_extremite,pointF_courant); \ INITIALISATION_ACCROISSEMENT_3D(derivee_a_l_extremite \ ,MUL2(DELTA_AXE(vecteurs_____scale_OX,dXn),tension_des_arcs) \ ,MUL2(DELTA_AXE(vecteurs_____scale_OY,dYn),tension_des_arcs) \ ,MUL2(DELTA_AXE(vecteurs_____scale_OZ,dZn),tension_des_arcs) \ ); \ DRAW_CUBIQUE_2; \ MOVE_ORIGINE; \ Eblock \ /* Definition du point extremite et trace de l'arc (origine,extremite)... */ #define MOVE_ORIGINE \ Bblock \ TRANSFERT_POINT_3D(pointF_origine,pointF_extremite); \ TRANSFERT_ACCROISSEMENT_3D(derivee_a_l_origine,derivee_a_l_extremite); \ Eblock \ /* Deplacement de l'origine sur l'extremite precedente. */ #define DRAW_CUBIQUE_2 \ Bblock \ CALS(Ivisualisation_arc_de_cubique_2P2D(ImageG \ ,ADRESSE(pointF_origine) \ ,ADRESSE(derivee_a_l_origine) \ ,niveau_origine \ ,ADRESSE(pointF_extremite) \ ,ADRESSE(derivee_a_l_extremite) \ ,niveau_extremite \ ,CHOI(_____lNORMALISE_OX(RAYON_DU_POINT) \ ,_____lNORMALISE_OY(RAYON_DU_POINT) \ ) \ ,AFFAIBLISSEMENT_AU_BORD \ ,TRI_DIMENSIONNEL \ ) \ ); \ Eblock \ /* Trace de l'arc de cubique... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define PENTE_DES_ARCS \ FU \ /* Pour definir les derivees a l'origine et a l'extremite. */ #define TENSION_DES_ARCS \ FLOT(CINQ) \ /* Plus cette valeur est proche de 1 et plus les courbes sont tendues et proches de lignes */ \ /* droites. Plus cette valeur est grande, et plus, les courbes sont courbes... */ #define NIVEAU_DU_CONTOURS_DU_SIGLE \ BLANC \ /* Niveau de trace des contours du sigle. */ #define RAYON_DU_POINT \ DEUX \ /* Rayon du point representatif. */ #define AFFAIBLISSEMENT_AU_BORD \ FU \ /* Afin de faire un degrade du centre vers le bord... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D U S I G L E " D E N I A U - C O N S E I L S " : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); DEFV(pointF_2D,point_de_depart); /* Point de depart du remplissage d'un contour. */ DEFV(pointF_2D,coin_inferieur_gauche); /* Coin inferieur gauche de la zone de remplissage, */ DEFV(pointF_2D,coin_superieur_droite); /* Coin superieur droite de la zone de remplissage. */ DEFV(Logical,DTb1(fond,COULEURS)); /* Definition du "fond" de l'image, */ DEFV(Logical,DTb1(bord,COULEURS)); /* Definition du "bord" d'un contour. */ DEFV(pointF_3D,pointF_courant); /* Definition du point courant. */ DEFV(pointF_3D,pointF_origine); DEFV(pointF_3D,pointF_extremite); /* Definition des points origines et extremite de l'arc de cubique. */ DEFV(deltaF_3D,derivee_a_l_origine); DEFV(deltaF_3D,derivee_a_l_extremite); /* Definition des vecteurs derivees a l'origine et a l'extremite. */ DEFV(genere_p,INIT(niveau_origine,NIVEAU_UNDEF)); DEFV(genere_p,INIT(niveau_extremite,NIVEAU_UNDEF)); /* Niveaux origine et extremite du trace d'un arc de cubique... */ DEFV(Logical,INIT(remplir_les_contours,VRAI)); /* Indique s'il faut ('VRAI') ou pas ('FAUX') remplir les contours... */ DEFV(Float,INIT(tension_des_arcs,TENSION_DES_ARCS)); /* Definition de la tension des arcs de cubique ; plus cette valeur est proche de 1 et */ /* plus les courbes sont tendues et proches de lignes droites. Plus cette valeur est */ /* grande, et plus, les courbes sont courbes... */ /*..............................................................................................................................*/ GET_ARGUMENTSv(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("SX_SY_SZ_____compatibilite_20070416=""compatibilite_20070416=" ,SX_SY_SZ_____compatibilite_20070416 ); /* Parametre introduit le 20070416161448... */ GET_ARGUMENT_L("Ipoint_anti_aliase_segment_____compatibilite_20110420=""compatibilite_20110420=" ,Ipoint_anti_aliase_segment_____compatibilite_20110420 ); /* Parametre introduit le 20110420145120... */ GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_F("tension=""t=",tension_des_arcs); GET_ARGUMENT_L("remplir=""r=",remplir_les_contours); ) ); CALi(Inoir(ImageR)); /* R : futur resultat. */ BoIn(niveau,NOIR,BLANC,PAS_COULEURS) Bblock EGAL(ITb1(fond,INDX(niveau,NOIR)),FAUX); EGAL(ITb1(bord,INDX(niveau,NOIR)),VRAI); Eblock EBoI EGAL(ITb1(fond,INDX(NOIR,NOIR)),VRAI); EGAL(ITb1(bord,INDX(NOIR,NOIR)),FAUX); /* Initialisation du remplisseur de contour. */ CALS(FgERASE()); /* Clear... */ SET_COULEURS(NOIR,BLANC); SET_ANTI_ALIASING(FAUX); SK(4); /* Definition de l'echelle globale. */ SX(8); /* Definition de l'echelle sur l'axe des 'X'. */ SY(8); /* Definition de l'echelle sur l'axe des 'Y'. */ SZ(8); /* Definition de l'echelle sur l'axe des 'Z'. */ gA;DO(1,BLOC(g1;));gA; gA;DO(1,BLOC(g2;));gA; /* Positionnement au point de reference du sigle. */ SK(2); /* Definition de l'echelle globale. */ SX(8); /* Definition de l'echelle sur l'axe des 'X'. */ SY(8); /* Definition de l'echelle sur l'axe des 'Y'. */ SZ(8); /* Definition de l'echelle sur l'axe des 'Z'. */ WCG(vecteurs_____Gcon_00); /* Point de reference general... */ SET_COULEURS(NOIR,NIVEAU_DU_CONTOURS_DU_SIGLE); /* Choix de la couleur du contour du sigle. */ EGAL(niveau_origine,NIVEAU_DU_CONTOURS_DU_SIGLE); EGAL(niveau_extremite,NIVEAU_DU_CONTOURS_DU_SIGLE); /* Niveaux origine et extremite du trace d'un arc de cubique... */ SET_ORIGINE(PENTE_DES_ARCS,PENTE_DES_ARCS); gA;DO(GRANDE_DIMENSION,BLOC(g1;g2;));gA; SET_EXTREMITE(PENTE_DES_ARCS,PENTE_DES_ARCS); gA;DO(MOYENNE_DIMENSION,BLOC(g1;));gA; gA;DO(PETITE_DIMENSION,BLOC(g2;));gA; SET_EXTREMITE(PENTE_DES_ARCS,FZERO); gA;DO(MOYENNE_DIMENSION,BLOC(g1;g4;));gA; SET_EXTREMITE(FZERO,NEGA(PENTE_DES_ARCS)); gA;DO(MOYENNE_DIMENSION,BLOC(g3;g4;));gA; SET_EXTREMITE(NEGA(PENTE_DES_ARCS),FZERO); gA;DO(MOYENNE_DIMENSION,BLOC(g3;g2;));gA; SET_EXTREMITE(FZERO,PENTE_DES_ARCS); gA;DO(GRANDE_DIMENSION,BLOC(g2;));gA; SET_EXTREMITE(FZERO,PENTE_DES_ARCS); gA;DO(PETITE_DIMENSION,BLOC(g3;g2;));gA; SET_EXTREMITE(NEGA(PENTE_DES_ARCS),FZERO); gA;DO(PETITE_DIMENSION,BLOC(g3;g4;));gA; SET_EXTREMITE(FZERO,NEGA(PENTE_DES_ARCS)); gA;DO(PETITE_DIMENSION,BLOC(g1;));gA; gA;DO(TRES_PETITE_DIMENSION,BLOC(g4;));gA; SET_EXTREMITE(PENTE_DES_ARCS,FZERO); CALS(Imove(ImageR,ImageG)); CALi(Iupdate_image(nom_imageR,ImageR)); RETU_Commande; Eblock ECommande