/*************************************************************************************************************************************/ /* */ /* T R A N S F O R M A T I O N D ' U N E I M A G E P A R L ' A T T R A C T E U R D E L O R E N Z : */ /* */ /* */ /* Author of '$xrk/lorenz.21$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1996??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_IMAGESF_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E B A S E E T U N I V E R S E L L E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.11.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 3 */ /* D E F I N I T I O N D E L ' E S P A C E P H Y S I Q U E D A N S R ( D E B U T ) : */ /* */ /* */ /* Nota : */ /* */ /* Les extrema des coordonnees {x,y,z} */ /* ainsi que ceux de leurs differentielles */ /* {dx,dy,dz} sont fixees un peu arbitrairement */ /* et sans etre parametrees. Elles ont ete */ /* obtenues a l'aide du programme 'v $xtc/lorenz.01$c'. */ /* */ /* */ /*************************************************************************************************************************************/ #define hXmin_ESPACE \ PARE(-30.0) #define hYmin_ESPACE \ PARE(-30.0) #define hZmin_ESPACE \ PARE(0.0) /* Definition du "coin" inferieur-gauche-arriere de l'espace physique. */ #define hXmax_ESPACE \ PARE(30.0) #define hYmax_ESPACE \ PARE(30.0) #define hZmax_ESPACE \ PARE(60.0) /* Definition du "coin" superieur-droite-avant de l'espace physique. */ /* */ /* ATTENTION, il y a eu pendant longtemps : */ /* */ /* #define hZmax_ESPACE \ */ /* 55.0 */ /* */ /* mais etant donne qu'il est plus intelligent de travailler avec un espace cubique (a cause */ /* des rotations tridimensionnelles en particulier), j'ai remplace (le 1993061400) '55' par */ /* '60' qui correspond a '30-(-30)' (voir 'X' et 'Y'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 3 */ /* D E F I N I T I O N D E L ' E S P A C E P H Y S I Q U E D A N S R ( D E B U T ) : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.12.I" #define dXmin_ESPACE \ PARE(-2.4) #define dYmin_ESPACE \ PARE(-5.5) #define dZmin_ESPACE \ PARE(-2.8) /* Definition des minima des differentielles {dx,dy,dz}. */ #define dXmax_ESPACE \ PARE(1.8) #define dYmax_ESPACE \ PARE(3.8) #define dZmax_ESPACE \ PARE(4.8) /* Definition des maxima des differentielles {dx,dy,dz}. */ #include xrk/attractor.1D.I" /* Formules de renormalisation des differentielles dans [0,1] ; elles sont utilisees lorsque */ /* la production d'images en couleurs est demandee (voir 'visualiser_en_RVB'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S D I F F E R E N T S E S P A C E S E T D E L ' E F F E T D E B R U M E : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.13.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #include xrv/champs_5.14.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S G E N E R A L E S R E L A T I V E S A L A V I S U A L I S A T I O N : */ /* */ /*************************************************************************************************************************************/ #include xrk/lorenz.11.I" #include xrk/attractor.14.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' A T T R A C T E U R D E L O R E N Z : */ /* */ /* */ /* Definition : */ /* */ /* Il est classiquement defini par */ /* le systeme d'equations differentielles : */ /* */ /* dx */ /* ---- = -10.x + 10.y */ /* dt */ /* */ /* dy */ /* ---- = 28.x - y - x.z */ /* dt */ /* */ /* dz 8 */ /* ---- = - ---.z + x.y */ /* dt 3 */ /* */ /* ce que l'on peut generaliser en : */ /* */ /* dx */ /* ---- = (X .x + X .y + X .z) + (X .x.y + X .y.z + X .z.x) + (X .x.y.z) = F (x,y,z) */ /* dt x y z xy yz zx xyz x */ /* */ /* dy */ /* ---- = (Y .x + Y .y + Y .z) + (Y .x.y + Y .y.z + Y .z.x) + (Y .x.y.z) = F (x,y,z) */ /* dt x y z xy yz zx xyz y */ /* */ /* dz */ /* ---- = (Z .x + Z .y + Z .z) + (Z .x.y + Z .y.z + Z .z.x) + (Z .x.y.z) = F (x,y,z) */ /* dt x y z xy yz zx xyz z */ /* */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U P A S S A G E D E L ' I M A G E A L ' E S P A C E D E S P H A S E S : */ /* */ /*************************************************************************************************************************************/ #define COEFFICIENT_Xi_Xl \ FU #define COEFFICIENT_Yi_Xl \ FZERO #define COEFFICIENT_Ni_Xl \ FZERO #define TRANSLATION_i_Xl \ FZERO DEFV(Local,DEFV(Float,INIT(coefficient_Xi_Xl,COEFFICIENT_Xi_Xl))); DEFV(Local,DEFV(Float,INIT(coefficient_Yi_Xl,COEFFICIENT_Yi_Xl))); DEFV(Local,DEFV(Float,INIT(coefficient_Ni_Xl,COEFFICIENT_Ni_Xl))); DEFV(Local,DEFV(Float,INIT(translation_i_Xl,TRANSLATION_i_Xl))); /* Passage de l'image a la coordonnee 'X' de l'espace des phases. */ #define COEFFICIENT_Xi_Yl \ FZERO #define COEFFICIENT_Yi_Yl \ FU #define COEFFICIENT_Ni_Yl \ FZERO #define TRANSLATION_i_Yl \ FZERO DEFV(Local,DEFV(Float,INIT(coefficient_Xi_Yl,COEFFICIENT_Xi_Yl))); DEFV(Local,DEFV(Float,INIT(coefficient_Yi_Yl,COEFFICIENT_Yi_Yl))); DEFV(Local,DEFV(Float,INIT(coefficient_Ni_Yl,COEFFICIENT_Ni_Yl))); DEFV(Local,DEFV(Float,INIT(translation_i_Yl,TRANSLATION_i_Yl))); /* Passage de l'image a la coordonnee 'Y' de l'espace des phases. */ #define COEFFICIENT_Xi_Zl \ FZERO #define COEFFICIENT_Yi_Zl \ FZERO #define COEFFICIENT_Ni_Zl \ FU #define TRANSLATION_i_Zl \ FZERO DEFV(Local,DEFV(Float,INIT(coefficient_Xi_Zl,COEFFICIENT_Xi_Zl))); DEFV(Local,DEFV(Float,INIT(coefficient_Yi_Zl,COEFFICIENT_Yi_Zl))); DEFV(Local,DEFV(Float,INIT(coefficient_Ni_Zl,COEFFICIENT_Ni_Zl))); DEFV(Local,DEFV(Float,INIT(translation_i_Zl,TRANSLATION_i_Zl))); /* Passage de l'image a la coordonnee 'Z' de l'espace des phases. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U P A S S A G E D E L ' E S P A C E D E S P H A S E S A L ' I M A G E : */ /* */ /*************************************************************************************************************************************/ #define COEFFICIENT_Xl_Xi \ FU #define COEFFICIENT_Yl_Xi \ FZERO #define COEFFICIENT_Zl_Xi \ FZERO #define TRANSLATION_l_Xi \ FZERO DEFV(Local,DEFV(Float,INIT(coefficient_Xl_Xi,COEFFICIENT_Xl_Xi))); DEFV(Local,DEFV(Float,INIT(coefficient_Yl_Xi,COEFFICIENT_Yl_Xi))); DEFV(Local,DEFV(Float,INIT(coefficient_Zl_Xi,COEFFICIENT_Zl_Xi))); DEFV(Local,DEFV(Float,INIT(translation_l_Xi,TRANSLATION_l_Xi))); /* Passage de l'espace des phases a la coordonnee 'X' de l'image. */ #define COEFFICIENT_Xl_Yi \ FZERO #define COEFFICIENT_Yl_Yi \ FU #define COEFFICIENT_Zl_Yi \ FZERO #define TRANSLATION_l_Yi \ FZERO DEFV(Local,DEFV(Float,INIT(coefficient_Xl_Yi,COEFFICIENT_Xl_Yi))); DEFV(Local,DEFV(Float,INIT(coefficient_Yl_Yi,COEFFICIENT_Yl_Yi))); DEFV(Local,DEFV(Float,INIT(coefficient_Zl_Yi,COEFFICIENT_Zl_Yi))); DEFV(Local,DEFV(Float,INIT(translation_l_Yi,TRANSLATION_l_Yi))); /* Passage de l'espace des phases a la coordonnee 'Y' de l'image. */ #define COEFFICIENT_Xl_Ni \ FZERO #define COEFFICIENT_Yl_Ni \ FZERO #define COEFFICIENT_Zl_Ni \ FU #define TRANSLATION_l_Ni \ FZERO DEFV(Local,DEFV(Float,INIT(coefficient_Xl_Ni,COEFFICIENT_Xl_Ni))); DEFV(Local,DEFV(Float,INIT(coefficient_Yl_Ni,COEFFICIENT_Yl_Ni))); DEFV(Local,DEFV(Float,INIT(coefficient_Zl_Ni,COEFFICIENT_Zl_Ni))); DEFV(Local,DEFV(Float,INIT(translation_l_Ni,TRANSLATION_l_Ni))); /* Passage de l'espace des phases au niveau de l'image. */ #define DEPLACER_LE_POINT \ FAUX DEFV(Local,DEFV(Logical,INIT(deplacer_le_point,DEPLACER_LE_POINT))); /* Indique si l'on utilise {cx,cy} ('VRAI') ou {X,Y} ('FAUX') en tant que coordonnees de */ /* marquage dans 'ImageR'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' I N T E G R A T I O N D U S Y S T E M E */ /* D ' E Q U A T I O N S D I F F E R E N T I E L L E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/integr.1B.vv.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S I N I T I A L I S A T I O N S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M A T I O N D ' U N E I M A G E P A R L ' A T T R A C T E U R D E L O R E N Z : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE)); /*..............................................................................................................................*/ GET_ARGUMENTSv(nombre_d_arguments ,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_L("standard=",les_images_sont_standards); GET_ARGUMENT_F("COEFFICIENT_Xx=",Xx); GET_ARGUMENT_F("COEFFICIENT_Xy=",Xy); GET_ARGUMENT_F("COEFFICIENT_Xz=",Xz); GET_ARGUMENT_F("COEFFICIENT_Xxy=",Xxy); GET_ARGUMENT_F("COEFFICIENT_Xyz=",Xyz); GET_ARGUMENT_F("COEFFICIENT_Xzx=",Xzx); GET_ARGUMENT_F("COEFFICIENT_Xxyz=",Xxyz); GET_ARGUMENT_F("COEFFICIENT_Yx=",Yx); GET_ARGUMENT_F("COEFFICIENT_Yy=",Yy); GET_ARGUMENT_F("COEFFICIENT_Yz=",Yz); GET_ARGUMENT_F("COEFFICIENT_Yxy=",Yxy); GET_ARGUMENT_F("COEFFICIENT_Yyz=",Yyz); GET_ARGUMENT_F("COEFFICIENT_Yzx=",Yzx); GET_ARGUMENT_F("COEFFICIENT_Yxyz=",Yxyz); GET_ARGUMENT_F("COEFFICIENT_Zx=",Zx); GET_ARGUMENT_F("COEFFICIENT_Zy=",Zy); GET_ARGUMENT_F("COEFFICIENT_Zz=",Zz); GET_ARGUMENT_F("COEFFICIENT_Zxy=",Zxy); GET_ARGUMENT_F("COEFFICIENT_Zyz=",Zyz); GET_ARGUMENT_F("COEFFICIENT_Zzx=",Zzx); GET_ARGUMENT_F("COEFFICIENT_Zxyz=",Zxyz); GET_ARGUMENT_F("Xi_Xl=",coefficient_Xi_Xl); GET_ARGUMENT_F("Yi_Xl=",coefficient_Yi_Xl); GET_ARGUMENT_F("Ni_Xl=",coefficient_Ni_Xl); GET_ARGUMENT_F("i_Xl=""Ti_Xl=",translation_i_Xl); GET_ARGUMENT_F("Xi_Yl=",coefficient_Xi_Yl); GET_ARGUMENT_F("Yi_Yl=",coefficient_Yi_Yl); GET_ARGUMENT_F("Ni_Yl=",coefficient_Ni_Yl); GET_ARGUMENT_F("i_Yl=""Ti_Yl=",translation_i_Yl); GET_ARGUMENT_F("Xi_Zl=",coefficient_Xi_Zl); GET_ARGUMENT_F("Yi_Zl=",coefficient_Yi_Zl); GET_ARGUMENT_F("Ni_Zl=",coefficient_Ni_Zl); GET_ARGUMENT_F("i_Zl=""Ti_Zl=",translation_i_Zl); GET_ARGUMENT_F("Xl_Xi=",coefficient_Xl_Xi); GET_ARGUMENT_F("Yl_Xi=",coefficient_Yl_Xi); GET_ARGUMENT_F("Zl_Xi=",coefficient_Zl_Xi); GET_ARGUMENT_F("l_Xi=""Tl_Xi=",translation_l_Xi); GET_ARGUMENT_F("Xl_Yi=",coefficient_Xl_Yi); GET_ARGUMENT_F("Yl_Yi=",coefficient_Yl_Yi); GET_ARGUMENT_F("Zl_Yi=",coefficient_Zl_Yi); GET_ARGUMENT_F("l_Yi=""Tl_Yi=",translation_l_Yi); GET_ARGUMENT_F("Xl_Ni=",coefficient_Xl_Ni); GET_ARGUMENT_F("Yl_Ni=",coefficient_Yl_Ni); GET_ARGUMENT_F("Zl_Ni=",coefficient_Zl_Ni); GET_ARGUMENT_F("l_Ni=""Tl_Ni=",translation_l_Ni); GET_ARGUMENT_L("deplacer=",deplacer_le_point); GET_ARGUMENT_I("n=""iterations=",nombre_d_iterations); GET_ARGUMENT_F("dt=""dct=",dct); GET_ARGUMENT_I("ordre=""methode=""integration=",ordre_de_la_methode_d_integration); /* Les synonymes de "ordre=", ont ete introduits le 20060608151515... */ ) ); #include xrk/attractor.19.I" /* Validations et definition de l'espace physique. */ Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_images_sont_standards,ImageA,IFmageA,nom_imageA)))) Bblock CALi(gInettoyage(les_images_sont_standards,ImageR,IFmageR)); /* Nettoyage de l'image Resultat. */ begin_image Bblock DEFV(Float,INIT(X_courant_de_ImageA,_____cNORMALISE_OX(X))); DEFV(Float,INIT(Y_courant_de_ImageA,_____cNORMALISE_OY(Y))); DEFV(genere_Float,INIT(niveau_courant_de_ImageA,FLOT__NIVEAU_UNDEF)); /* Point courant de l'image Argument. */ DEFV(Int,INIT(X_courant_de_ImageR,UNDEF)); DEFV(Int,INIT(Y_courant_de_ImageR,UNDEF)); DEFV(genere_Float,INIT(niveau_courant_de_ImageR,FLOT__NIVEAU_UNDEF)); /* Point courant de l'image Resultat. */ /* Pour chaque point {X,Y} de l'image Argument, on reinitialise l'integration : */ RE_INITIALISATION_DE_L_HORLOGE; /* Initialisation du temps. */ EGAL(niveau_courant_de_ImageA ,COND(EST_VRAI(les_images_sont_standards) ,______NORMALISE_NIVEAU(load_point(ImageA,X,Y)) ,loadF_point(IFmageA,X,Y) ) ); EGAL(cx ,X_01_DANS_PHYSIQUE(LIN3(coefficient_Xi_Xl,X_courant_de_ImageA ,coefficient_Yi_Xl,Y_courant_de_ImageA ,coefficient_Ni_Xl,niveau_courant_de_ImageA ,translation_i_Xl ) ) ); EGAL(cy ,Y_01_DANS_PHYSIQUE(LIN3(coefficient_Xi_Yl,X_courant_de_ImageA ,coefficient_Yi_Yl,Y_courant_de_ImageA ,coefficient_Ni_Yl,niveau_courant_de_ImageA ,translation_i_Yl ) ) ); EGAL(cz ,Z_01_DANS_PHYSIQUE(LIN3(coefficient_Xi_Zl,X_courant_de_ImageA ,coefficient_Yi_Zl,Y_courant_de_ImageA ,coefficient_Ni_Zl,niveau_courant_de_ImageA ,translation_i_Zl ) ) ); /* Initialisation des conditions initiales a partir de l'image. */ EGAL(dcx,FZERO); EGAL(dcy,FZERO); EGAL(dcz,FZERO); /* Initialisation des differentielles a priori. On notera que 'FZERO' est la valeur la */ /* plus "logique"... */ Komp(numero_de_l_iteration_courante,nombre_d_iterations) Bblock INTEGRATION_D_UN_SYSTEME_D_EQUATIONS_DIFFERENTIELLES_O1(temps_courant,dct); /* Integration du systeme d'equations differentielles suivant la methode choisie... */ INCREMENTATION_DE_L_HORLOGE(dct); /* Simulation du temps de la simulation... */ Eblock EKom EGAL(X_courant_de_ImageR ,COND(IL_FAUT(deplacer_le_point) ,_cDENORMALISE_OX(LIN3(coefficient_Xl_Xi,X_PHYSIQUE_DANS_01(cx) ,coefficient_Yl_Xi,Y_PHYSIQUE_DANS_01(cy) ,coefficient_Zl_Xi,Z_PHYSIQUE_DANS_01(cz) ,translation_l_Xi ) ) ,X ) ); EGAL(Y_courant_de_ImageR ,COND(IL_FAUT(deplacer_le_point) ,_cDENORMALISE_OY(LIN3(coefficient_Xl_Yi,X_PHYSIQUE_DANS_01(cx) ,coefficient_Yl_Yi,Y_PHYSIQUE_DANS_01(cy) ,coefficient_Zl_Yi,Z_PHYSIQUE_DANS_01(cz) ,translation_l_Yi ) ) ,Y ) ); EGAL(niveau_courant_de_ImageR ,LIN3(coefficient_Xl_Ni,X_PHYSIQUE_DANS_01(cx) ,coefficient_Yl_Ni,Y_PHYSIQUE_DANS_01(cy) ,coefficient_Zl_Ni,Z_PHYSIQUE_DANS_01(cz) ,translation_l_Ni ) ); /* Definition du point courant de l'image Resultat. */ Test(EST_VRAI(les_images_sont_standards)) Bblock /* Cas d'une image 'image' : */ store_point_valide(__DENORMALISE_NIVEAU(niveau_courant_de_ImageR) ,ImageR ,X_courant_de_ImageR ,Y_courant_de_ImageR ,FVARIABLE ); Eblock ATes Bblock /* Cas d'une image 'imageF' : */ storeF_point_valide(niveau_courant_de_ImageR ,IFmageR ,X_courant_de_ImageR ,Y_courant_de_ImageR ); Eblock ETes Eblock end_image CALi(gIupdate_image(les_images_sont_standards,nom_imageR,ImageR,IFmageR)); Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes RETU_Commande; Eblock ECommande