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