/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S S E R P E N T S R E L A T I V E M E N T R E C T I L I G N E S */ /* A V E C C O L L I S I O N S E V E N T U E L L E S E N T R E - E U X : */ /* */ /* */ /* : oo oooo : */ /* : oo + ... */ /* o oo o +++ oo ++ :: ... */ /* o oo ........... + ++ + .. */ /* o : oo :: ........ + oo ........ o +++.. */ /* o: o ..... ++ ::: + ...o. o...++++ */ /* o .o. --......:: ++++oo o o .... ... */ /* : o ... o ..: ..++ o +oo ...... o */ /* : o ... ::::.o ++ o +oo ... o */ /* : o.::: .. oo o ooo ...oo. */ /* : ::..:o ...+ o o o++ o .o. + ... */ /* ::::: .. o .. o+ o+o oo.. + ... */ /* : .. +o.. + o o+ o ooo ... ... */ /* :.. + o + o o+ o o ... + .. */ /* ... + +oo + ooo o ... + ... */ /* ... + + o + oo oo ... + .. */ /* ..- +o oo + o.o. + ... */ /* .. - o+o + o ... o o ... */ /* +... + + o + ... o ... */ /* + .. - + + o ..o o o .. */ /* .. - ++ + o ...o o oo */ /* .. - ++ + + .o. o o */ /* .. ++ .. o o o */ /* .. ++ - + ... o o o */ /* + .. - + .. o oo */ /* .. - +... oo : */ /* .. - .. .... oo : */ /* .. -.. .... o : */ /* .. .-..... + : -- */ /* ..... ...... + - */ /* ...... o- + */ /* ooo */ /* */ /* */ /* Author of '$xrk/serpents.02$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1989??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 maths_fonct_COURBES_1_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define GRAINE 1789 \ /* Graine initiale du generateur aleatoire. */ #define PAS_DE_LA_GRAINE \ PARE(17) \ /* Afin de faire evoluer eventuellement (s'il est different de 0) la GRAINE... */ #define XB_min SOUS(Xmin,FRA8(dimX)) \ /* Pour definir l'espace tri-dimensionnel dans lequel doivent rester les points aleatoires. */ #define XB_max ADD2(Xmax,FRA8(dimX)) \ /* Pour definir l'espace tri-dimensionnel dans lequel doivent rester les points aleatoires. */ #define YB_min SOUS(Ymin,FRA8(dimY)) \ /* Pour definir l'espace tri-dimensionnel dans lequel doivent rester les points aleatoires. */ #define YB_max ADD2(Ymax,FRA8(dimY)) \ /* Pour definir l'espace tri-dimensionnel dans lequel doivent rester les points aleatoires. */ #define ZB_min COZA(NIVR(NIVEAU_ORIGINE)) \ /* Pour definir l'espace tri-dimensionnel dans lequel doivent rester les points aleatoires. */ #define ZB_max COZA(NIVR(NIVEAU_EXTREMITE)) \ /* Pour definir l'espace tri-dimensionnel dans lequel doivent rester les points aleatoires. */ #define SPHERE_X NEUT(dimX) \ /* Pour definir la distance maximale (P1,P2). */ #define SPHERE_Y NEUT(dimY) \ /* Pour definir la distance maximale (P1,P2). */ #define SPHERE_Z NEUT(COULEURS) \ /* Pour definir la distance maximale (P1,P2). */ #define M_DELTA_X FRA2(SPHERE_X) \ /* "Ouverture" arriere du cone de generation des points aleatoires 'P3' et 'P4' ; plus */ \ /* cette valeur est proche de 0 (apres '_____lNORMALISE_OX'), moins le retour en arriere */ \ /* est possible... */ #define M_DELTA_Y FRA2(SPHERE_Y) \ /* "Ouverture" arriere du cone de generation des points aleatoires 'P3' et 'P4' ; plus */ \ /* cette valeur est proche de 0 (apres '_____lNORMALISE_OY'), moins le retour en arriere */ \ /* est possible... */ #define M_DELTA_Z FRA2(SPHERE_Z) \ /* "Ouverture" arriere du cone de generation des points aleatoires 'P3' et 'P4' ; plus */ \ /* cette valeur est proche de 0 (apres '_____lNORMALISE_OZ'), moins le retour en arriere */ \ /* est possible... */ #define P_DELTA_X FZERO \ /* "Ouverture" avant du cone de generation des points aleatoires 'P3' et 'P4' ; plus */ \ /* cette valeur est proche de 1 (apres '_____lNORMALISE_OX'), plus l'eloignement en avant */ \ /* est rapide... */ #define P_DELTA_Y FZERO \ /* "Ouverture" avant du cone de generation des points aleatoires 'P3' et 'P4' ; plus */ \ /* cette valeur est proche de 1 (apres '_____lNORMALISE_OY'), plus l'eloignement en avant */ \ /* est rapide... */ #define P_DELTA_Z FZERO \ /* "Ouverture" avant du cone de generation des points aleatoires 'P3' et 'P4' ; plus */ \ /* cette valeur est proche de 1 (apres '_____lNORMALISE_OZ'), plus l'eloignement en avant */ \ /* est rapide... */ #define NIVEAU_ORIGINE \ NOIR_PLANCHER_1 \ /* Niveau origine du trace (correspond grossierement au 'Z' ; je dit "grossierement" car */ \ /* en effet pour les niveaux, l'interpolation est lineaire et non pas cubique puisqu'on */ \ /* ne connait pas les derivees). */ #define NIVEAU_EXTREMITE \ BLANC \ /* Niveau origine du trace (correspond grossierement au 'Z' ; je dit "grossierement" car */ \ /* en effet pour les niveaux, l'interpolation est lineaire et non pas cubique puisqu'on */ \ /* ne connait pas les derivees). */ #define AFFAIBLISSEMENT_AU_BORD \ FU \ /* Afin de faire un degrade du centre vers le bord... */ #define NOMBRE_D_ARCS_F1 \ QUATRE \ /* Nombre d'arcs pour la famille 'F1'. */ #define NOMBRE_DE_POINTS_F1 \ HUIT \ /* Nombre de points definissant le multi-arc de cubique (il y a un arc de moins que */ \ /* de points) de la famille 'F1'. */ #define RAYON_DU_POINT_F1 \ DOUZE \ /* Rayon du point representatif de la famille 'F1'. */ #define COULEURS_F1 \ L_SUBSTITUTION_11 \ /* Liste de substitution de trace de la famille 'F1'. */ #define NOMBRE_D_ARCS_F2 \ NEUT(NOMBRE_D_ARCS_F1) \ /* Nombre d'arcs pour la famille 'F2'. */ #define NOMBRE_DE_POINTS_F2 \ NOMBRE_DE_POINTS_F1 \ /* Nombre de points definissant le multi-arc de cubique (il y a un arc de moins que */ \ /* de points) de la famille 'F2'. */ #define RAYON_DU_POINT_F2 \ TIER(RAYON_DU_POINT_F1) \ /* Rayon du point representatif de la famille 'F2'. */ #define COULEURS_F2 \ L_SUBSTITUTION_12 \ /* Liste de substitution de trace de la famille 'F2'. */ #define NOMBRE_D_ARCS_F3 \ DOUB(NOMBRE_D_ARCS_F1) \ /* Nombre d'arcs pour la famille 'F3'. */ #define NOMBRE_DE_POINTS_F3 \ NOMBRE_DE_POINTS_F1 \ /* Nombre de points definissant le multi-arc de cubique (il y a un arc de moins que */ \ /* de points) de la famille 'F3'. */ #define RAYON_DU_POINT_F3 \ TIER(RAYON_DU_POINT_F1) \ /* Rayon du point representatif de la famille 'F3'. */ #define COULEURS_F3 \ L_SUBSTITUTION_13 \ /* Liste de substitution de trace de la famille 'F3'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define GENERE_COORDONNEE_ALEATOIRE(coordonnee,borne_inferieure,borne_superieure,_____cNORMALISE_OXYZ,V_min,V_max) \ Bblock \ DEFV(Int,INIT(inferieur,borne_inferieure)); \ DEFV(Int,INIT(superieur,borne_superieure)); \ DEFV(Int,INIT(amplitude,UNDEF)); \ /* Ces variables intermediaires sont uniquement creees afin d'accelerer la compilation... */ \ EGAL(amplitude,LENG(inferieur,superieur)); \ /* Le 'LENG' n'est pas fait dans 'INIT' afin d'accelerer la compilation... */ \ EGAL(inferieur,TRON(inferieur,V_min,V_max)); \ EGAL(superieur,TRON(superieur,V_min,V_max)); \ /* Le 'TRON' n'est pas fait dans 'INIT' afin d'accelerer la compilation... */ \ Test(IFET(IFEQ(inferieur,V_min),IFEQ(superieur,V_min))) \ Bblock \ EGAL(inferieur,V_min); \ EGAL(superieur,ADD2(V_min,amplitude)); \ /* Reinitialisation arbitraire lorsque les deux bornes sont egales... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Test(IFET(IFEQ(inferieur,V_max),IFEQ(superieur,V_max))) \ Bblock \ EGAL(inferieur,SOUS(V_max,amplitude)); \ EGAL(superieur,V_max); \ /* Reinitialisation arbitraire lorsque les deux bornes sont egales... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ CALS(rdnI2D(ADRESSE(pointI_spirale) \ ,UNDEF \ ,RDN_INIT \ ,FLOT(inferieur) \ ,FLOT(superieur) \ ) \ ); \ /* Initialisation du generateur aleatoire. */ \ EGAL(coordonnee \ ,_____cNORMALISE_OXYZ(INTE(rdnI2D(ADRESSE(pointI_spirale) \ ,graine \ ,RDN_GENERE \ ,FLOT__ARGUMENT_ABSENT,FLOT__ARGUMENT_ABSENT \ ) \ ) \ ) \ ); \ SPIRALE_DEPLACEMENT(ASD1(pointI_spirale,x),ASD1(pointI_spirale,y)); \ /* Deplacement du point courant de la spirale... */ \ SPIRALE_PARCOURS; \ /* Parcours de la spirale avec rotation eventuelle de PI/2 du bras courant... */ \ INCR(graine,pas_de_la_graine); \ /* Et enfin, modification eventuelle de la graine du generateur aleatoire... */ \ Eblock \ /* Generation d'une coordonnee aleatoire avec restriction a la boite [V_min,V_max]. */ #define GENERE_POINT_ALEATOIRE(point,X_min,X_max,Y_min,Y_max,Z_min,Z_max,VX_min,VX_max,VY_min,VY_max,VZ_min,VZ_max) \ Bblock \ GENERE_COORDONNEE_ALEATOIRE(ASD1(point,x),X_min,X_max,_____cNORMALISE_OX,VX_min,VX_max); \ GENERE_COORDONNEE_ALEATOIRE(ASD1(point,y),Y_min,Y_max,_____cNORMALISE_OY,VY_min,VY_max); \ GENERE_COORDONNEE_ALEATOIRE(ASD1(point,z),Z_min,Z_max,_____cNORMALISE_OZ,VZ_min,VZ_max); \ Eblock \ /* Generation d'un point aleatoire avec restriction a la boite [VXYZ_min,VXYZ_max]. */ #define GENERE_VECTEUR_ALEATOIRE(origine,extremite) \ Bblock \ DEFV(deltaI_3D,vecteur_aleatoire_courant); \ /* Donne en permanence le vecteur aleatoire de type (P1,P2) ou (P2,P3). */ \ INITIALISATION_ACCROISSEMENT_3D(vecteur_aleatoire_courant \ ,SOUS(_cDENORMALISE_OX(ASD1(extremite,x)),_cDENORMALISE_OX(ASD1(origine,x))) \ ,SOUS(_cDENORMALISE_OY(ASD1(extremite,y)),_cDENORMALISE_OY(ASD1(origine,y))) \ ,SOUS(_cDENORMALISE_OZ(ASD1(extremite,z)),_cDENORMALISE_OZ(ASD1(origine,z))) \ ); \ EGAL(rayon_courant,RACX(FLOT(pytI3D(vecteur_aleatoire_courant)))); \ Test(IZEQ(rayon_courant)) \ Bblock \ PRINT_ERREUR("le rayon courant est nul, il va y avoir des divisions par 0"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Calcul du vecteur aleatoire (P1,P2) ou (P2,P3), et son module. */ #define SET_P1(X0,Y0,Z0) \ Bblock \ INITIALISATION_POINT_3D(pointF_P1,_____cNORMALISE_OX(X0),_____cNORMALISE_OY(Y0),_____cNORMALISE_OZ(Z0)); \ Eblock \ /* Definition du point P1. */ #define SET_P2(X0,Y0,Z0) \ Bblock \ INITIALISATION_POINT_3D(pointF_P2,_____cNORMALISE_OX(X0),_____cNORMALISE_OY(Y0),_____cNORMALISE_OZ(Z0)); \ Eblock \ /* Definition du point P2. */ #define SET_P3(X0,Y0,Z0) \ Bblock \ INITIALISATION_POINT_3D(pointF_P3,_____cNORMALISE_OX(X0),_____cNORMALISE_OY(Y0),_____cNORMALISE_OZ(Z0)); \ Eblock \ /* Definition du point P3. */ #define SET_P4(X0,Y0,Z0) \ Bblock \ INITIALISATION_POINT_3D(pointF_P4,_____cNORMALISE_OX(X0),_____cNORMALISE_OY(Y0),_____cNORMALISE_OZ(Z0)); \ Eblock \ /* Definition du point P4. */ #define MOVE_POINTS \ Bblock \ SET_P1(_cDENORMALISE_OX(ASD1(pointF_P2,x)) \ ,_cDENORMALISE_OY(ASD1(pointF_P2,y)) \ ,_cDENORMALISE_OZ(ASD1(pointF_P2,z)) \ ); \ SET_P2(_cDENORMALISE_OX(ASD1(pointF_P3,x)) \ ,_cDENORMALISE_OY(ASD1(pointF_P3,y)) \ ,_cDENORMALISE_OZ(ASD1(pointF_P3,z)) \ ); \ SET_P3(_cDENORMALISE_OX(ASD1(pointF_P4,x)) \ ,_cDENORMALISE_OY(ASD1(pointF_P4,y)) \ ,_cDENORMALISE_OZ(ASD1(pointF_P4,z)) \ ); \ Eblock \ /* Decalage des points (P1,P2,P3,P4) --> (P2,P3,P4,P4). */ #define DRAW_CUBIQUE_4(rayon_du_point) \ Bblock \ CALS(Ivisualisation_arc_de_cubique_4P(ImageR \ ,ADRESSE(pointF_P1) \ ,ADRESSE(pointF_P2) \ ,NIVA(COZR(_cDENORMALISE_OZ(ASD1(pointF_P2,z)))) \ ,ADRESSE(pointF_P3) \ ,NIVA(COZR(_cDENORMALISE_OZ(ASD1(pointF_P3,z)))) \ ,ADRESSE(pointF_P4) \ ,CHOI(_____lNORMALISE_OX(rayon_du_point) \ ,_____lNORMALISE_OY(rayon_du_point) \ ) \ ,affaiblissement_au_bord \ ,TRI_DIMENSIONNEL \ ) \ ); \ Eblock \ /* Trace de l'arc de cubique... */ #define GENERE_UNE_FAMILLE_DE_SERPENTS(nombre_d_arcs,nombre_de_points,couleurs,rayon_du_point) \ Bblock \ DEFV(pointF_3D,pointF_P1); \ DEFV(pointF_3D,pointF_P2); \ DEFV(pointF_3D,pointF_P3); \ DEFV(pointF_3D,pointF_P4); \ /* Definition des quatre points definissant l'arc de cubique. */ \ DEFV(Float,INIT(rayon_courant,FLOT__UNDEF)); \ /* Module du vecteur aleatoire (P1,P2) ou (P2,P3). */ \ SUBSTITUTION(couleurs); \ Komp(numero_de_l_arc,nombre_d_arcs) \ Bblock \ Komp(numero_du_point,SUCC(SUCC(nombre_de_points))) \ Bblock \ SPIRALE_INITIALISATION; \ /* Initialisation dynamique de 'spirale_nombre_de_points_a_traiter'. */ \ Choi(numero_du_point) \ Bblock \ Ca1e(UN) \ Bblock \ GENERE_POINT_ALEATOIRE(pointF_P1 \ ,XB_min,XB_max \ ,YB_min,YB_max \ ,ZB_min,ZB_min \ ,XB_min,XB_max \ ,YB_min,YB_max \ ,ZB_min,ZB_min \ ); \ /* Initialisation du point 'P1' (tout a fait aleatoire mais dans le carre */ \ /* [XB_min,XB_max]x[YB_min,YB_max] et sur le plan du "fond" 'ZB_min'). */ \ Eblock \ ECa1 \ \ Ca1e(DEUX) \ Bblock \ GENERE_POINT_ALEATOIRE(pointF_P2 \ ,SOUS(_cDENORMALISE_OX(ASD1(pointF_P1,x)),_lDENORMALISE_OX(sphere_X)) \ ,ADD2(_cDENORMALISE_OX(ASD1(pointF_P1,x)),_lDENORMALISE_OX(sphere_X)) \ ,SOUS(_cDENORMALISE_OY(ASD1(pointF_P1,y)),_lDENORMALISE_OY(sphere_Y)) \ ,ADD2(_cDENORMALISE_OY(ASD1(pointF_P1,y)),_lDENORMALISE_OY(sphere_Y)) \ ,SOUS(_cDENORMALISE_OZ(ASD1(pointF_P1,z)),_lDENORMALISE_OZ(sphere_Z)) \ ,ADD2(_cDENORMALISE_OZ(ASD1(pointF_P1,z)),_lDENORMALISE_OZ(sphere_Z)) \ ,XB_min,XB_max \ ,YB_min,YB_max \ ,ZB_min,ZB_max \ ); \ /* Initialisation du point 'P2' (a l'interieur d'une sphere centree sur P1). */ \ Eblock \ ECa1 \ \ Ca1e(TROIS) \ Bblock \ GENERE_VECTEUR_ALEATOIRE(pointF_P1,pointF_P2); \ GENERE_POINT_ALEATOIRE(pointF_P3 \ ,COXA(SOUS(BARY(COXR(_cDENORMALISE_OX(ASD1(pointF_P2,x))) \ ,COXR(_cDENORMALISE_OX(ASD1(pointF_P1,x))) \ ,NEGA(DIVI(_lDENORMALISE_OX(sphere_X),rayon_courant)) \ ) \ ,_lDENORMALISE_OX(M_delta_X) \ ) \ ) \ ,NEUT(ADD2(BARY(COXR(_cDENORMALISE_OX(ASD1(pointF_P2,x))) \ ,COXR(_cDENORMALISE_OX(ASD1(pointF_P1,x))) \ ,NEGA(DIVI(_lDENORMALISE_OX(sphere_X),rayon_courant)) \ ) \ ,_lDENORMALISE_OX(P_delta_X) \ ) \ ) \ ,COYA(SOUS(BARY(COYR(_cDENORMALISE_OY(ASD1(pointF_P2,y))) \ ,COYR(_cDENORMALISE_OY(ASD1(pointF_P1,y))) \ ,NEGA(DIVI(_lDENORMALISE_OY(sphere_Y),rayon_courant)) \ ) \ ,_lDENORMALISE_OY(M_delta_Y) \ ) \ ) \ ,NEUT(ADD2(BARY(COYR(_cDENORMALISE_OY(ASD1(pointF_P2,y))) \ ,COYR(_cDENORMALISE_OY(ASD1(pointF_P1,y))) \ ,NEGA(DIVI(_lDENORMALISE_OY(sphere_Y),rayon_courant)) \ ) \ ,_lDENORMALISE_OY(P_delta_Y) \ ) \ ) \ ,COZA(SOUS(BARY(COZR(_cDENORMALISE_OZ(ASD1(pointF_P2,z))) \ ,COZR(_cDENORMALISE_OZ(ASD1(pointF_P1,z))) \ ,NEGA(DIVI(_lDENORMALISE_OZ(sphere_Z),rayon_courant)) \ ) \ ,_lDENORMALISE_OZ(M_delta_Z) \ ) \ ) \ ,NEUT(ADD2(BARY(COZR(_cDENORMALISE_OZ(ASD1(pointF_P2,z))) \ ,COZR(_cDENORMALISE_OZ(ASD1(pointF_P1,z))) \ ,NEGA(DIVI(_lDENORMALISE_OZ(sphere_Z),rayon_courant)) \ ) \ ,_lDENORMALISE_OZ(P_delta_Z) \ ) \ ) \ ,XB_min,XB_max \ ,YB_min,YB_max \ ,ZB_min,ZB_max \ ); \ /* Initialisation du point 'P3' (dans la direction P1 --> P2, on definit un point PP3 */ \ /* a distance 'sphere_XYZ' de 'P2' ; autour de 'PP3', on construit une sphere a l'interieur */ \ /* de laquelle on choisit aleatoirement le point 'P3'). */ \ Eblock \ ECa1 \ \ Defo \ Bblock \ GENERE_VECTEUR_ALEATOIRE(pointF_P2,pointF_P3); \ GENERE_POINT_ALEATOIRE(pointF_P4 \ ,COXA(SOUS(BARY(COXR(_cDENORMALISE_OX(ASD1(pointF_P3,x))) \ ,COXR(_cDENORMALISE_OX(ASD1(pointF_P2,x))) \ ,NEGA(DIVI(_lDENORMALISE_OX(sphere_X),rayon_courant)) \ ) \ ,_lDENORMALISE_OX(M_delta_X) \ ) \ ) \ ,NEUT(ADD2(BARY(COXR(_cDENORMALISE_OX(ASD1(pointF_P3,x))) \ ,COXR(_cDENORMALISE_OX(ASD1(pointF_P2,x))) \ ,NEGA(DIVI(_lDENORMALISE_OX(sphere_X),rayon_courant)) \ ) \ ,_lDENORMALISE_OX(P_delta_X) \ ) \ ) \ ,COYA(SOUS(BARY(COYR(_cDENORMALISE_OY(ASD1(pointF_P3,y))) \ ,COYR(_cDENORMALISE_OY(ASD1(pointF_P2,y))) \ ,NEGA(DIVI(_lDENORMALISE_OY(sphere_Y),rayon_courant)) \ ) \ ,_lDENORMALISE_OY(M_delta_Y) \ ) \ ) \ ,NEUT(ADD2(BARY(COYR(_cDENORMALISE_OY(ASD1(pointF_P3,y))) \ ,COYR(_cDENORMALISE_OY(ASD1(pointF_P2,y))) \ ,NEGA(DIVI(_lDENORMALISE_OY(sphere_Y),rayon_courant)) \ ) \ ,_lDENORMALISE_OY(P_delta_Y) \ ) \ ) \ ,COZA(SOUS(BARY(COZR(_cDENORMALISE_OZ(ASD1(pointF_P3,z))) \ ,COZR(_cDENORMALISE_OZ(ASD1(pointF_P2,z))) \ ,NEGA(DIVI(_lDENORMALISE_OZ(sphere_Z),rayon_courant)) \ ) \ ,_lDENORMALISE_OZ(M_delta_Z) \ ) \ ) \ ,NEUT(ADD2(BARY(COZR(_cDENORMALISE_OZ(ASD1(pointF_P3,z))) \ ,COZR(_cDENORMALISE_OZ(ASD1(pointF_P2,z))) \ ,NEGA(DIVI(_lDENORMALISE_OZ(sphere_Z),rayon_courant)) \ ) \ ,_lDENORMALISE_OZ(P_delta_Z) \ ) \ ) \ ,XB_min,XB_max \ ,YB_min,YB_max \ ,ZB_min,ZB_max \ ); \ /* Initialisation du point 'P4' (dans la direction P2 --> P3, on definit un point PP4 */ \ /* a distance 'sphere_XYZ' de 'P3' ; autour de 'PP4', on construit une sphere a l'interieur */ \ /* de laquelle on choisit aleatoirement le point 'P4'). */ \ DRAW_CUBIQUE_4(rayon_du_point) \ /* Trace de l'arc de cubique (P2,P3) a l'aide des points (P1,P2,P3,P4). */ \ MOVE_POINTS; \ /* Et "rotation" des points : (P1,P2,P3,P4) --> (P2,P3,P4,P4). */ \ Eblock \ EDef \ Eblock \ ECho \ Eblock \ EKom \ Eblock \ EKom \ Eblock \ /* Generation d'une famille de serpents... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S S E R P E N T S R E L A T I V E M E N T R E C T I L I G N E S : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); DEFV(Int,INIT(graine,GRAINE)); /* Graine variable de generation des nombres aleatoires, */ DEFV(Int,INIT(pas_de_la_graine,PAS_DE_LA_GRAINE)); /* Et son pas de variation eventuel... */ DEFV(Float,INIT(sphere_X,FLOT__UNDEF)); DEFV(Float,INIT(sphere_Y,FLOT__UNDEF)); DEFV(Float,INIT(sphere_Z,FLOT__UNDEF)); /* Definition de la sphere de proximite (P1,P2), (P2,P3) et (P3,P4). */ DEFV(Float,INIT(M_delta_X,FLOT__UNDEF)); DEFV(Float,INIT(M_delta_Y,FLOT__UNDEF)); DEFV(Float,INIT(M_delta_Z,FLOT__UNDEF)); /* "Ouverture" arriere du cone de generation des points aleatoires 'P3' et 'P4' ; plus */ /* cette valeur est proche de 0, moins le retour en arriere est possible... */ DEFV(Float,INIT(P_delta_X,FLOT__UNDEF)); DEFV(Float,INIT(P_delta_Y,FLOT__UNDEF)); DEFV(Float,INIT(P_delta_Z,FLOT__UNDEF)); /* "Ouverture" avant du cone de generation des points aleatoires 'P3' et 'P4' ; plus */ /* cette valeur est proche de 1, plus l'eloignement en avant est rapide... */ DEFV(pointI_2D,pointI_spirale); /* Point d'un espace en spirale destinee a generer des nombres aleatoires. */ SPIRALE_DEFINITION /* Donnees de generation d'une spirale de parcours d'une image. */ DEFV(Float,INIT(affaiblissement_au_bord,AFFAIBLISSEMENT_AU_BORD)); /* Afin de faire le degrade du centre vers le bord pour les disques. */ DEFV(Positive,INIT(nombre_d_arcs_F1,NOMBRE_D_ARCS_F1)); DEFV(Positive,INIT(nombre_de_points_F1,NOMBRE_DE_POINTS_F1)); DEFV(genere_p,INIT(couleurs_F1,COULEURS_F1)); DEFV(Positive,INIT(rayon_du_point_F1,RAYON_DU_POINT_F1)); /* Parametres de definition de la famille 'F1'. */ DEFV(Positive,INIT(nombre_d_arcs_F2,NOMBRE_D_ARCS_F2)); DEFV(Positive,INIT(nombre_de_points_F2,NOMBRE_DE_POINTS_F2)); DEFV(genere_p,INIT(couleurs_F2,COULEURS_F2)); DEFV(Positive,INIT(rayon_du_point_F2,RAYON_DU_POINT_F2)); /* Parametres de definition de la famille 'F2'. */ DEFV(Positive,INIT(nombre_d_arcs_F3,NOMBRE_D_ARCS_F3)); DEFV(Positive,INIT(nombre_de_points_F3,NOMBRE_DE_POINTS_F3)); DEFV(genere_p,INIT(couleurs_F3,COULEURS_F3)); DEFV(Positive,INIT(rayon_du_point_F3,RAYON_DU_POINT_F3)); /* Parametres de definition de la famille 'F3'. */ /*..............................................................................................................................*/ GET_ARGUMENTSv(nombre_d_arguments ,BLOC(GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_I("graine=""g=",graine); GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation); GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation); GET_ARGUMENT_I("pg=""pas=",pas_de_la_graine); GIT_ARGUMENT_F("sx=""sX=",sphere_X,_____lNORMALISE_OX(I_lHOMOTHETIE_Std_OX(SPHERE_X))); GIT_ARGUMENT_F("sy=""sY=",sphere_Y,_____lNORMALISE_OY(I_lHOMOTHETIE_Std_OY(SPHERE_Y))); GIT_ARGUMENT_F("sz=""sZ=",sphere_Z,_____lNORMALISE_OZ(I_lHOMOTHETIE_Std_OZ(SPHERE_Z))); GIT_ARGUMENT_F("Mx=""MX=",M_delta_X,_____lNORMALISE_OX(I_lHOMOTHETIE_Std_OX(M_DELTA_X))); GIT_ARGUMENT_F("My=""MY=",M_delta_Y,_____lNORMALISE_OY(I_lHOMOTHETIE_Std_OY(M_DELTA_Y))); GIT_ARGUMENT_F("Mz=""MZ=",M_delta_Z,_____lNORMALISE_OZ(I_lHOMOTHETIE_Std_OZ(M_DELTA_Z))); GIT_ARGUMENT_F("Px=""PX=",P_delta_X,_____lNORMALISE_OX(I_lHOMOTHETIE_Std_OX(P_DELTA_X))); GIT_ARGUMENT_F("Py=""PY=",P_delta_Y,_____lNORMALISE_OY(I_lHOMOTHETIE_Std_OY(P_DELTA_Y))); GIT_ARGUMENT_F("Pz=""PZ=",P_delta_Z,_____lNORMALISE_OZ(I_lHOMOTHETIE_Std_OZ(P_DELTA_Z))); /* Le 20120210211915, les 'I_lHOMOTHETIE_Std_O?(...)'s furent introduits... */ GET_ARGUMENT_F("affaiblissement=",affaiblissement_au_bord); GET_ARGUMENT_I("a1=",nombre_d_arcs_F1); GET_ARGUMENT_I("p1=",nombre_de_points_F1); GET_ARGUMENT_P("c1=",couleurs_F1); GET_ARGUMENT_I("r1=",rayon_du_point_F1); GET_ARGUMENT_I("a2=",nombre_d_arcs_F2); GET_ARGUMENT_I("p2=",nombre_de_points_F2); GET_ARGUMENT_P("c2=",couleurs_F2); GET_ARGUMENT_I("r2=",rayon_du_point_F2); GET_ARGUMENT_I("a3=",nombre_d_arcs_F3); GET_ARGUMENT_I("p3=",nombre_de_points_F3); GET_ARGUMENT_P("c3=",couleurs_F3); GET_ARGUMENT_I("r3=",rayon_du_point_F3); ) ); CALi(Inoir(ImageR)); /* R : futur resultat. */ SPIRALE_VALIDATION; /* Validation des pas de parcours (pasX,pasY) des images. */ INITIALISATION_POINT_2D(pointI_spirale,Xcentre,Ycentre); /* Initialisation de la spirale. */ SET_FILTRAGE(ACTIF); GENERE_UNE_FAMILLE_DE_SERPENTS(nombre_d_arcs_F1,nombre_de_points_F1,couleurs_F1,rayon_du_point_F1); GENERE_UNE_FAMILLE_DE_SERPENTS(nombre_d_arcs_F2,nombre_de_points_F2,couleurs_F2,rayon_du_point_F2); GENERE_UNE_FAMILLE_DE_SERPENTS(nombre_d_arcs_F3,nombre_de_points_F3,couleurs_F3,rayon_du_point_F3); /* Le 20061211112840 le cinquieme argument ",FAUX" de 'GENERE_UNE_FAMILLE_DE_SERPENTS(...)' */ /* a ete supprime car, en effet, il ne correspond a rien... */ CALi(Iupdate_image(nom_imageR,ImageR)); RETU_Commande; Eblock ECommande