/*************************************************************************************************************************************/
/* */
/* R E C U I T S I M U L E D E V A N T C O N D U I R E A U N R E S E A U O R T H O N O R M E */
/* D A N S L ' E S P A C E B I D I M E N S I O N N E L : */
/* */
/* */
/* ......... */
/* .....--------::::::::::::::::ooooo.ooooOOOOOoo::--:.. */
/* .- .-- -:. -.. */
/* .- .-- -o. -.. */
/* .- .-- -:. .. */
/* .- .- -:. -. */
/* .- .. .:. -. */
/* .. .. .:. -.. */
/* .. .. .:. ... */
/* .........................------:::::::::----......... */
/* .- .. .:. ... */
/* .- .- .:. ... */
/* .- .- .:. ... */
/* .-. .- .o. ... */
/* .-. .- :. ... */
/* .-. .- :. ... */
/* .-. .- -. ... */
/* .-................-----::::::::ooo-.:::-............. */
/* .-................-.............. -. ... */
/* .-. .- -. ... */
/* .-. .- -. ... */
/* .-. .. -. ... */
/* .- .. -. ... */
/* .- .. -. .. */
/* .- .. -. .. */
/* .- .. .. .. */
/* ..................................................... */
/* */
/* */
/* */
/* */
/* Nota important : */
/* */
/* A partir d'une solution calculee a */
/* l'aide de la methode ci-dessous, toute */
/* configuration obtenue par rotation de */
/* celle-ci (dans le plan, comme dans */
/* l'espace) est aussi solution. On pourra */
/* utiliser cette propriete pour obtenir */
/* une solution souhaitee mais non produite */
/* par le programme ; voir le probleme de la */
/* carte de France a ce propos : */
/* */
/* */
/* 14=Dunkerque */
/* */
/* *. */
/* ........ */
/* .... ....... */
/* .... .. .... */
/* 13=Cherbourg .... .. .... */
/* * .... 9=Paris .. .... */
/* .. .. ..... . ... .... */
/* .... . .... * ... .... */
/* .... ....... ... .* 15=Strasbourg */
/* 12=Brest *... .. ....... ... ... */
/* .... .... .. ... .. .. */
/* .... ... .. .. .. ... */
/* .... .... . *...........* 11=Mulhouse */
/* *.. ... 10=Dijon .. . */
/* 8=Nantes ... ... ... .. */
/* .. .. ... .. */
/* . .. .. .. */
/* .. . 6=Lyon *. . ......* 7=Chamonix */
/* .. ... ..... ... */
/* .. ... ...... .. */
/* ... .. ... .. . */
/* 4=Bordeaux *. .. .. .. .. */
/* .. .. . ... . ... */
/* .. .... ... ... .. .. */
/* .. ......... ... ..* 3=Menton */
/* .. *. 5=Toulouse .. ..... */
/* *...... . .... ...*.. */
/* 0=Hendaye ......... ..... ........ */
/* . *...... 2=Marseille */
/* */
/* 1=Perpignan */
/* */
/* */
/* (d'apres xivPdf 2 1 / 021218_021345) */
/* */
/* */
/* Author of '$xrk/recuit_2D.11$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1993??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 : */
/* */
/*************************************************************************************************************************************/
@define PRAGMA_CL_____MODULE_NON_OPTIMISABLE
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F I C H I E R S D ' I N C L U D E S : */
/* */
/*************************************************************************************************************************************/
#include INCLUDES_BASE
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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"
#include xrv/particule.41.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. */
/* */
/* */
/*************************************************************************************************************************************/
#define hXmin_ESPACE \
PARE(-1.0)
#define hYmin_ESPACE \
PARE(-1.0)
#define hZmin_ESPACE \
PARE(-1.0)
/* Definition du "coin" inferieur-gauche-arriere de l'espace physique. */
#define hXmax_ESPACE \
PARE(1.0)
#define hYmax_ESPACE \
PARE(1.0)
#define hZmax_ESPACE \
PARE(1.0)
/* Definition du "coin" superieur-droite-avant de l'espace physique. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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(0.0)
#define dYmin_ESPACE \
PARE(0.0)
#define dZmin_ESPACE \
PARE(0.0)
/* Definition des minima des differentielles {dx,dy,dz}. */
#define dXmax_ESPACE \
PARE(1.0)
#define dYmax_ESPACE \
PARE(1.0)
#define dZmax_ESPACE \
PARE(1.0)
/* 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 U R E S E A U O R T H O N O R M E A U Q U E L */
/* D O I T A B O U T I R L E P R O C E S S U S : */
/* */
/*************************************************************************************************************************************/
#include xrk/recuit_2D.11.I"
#define NOMBRE_DE_POINTS_DU_RESEAU \
EXP2(dimension_lineaire_du_reseau) \
/* Nombre de points contenus dans le reseau... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D U P R O C E S S U S A L E A T O I R E : */
/* */
/*************************************************************************************************************************************/
#include xrk/recuit_2D.13.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A T E R I A L I S A T I O N D E S C O N N E X I O N S : */
/* */
/*************************************************************************************************************************************/
#include xrk/recuit_2D.14.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O C E D U R E S D ' A C C E S A U X D I F F E R E N T E S L I S T E S : */
/* */
/*************************************************************************************************************************************/
#include xrk/recuit_2D.15.I"
#define DIMENSION_LINEAIRE_REELLE_DU_RESEAU_DANS_L_ESPACE_PHYSIQUE \
MIN2(SOUS(ASD2(espace_physique,extremite,x),ASD2(espace_physique,origine,x)) \
,SOUS(ASD2(espace_physique,extremite,y),ASD2(espace_physique,origine,y)) \
) \
/* Etant donne que l'on souhaite un reseau orthonorme, il est imperatif que les dimensions */ \
/* reelles horizontales et verticales soient les memes, ce que l'on calcule ici... */
#define CONVERSION_IJ_INDICE_HORIZONTAL(ij) \
REST(SOUS(ij,PREMIER_POINT_DU_RESEAU),dimension_lineaire_du_reseau)
#define CONVERSION_IJ_X(ij) \
ADD2(Xcentre_ESPACE \
,SOUS(SCAL(CONVERSION_IJ_INDICE_HORIZONTAL(ij) \
,TRMU(dimension_lineaire_du_reseau) \
,DIMENSION_LINEAIRE_REELLE_DU_RESEAU_DANS_L_ESPACE_PHYSIQUE \
) \
,MOIT(DIMENSION_LINEAIRE_REELLE_DU_RESEAU_DANS_L_ESPACE_PHYSIQUE) \
) \
)
/* Conversion d'un numero de point 'pointI' en la coordonnee 'X' attendue pour ce point a */
/* a la fin du processus de recuit simule... */
#define CONVERSION_IJ_INDICE_VERTICAL(ij) \
DIVI(SOUS(ij,PREMIER_POINT_DU_RESEAU),dimension_lineaire_du_reseau)
#define CONVERSION_IJ_Y(ij) \
ADD2(Ycentre_ESPACE \
,SOUS(SCAL(CONVERSION_IJ_INDICE_VERTICAL(ij) \
,TRMU(dimension_lineaire_du_reseau) \
,DIMENSION_LINEAIRE_REELLE_DU_RESEAU_DANS_L_ESPACE_PHYSIQUE \
) \
,MOIT(DIMENSION_LINEAIRE_REELLE_DU_RESEAU_DANS_L_ESPACE_PHYSIQUE) \
) \
)
/* Conversion d'un numero de point 'pointJ' en la coordonnee 'Y' attendue pour ce point a */
/* a la fin du processus de recuit simule... */
#define CONVERSION_Z \
Zcentre_ESPACE \
/* Coordonnee 'Z' ; on notera que celle-ci ne change jamais, mais qu'une extension */ \
/* tridimensionnelle du processus est envisageable... */
#define MODIFIER_LES_POINTS \
FAUX
#define CX0 \
Xcentre_ESPACE
#define CY0 \
Ycentre_ESPACE
/* Afin de ne pas modifier l'initialisation implicite a l'aide du reseau carre... */
#define MODIFICATION_POINT(numero_du_point,modifier_le_point,cx,cy) \
Ca1e(numero_du_point) \
Bblock \
Test(IL_FAUT(modifier_le_point)) \
Bblock \
INITIALISATION_POINT_3D(ACCES_CIBLE(point),cx,cy,CONVERSION_Z); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ECa1 \
/* Procedure de modification de l'initialisation implicite a l'aide du reseau carre. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M E T H O D E D E S M O I N D R E S C A R R E S : */
/* */
/*************************************************************************************************************************************/
#include xrk/recuit_2D.1C.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* A I D E A U C A D R A G E D E S I M A G E S : */
/* */
/*************************************************************************************************************************************/
#include xrk/attractor.1C.I"
DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES
/* Definition des extrema des coordonnees et des derivees. On notera bien l'absence de */
/* point-virgule apres 'DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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/attractor.14.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N D E M E M O R I S A T I O N D U P O I N T C O U R A N T : */
/* */
/*************************************************************************************************************************************/
#include xrk/recuit_2D.16.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N S D E V I S U A L I S A T I O N E T D ' I N T E R P O L A T I O N : */
/* */
/*************************************************************************************************************************************/
=define ZOOM_IMPLICITE \
GRO7(FRA10(FU)) \
/* Afin d'etre sur de voir toutes les particules generees... */
#include xrk/attractor.17.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D U P R O C E S S U S I T E R A T I F : */
/* */
/*************************************************************************************************************************************/
#include xrk/recuit_2D.12.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 : */
/* */
/*************************************************************************************************************************************/
#include xrk/attractor.18.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P O U R D E S R A I S O N S D E C O M P A T I B I L I T E : */
/* */
/*************************************************************************************************************************************/
#include xrk/integr.1B.vv.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R E C U I T S I M U L E D E V A N T C O N D U I R E A U N R E S E A U O R T H O N O R M E */
/* D A N S L ' E S P A C E B I D I M E N S I O N N E L : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Logical,INIT(modifier_le_point00,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx00,CX0));
DEFV(Float,INIT(cy00,CY0));
/* Pour modifier l'initialisation du point '00'... */
DEFV(Logical,INIT(modifier_le_point01,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx01,CX0));
DEFV(Float,INIT(cy01,CY0));
/* Pour modifier l'initialisation du point '01'... */
DEFV(Logical,INIT(modifier_le_point02,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx02,CX0));
DEFV(Float,INIT(cy02,CY0));
/* Pour modifier l'initialisation du point '02'... */
DEFV(Logical,INIT(modifier_le_point03,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx03,CX0));
DEFV(Float,INIT(cy03,CY0));
/* Pour modifier l'initialisation du point '03'... */
DEFV(Logical,INIT(modifier_le_point04,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx04,CX0));
DEFV(Float,INIT(cy04,CY0));
/* Pour modifier l'initialisation du point '04'... */
DEFV(Logical,INIT(modifier_le_point05,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx05,CX0));
DEFV(Float,INIT(cy05,CY0));
/* Pour modifier l'initialisation du point '05'... */
DEFV(Logical,INIT(modifier_le_point06,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx06,CX0));
DEFV(Float,INIT(cy06,CY0));
/* Pour modifier l'initialisation du point '06'... */
DEFV(Logical,INIT(modifier_le_point07,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx07,CX0));
DEFV(Float,INIT(cy07,CY0));
/* Pour modifier l'initialisation du point '07'... */
DEFV(Logical,INIT(modifier_le_point08,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx08,CX0));
DEFV(Float,INIT(cy08,CY0));
/* Pour modifier l'initialisation du point '08'... */
DEFV(Logical,INIT(modifier_le_point09,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx09,CX0));
DEFV(Float,INIT(cy09,CY0));
/* Pour modifier l'initialisation du point '09'... */
DEFV(Logical,INIT(modifier_le_point10,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx10,CX0));
DEFV(Float,INIT(cy10,CY0));
/* Pour modifier l'initialisation du point '10'... */
DEFV(Logical,INIT(modifier_le_point11,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx11,CX0));
DEFV(Float,INIT(cy11,CY0));
/* Pour modifier l'initialisation du point '11'... */
DEFV(Logical,INIT(modifier_le_point12,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx12,CX0));
DEFV(Float,INIT(cy12,CY0));
/* Pour modifier l'initialisation du point '12'... */
DEFV(Logical,INIT(modifier_le_point13,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx13,CX0));
DEFV(Float,INIT(cy13,CY0));
/* Pour modifier l'initialisation du point '13'... */
DEFV(Logical,INIT(modifier_le_point14,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx14,CX0));
DEFV(Float,INIT(cy14,CY0));
/* Pour modifier l'initialisation du point '14'... */
DEFV(Logical,INIT(modifier_le_point15,MODIFIER_LES_POINTS));
DEFV(Float,INIT(cx15,CX0));
DEFV(Float,INIT(cy15,CY0));
/* Pour modifier l'initialisation du point '15'... */
/*..............................................................................................................................*/
INITIALISATIONS_GENERALES;
/* Initialisations generales faites au tout debut... */
iTRANSFORMAT_31(liste_VARIABLE_essais,VARIABLE_essais_IMPLICITE);
/* Initialisation de la valeur initiale du nombre d'essais par image. */
#include xrv/champs_5.1A.I"
GET_ARGUMENTSv(nombre_d_arguments
,BLOC(PROCESS_ARGUMENTS_GEOMETRIQUES;
PROCESS_ARGUMENT_FICHIER("VARIABLE_essais="
,fichier_VARIABLE_essais
,liste_VARIABLE_essais
,VARIABLE_essais_IMPLICITE
,gTRANSFORMAT_31
);
PROCESS_ARGUMENTS_DE_VISUALISATION;
GET_ARGUMENT_L("temperature=",utiliser_une_temperature);
GET_ARGUMENT_L("chaque_essai=",changer_la_temperature_a_chaque_essai);
GET_ARGUMENT_F("K=",constante_K_de_temperature);
GET_ARGUMENT_F("t0=",temperature_initiale);
GET_ARGUMENT_F("tf=",temperature_finale);
GET_ARGUMENT_I("dimension=",dimension_lineaire_du_reseau);
GET_ARGUMENT_I("essais=",nombre_d_essais_par_image);
GET_ARGUMENT_L("premier=",bloquer_le_premier_point_du_reseau);
GET_ARGUMENT_L("dernier=",bloquer_le_dernier_point_du_reseau);
GET_ARGUMENT_F("amplitudeD=",amplitude_maximale_du_deplacement_aleatoire_des_points_au_depart);
GET_ARGUMENT_F("amplitudeA=",amplitude_maximale_du_deplacement_aleatoire_des_points_a_l_arrivee);
GET_ARGUMENT_I("graine=""g=",graine_du_generateur_d_evenements);
GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation);
GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation);
GET_ARGUMENT_F("grossissement=",grossissement_du_rayon_de_visualisation_des_points);
GET_ARGUMENT_L("connexions=",materialiser_les_connexions);
GET_ARGUMENT_F("ponderation=",ponderation_des_connexions_par_la_longueur);
GET_ARGUMENT_I("points=",nombre_absolu_de_points_sur_une_chaine_de_connexion);
GET_ARGUMENT_F("facteur=",facteur_de_la_longueur);
GET_ARGUMENT_L("p00=",modifier_le_point00);
GET_ARGUMENT_F("x00=",cx00);
GET_ARGUMENT_F("y00=",cy00);
GET_ARGUMENT_L("p01=",modifier_le_point01);
GET_ARGUMENT_F("x01=",cx01);
GET_ARGUMENT_F("y01=",cy01);
GET_ARGUMENT_L("p02=",modifier_le_point02);
GET_ARGUMENT_F("x02=",cx02);
GET_ARGUMENT_F("y02=",cy02);
GET_ARGUMENT_L("p03=",modifier_le_point03);
GET_ARGUMENT_F("x03=",cx03);
GET_ARGUMENT_F("y03=",cy03);
GET_ARGUMENT_L("p04=",modifier_le_point04);
GET_ARGUMENT_F("x04=",cx04);
GET_ARGUMENT_F("y04=",cy04);
GET_ARGUMENT_L("p05=",modifier_le_point05);
GET_ARGUMENT_F("x05=",cx05);
GET_ARGUMENT_F("y05=",cy05);
GET_ARGUMENT_L("p06=",modifier_le_point06);
GET_ARGUMENT_F("x06=",cx06);
GET_ARGUMENT_F("y06=",cy06);
GET_ARGUMENT_L("p07=",modifier_le_point07);
GET_ARGUMENT_F("x07=",cx07);
GET_ARGUMENT_F("y07=",cy07);
GET_ARGUMENT_L("p08=",modifier_le_point08);
GET_ARGUMENT_F("x08=",cx08);
GET_ARGUMENT_F("y08=",cy08);
GET_ARGUMENT_L("p09=",modifier_le_point09);
GET_ARGUMENT_F("x09=",cx09);
GET_ARGUMENT_F("y09=",cy09);
GET_ARGUMENT_L("p10=",modifier_le_point10);
GET_ARGUMENT_F("x10=",cx10);
GET_ARGUMENT_F("y10=",cy10);
GET_ARGUMENT_L("p11=",modifier_le_point11);
GET_ARGUMENT_F("x11=",cx11);
GET_ARGUMENT_F("y11=",cy11);
GET_ARGUMENT_L("p12=",modifier_le_point12);
GET_ARGUMENT_F("x12=",cx12);
GET_ARGUMENT_F("y12=",cy12);
GET_ARGUMENT_L("p13=",modifier_le_point13);
GET_ARGUMENT_F("x13=",cx13);
GET_ARGUMENT_F("y13=",cy13);
GET_ARGUMENT_L("p14=",modifier_le_point14);
GET_ARGUMENT_F("x14=",cx14);
GET_ARGUMENT_F("y14=",cy14);
GET_ARGUMENT_L("p15=",modifier_le_point15);
GET_ARGUMENT_F("x15=",cx15);
GET_ARGUMENT_F("y15=",cy15);
)
);
#include xrv/champs_5.19.I"
/* Pour eviter le message : */
/* */
/* Static function is not referenced. */
/* */
/* sur 'SYSTEME_ES9000_AIX_CC'... */
#include xrk/recuit_2D.1F.I"
/* Initialisations utiles a l'utilisation d'une temperature. */
#include xrk/attractor.19.I"
/* Validations et definition de l'espace physique. */
begin_nouveau_block
Bblock
#include xrk/recuit_2D.1D.I"
/* Allocation des diverses listes utiles... */
DoIn(point,PREMIER_POINT_DU_RESEAU,DERNIER_POINT_DU_RESEAU,I)
Bblock
INITIALISATION_POINT_3D(ACCES_CIBLE(point),CONVERSION_IJ_X(point),CONVERSION_IJ_Y(point),CONVERSION_Z);
/* Initialisation de la position "theorique" des points, c'est-a-dire celle qui est esperee */
/* a la fin du processus. Elles sont initialisees sur un reseau orthonorme. La configuration */
/* attendue des points a la fin du processus est donc du type (en supposant que l'on */
/* utilise 4x4 points) : */
/* */
/* */
/* 0 1 2 3 */
/* + - - - - + - - - - + - - - - + */
/* | | | | */
/* | | | | */
/* | | | | */
/* 4| 5| 6| 7| */
/* + - - - - + - - - - + - - - - + */
/* | | | | */
/* | | | | */
/* | | | | */
/* 8| 9| 10| 11| */
/* + - - - - + - - - - + - - - - + */
/* | | | | */
/* | | | | */
/* | | | | */
/* 12| 13| 14| 15| */
/* + - - - - + - - - - + - - - - + */
/* */
/* Les points sont materialises par des croix "+", mais precisons bien qu'il s'agit la */
/* de leurs positions a la fin du processus, et non pas au debut, puisqu'a ce moment la */
/* elles sont aleatoires (sauf en ce qui concerne le premier et le dernier...). */
Eblock
EDoI
DoIn(pointI,PREMIER_POINT_DU_RESEAU,DERNIER_POINT_DU_RESEAU,I)
Bblock
DoIn(pointJ,PREMIER_POINT_DU_RESEAU,DERNIER_POINT_DU_RESEAU,I)
Bblock
/* Initialisation relativement arbitraire de la matrice des connexions sur la 4-connexite, */
/* c'est-a-dire sur les plus proches voisins... */
Test(IFOU(IFET(IFEQ(SOUA(CONVERSION_IJ_INDICE_HORIZONTAL(pointI),CONVERSION_IJ_INDICE_HORIZONTAL(pointJ)),UN)
,IFEQ(CONVERSION_IJ_INDICE_VERTICAL(pointI),CONVERSION_IJ_INDICE_VERTICAL(pointJ))
)
,IFET(IFEQ(CONVERSION_IJ_INDICE_HORIZONTAL(pointI),CONVERSION_IJ_INDICE_HORIZONTAL(pointJ))
,IFEQ(SOUA(CONVERSION_IJ_INDICE_VERTICAL(pointI),CONVERSION_IJ_INDICE_VERTICAL(pointJ)),UN)
)
)
)
Bblock
EGAL(ACCES_CONNEXION(pointI,pointJ),VRAI);
/* Lorsque les points 'pointI' et 'pointJ' sont plus proches voisins, ils sont 4-connectes. */
Eblock
ATes
Bblock
EGAL(ACCES_CONNEXION(pointI,pointJ),FAUX);
/* Cas ou les points 'pointI' et 'pointJ' ne sont pas 4-connectes... */
Eblock
ETes
Eblock
EDoI
Eblock
EDoI
DoIn(point,PREMIER_POINT_DU_RESEAU,DERNIER_POINT_DU_RESEAU,I)
/* Nota : il est possible de modifier ici la liste "theorique" (par exemple en utilisant */
/* 'PROCESS_ARGUMENT_C(...)'). */
Bblock
Choi(point)
Bblock
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,ZERO),modifier_le_point00,cx00,cy00);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,UN),modifier_le_point01,cx01,cy01);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,DEUX),modifier_le_point02,cx02,cy02);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,TROIS),modifier_le_point03,cx03,cy03);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,QUATRE),modifier_le_point04,cx04,cy04);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,CINQ),modifier_le_point05,cx05,cy05);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,SIX),modifier_le_point06,cx06,cy06);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,SEPT),modifier_le_point07,cx07,cy07);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,HUIT),modifier_le_point08,cx08,cy08);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,NEUF),modifier_le_point09,cx09,cy09);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,DIX),modifier_le_point10,cx10,cy10);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,ONZE),modifier_le_point11,cx11,cy11);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,DOUZE),modifier_le_point12,cx12,cy12);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,TREIZE),modifier_le_point13,cx13,cy13);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,QUATORZE),modifier_le_point14,cx14,cy14);
MODIFICATION_POINT(ADD2(PREMIER_POINT_DU_RESEAU,QUINZE),modifier_le_point15,cx15,cy15);
Defo
Bblock
Eblock
EDef
Eblock
ECho
Eblock
EDoI
#include xrk/recuit_2D.17.I"
/* Calcul de la matrice des distances correspondant a la position "theorique" des points, */
/* c'est-a-dire celle qui est esperee a la fin du processus... */
/* ATTENTION : le 1993123100, les sequences d'initialisation aleatoire des couleurs des */
/* points et d'initialisation aleatoire des coordonnees des points ont vu leur ordre */
/* s'inverser (le nouvel ordre est plus logique). Dans ces conditions, il n'est plus */
/* possible de recalculer exactement les sequences anterieures... */
DoIn(point,PREMIER_POINT_DU_RESEAU,DERNIER_POINT_DU_RESEAU,I)
Bblock
CHoi(point)
Bblock
Test(IL_FAUT(bloquer_le_premier_point_du_reseau))
Bblock
CAse(PREMIER_POINT_DU_RESEAU)
Bblock
TRANSFERT_POINT_3D(ACCES_POINT(point),ACCES_CIBLE(point));
/* Initialisation du premier point du reseau a l'origine de l'espace... */
Eblock
ECAs
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(bloquer_le_dernier_point_du_reseau))
Bblock
CAse(DERNIER_POINT_DU_RESEAU)
Bblock
TRANSFERT_POINT_3D(ACCES_POINT(point),ACCES_CIBLE(point));
/* Initialisation du dernier point du reseau a l'extremite de l'espace... */
Eblock
ECAs
Eblock
ATes
Bblock
Eblock
ETes
DEfo
Bblock
GENERATION_D_UN_POINT(ACCES_POINT(point));
EGAL(ASD1(ACCES_POINT(point),z),CONVERSION_Z);
/* Les autres points sont places aleatoirement dans le plan... */
Eblock
EDEf
Eblock
ECHo
Eblock
EDoI
/* ATTENTION : le 1993123100, les sequences d'initialisation aleatoire des couleurs des */
/* points et d'initialisation aleatoire des coordonnees des points ont vu leur ordre */
/* s'inverser (le nouvel ordre est plus logique). Dans ces conditions, il n'est plus */
/* possible de recalculer exactement les sequences anterieures... */
#include xrk/recuit_2D.18.I"
/* Choix aleatoire initial (afin de ne pas avoir de problemes de coherence temporel, mais */
/* aussi d'optimiser) de la couleur des points... */
/* ATTENTION : le 1993123100, les sequences d'initialisation aleatoire des couleurs des */
/* points et d'initialisation aleatoire des coordonnees des points ont vu leur ordre */
/* s'inverser (le nouvel ordre est plus logique). Dans ces conditions, il n'est plus */
/* possible de recalculer exactement les sequences anterieures... */
Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation)
Bblock
DEFV(Int,INIT(numero_des_points,UNDEF));
/* A priori inutile mais reference dans 'memorisation_1_point_08(...)'. */
DEFV(Int,INIT(numero_de_l_essai,UNDEF));
/* Numero de l'essai courant... */
RE_INITIALISATION_DE_L_HORLOGE;
INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante);
/* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image. */
vTRANSFORMAT_31(nombre_d_essais_par_image,sVARIABLE_essais,numero_de_la_periode_courante,fichier_VARIABLE_essais);
/* Calcul du nombre d'essais par image. */
#include xrk/recuit_2D.19.I"
/* Memorisation des points courants et des chaines de connexite... */
#include xrk/attractor.1A.I"
PARALLELISME(BLOC(GENERATION_D_UNE_IMAGE_ET_PASSAGE_A_LA_SUIVANTE(BLOC(VIDE;));
/* Generation de l'image courante... */
)
,BLOC(PASSAGE_A_L_IMAGE_SUIVANTE;)
,numero_de_la_periode_courante
);
Test(IFLT(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation))
Bblock
/* Cas ou l'on n'est pas sur la derniere periode de la simulation : */
Komp(numero_de_l_essai,nombre_d_essais_par_image)
Bblock
#include xrk/recuit_2D.1A.I"
/* Memorisation des points avant le deplacement... */
DoIn(point,PREMIER_POINT_DU_RESEAU,DERNIER_POINT_DU_RESEAU,I)
Bblock
Test(IFET(IFOU(IL_NE_FAUT_PAS(bloquer_le_premier_point_du_reseau)
,IFNE(point,PREMIER_POINT_DU_RESEAU)
)
,IFOU(IL_NE_FAUT_PAS(bloquer_le_dernier_point_du_reseau)
,IFNE(point,DERNIER_POINT_DU_RESEAU)
)
)
)
Bblock
DEFV(Float,INIT(perturbation_en_X,FLOT__UNDEF));
DEFV(Float,INIT(perturbation_en_Y,FLOT__UNDEF));
GENERATION_D_UNE_VALEUR(perturbation_en_X
,NEGA(AMPLITUDE_ALEATOIRE_EN_X)
,NEUT(AMPLITUDE_ALEATOIRE_EN_X)
);
GENERATION_D_UNE_VALEUR(perturbation_en_Y
,NEGA(AMPLITUDE_ALEATOIRE_EN_Y)
,NEUT(AMPLITUDE_ALEATOIRE_EN_Y)
);
/* Valeurs de perturbation des coordonnees 'X' et 'Y'... */
INCR(ASD1(ACCES_POINT(point),x),LIMITATION_DE_L_AMPLITUDE_ALEATOIRE(perturbation_en_X));
INCR(ASD1(ACCES_POINT(point),y),LIMITATION_DE_L_AMPLITUDE_ALEATOIRE(perturbation_en_Y));
/* Perturbation aleatoire des points a l'exception du premier et du dernier. On notera que */
/* cette perturbation est bidimensionnelle, mais que l'extension tridimensionnelle est */
/* triviale a condition d'ajouter une dimension au reseau... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
EDoI
#include xrk/recuit_2D.1B.I"
/* Evaluation de la nouvelle situation des points, et si necessaire, retour a l'etat */
/* anterieur... */
Eblock
EKom
Eblock
ATes
Bblock
/* Cas ou l'on est sur la derniere periode de la simulation : il est inutile de calculer... */
Eblock
ETes
Eblock
EKom
#include xrk/recuit_2D.1E.I"
/* Liberation des differentes listes... */
Eblock
end_nouveau_block
RETU_Commande;
Eblock
ECommande