/*************************************************************************************************************************************/
/* */
/* 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 T R I D I M E N S I O N N E L : */
/* */
/* */
/* ........ */
/* .-:OoOo .-.--OOooooo:-..--........... */
/* .--%o .O.-O- :- ...-.o. ....... */
/* ....-. .-:% -%...... -.. ...... -.. */
/* ..:%-O.:O:-...................... :..... .. */
/* .-o# :o...-o.O%. %%.....::-----....... :.. */
/* .-...... ..-:. -o. .-...-...O. ........ .. */
/* ..::.O. .:-.....-o O%...- :-.%%o...:--..... o.. */
/* .-O. .:. ..-:-o.-.....-#....O% ::O-o:..... -...ooooooo-.-. */
/* .-:- ...:. o- .Ooo..........- ..... .:.: ... ...... */
/* ...: ...o: .-Ooo.......:O:........:..-.-. ... .... .-. */
/* .-.........:. .oo :O%.....O -... %%o......o:-.... -..... :. */
/* .O. ......-#o%:....-.-#oO#....o....%%...:-..------.... :.. */
/* .o ..- .........:o:#O%% .....-%.--:...:.o%##%-.....-. :. */
/* .o. ..-O ..............:..... :-..:#o...-. ....:-...-oO%::o:.. */
/* .o :O%..: -:..OO...............%oO- ........: O.. -..-. */
/* ..::. ..: -:.. .#:# O-..................... .-.. o.. :. */
/* .O.....:.o-%:o...%. .o..#...#..-.o. .....oO#::o.. O..:.. -:. */
/* .% ...-:#o.... o%......%...%o ........ .:OOo..-:.. o. */
/* .-O .-O.......::...%O... ...-....#o..... o....Oo: -.. */
/* .:% :%..- .......-oO.-...o-....#O. .... --.. .. .:%:o.o. */
/* .-OOO. .:. .O.................--o-. ... .-.. -.. O-. */
/* .--Oo .- -O.... .:......%-. ....-.o...:.. .-. ::.. */
/* .:..--O-oo.oO#... .::::... ... ......-o -. .:.. */
/* oO ...-o: ....%o:.:.... :: o.... ..-o%:....:.. */
/* .o% .-.....-..-..-oO%...... .O... ... ..o:.. */
/* .o%.:. ....:. ....%--:o... ... o-.. */
/* -o.: .#:......-- ...Oo-..%:- ... o-.. */
/* ...-%-. ... .......... .....:-o.... */
/* .-o%. ... ::... -.. */
/* ..-:O....-o.. ... o.. */
/* ..-.... ... -... */
/* ..:o ... :... */
/* */
/* */
/* (d'apres '$xiirk/RECS.3.11$ROUGE') */
/* */
/* */
/* 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. */
/* */
/* */
/* Author of '$xrk/recuit_3D.11$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1994??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 POINT_INTERMEDIAIRE_DU_RESEAU \
LSTX(PREMIER_POINT_DU_RESEAU,EXP2(dimension_lineaire_du_reseau)) \
/* Definition du point qui est le plus eloigne de 'PREMIER_POINT_DU_RESEAU' tout en */ \
/* etant sur la meme facette. Ce point a ete introduit afin de "stabiliser" le cube dans */ \
/* l'espace, car, en effet, en passant en dans l'espace tridimensionnel, il faut fixer */ \
/* trois points dans l'espace si l'on veut que son orientation, a la fin du processus, */ \
/* soit celle qui est definie dans 'liste_des_points_dans_leurs_positions_theoriques'. */
#define NOMBRE_DE_POINTS_DU_RESEAU \
EXP3(dimension_lineaire_du_reseau) \
/* Nombre de points contenus dans le reseau... */
#define BLOQUER_LE_POINT_INTERMEDIAIRE_DU_RESEAU \
FAUX
DEFV(Local,DEFV(Logical,INIT(bloquer_le_point_intermediaire_du_reseau,BLOQUER_LE_POINT_INTERMEDIAIRE_DU_RESEAU)));
/* Indique si le point intermediaire du reseau doit etre bloque dans sa position "cible"... */
/* On notera que la valeur implicite est 'FAUX' alors que pour le premier et le dernier */
/* point, elle est 'VRAI'. Cela vient du fait qu'imposer trop de contraintes peut amener */
/* le reseau dans un etat deforme, ou tous les points sont bien places relativement les uns */
/* aux autres, sauf les points "bloques" ; les points "bloques" sont bien entendu bien */
/* localises dans l'espace, alors que les autres sont globalement translates par rapport */
/* a eux (les points "bloques"...) ; voir a ce propos la sequence : */
/* */
/* xivPdf 1 2 / 020578_020705 */
/* */
/* qui montre clairement ce defaut. */
/* */
/* Cette difference entre le probleme bidimensionnel (qui accepte sans probleme le blocage */
/* de 2 points) et le probleme tridimensionnel (qui n'accepte pas le blocage de 3 points) */
/* est-il lie au fait que dans le dernier cas, les rotations forment un groupe non abelien */
/* (non commutatif) contrairement au premier cas ? */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 \
MIN3(SOUS(ASD2(espace_physique,extremite,x),ASD2(espace_physique,origine,x)) \
,SOUS(ASD2(espace_physique,extremite,y),ASD2(espace_physique,origine,y)) \
,SOUS(ASD2(espace_physique,extremite,z),ASD2(espace_physique,origine,z)) \
) \
/* 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_IJK_INDICE_HORIZONTAL(ijk) \
REST(REST(SOUS(ijk,PREMIER_POINT_DU_RESEAU),EXP2(dimension_lineaire_du_reseau)),dimension_lineaire_du_reseau)
#define CONVERSION_IJK_X(ijk) \
ADD2(Xcentre_ESPACE \
,SOUS(SCAL(CONVERSION_IJK_INDICE_HORIZONTAL(ijk) \
,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_IJK_INDICE_VERTICAL(ijk) \
DIVI(REST(SOUS(ijk,PREMIER_POINT_DU_RESEAU),EXP2(dimension_lineaire_du_reseau)),dimension_lineaire_du_reseau)
#define CONVERSION_IJK_Y(ijk) \
ADD2(Ycentre_ESPACE \
,SOUS(SCAL(CONVERSION_IJK_INDICE_VERTICAL(ijk) \
,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_IJK_INDICE_PROFOND(ijk) \
DIVI(SOUS(ijk,PREMIER_POINT_DU_RESEAU),EXP2(dimension_lineaire_du_reseau))
#define CONVERSION_IJK_Z(ijk) \
ADD2(Zcentre_ESPACE \
,SOUS(SCAL(CONVERSION_IJK_INDICE_PROFOND(ijk) \
,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 'pointK' en la coordonnee 'Z' attendue pour ce point a */
/* a la fin du processus de recuit simule... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 \
GRO6(FRA10(FU)) \
/* Afin d'etre sur de voir toutes les particules generees. On notera que contrairement a */ \
/* '$xrk/recuit_2D.11$K', on utilise 'GRO6(FRA10(FU))' et non pas 'GRO7(FRA10(FU))' ; ceci */ \
/* est du a l'introduction de 'BLOQUER_LE_POINT_INTERMEDIAIRE_DU_RESEAU' qui fait que */ \
/* l'orientation finale du cube n'est pas connu initialement... */
#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 T R I D I M E N S I O N N E L : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
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("intermediaire=",bloquer_le_point_intermediaire_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);
)
);
#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_IJK_X(point),CONVERSION_IJK_Y(point),CONVERSION_IJK_Z(point));
/* 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 et que l'on illustre le processus bidimensionnellement) : */
/* */
/* */
/* 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 8-connexite, */
/* c'est-a-dire sur les plus proches voisins... */
Test(I3OU(I3ET(IFEQ(SOUA(CONVERSION_IJK_INDICE_HORIZONTAL(pointI),CONVERSION_IJK_INDICE_HORIZONTAL(pointJ)),UN)
,IFEQ(CONVERSION_IJK_INDICE_VERTICAL(pointI),CONVERSION_IJK_INDICE_VERTICAL(pointJ))
,IFEQ(CONVERSION_IJK_INDICE_PROFOND(pointI),CONVERSION_IJK_INDICE_PROFOND(pointJ))
)
,I3ET(IFEQ(CONVERSION_IJK_INDICE_HORIZONTAL(pointI),CONVERSION_IJK_INDICE_HORIZONTAL(pointJ))
,IFEQ(SOUA(CONVERSION_IJK_INDICE_VERTICAL(pointI),CONVERSION_IJK_INDICE_VERTICAL(pointJ)),UN)
,IFEQ(CONVERSION_IJK_INDICE_PROFOND(pointI),CONVERSION_IJK_INDICE_PROFOND(pointJ))
)
,I3ET(IFEQ(CONVERSION_IJK_INDICE_HORIZONTAL(pointI),CONVERSION_IJK_INDICE_HORIZONTAL(pointJ))
,IFEQ(CONVERSION_IJK_INDICE_VERTICAL(pointI),CONVERSION_IJK_INDICE_VERTICAL(pointJ))
,IFEQ(SOUA(CONVERSION_IJK_INDICE_PROFOND(pointI),CONVERSION_IJK_INDICE_PROFOND(pointJ)),UN)
)
)
)
Bblock
EGAL(ACCES_CONNEXION(pointI,pointJ),VRAI);
/* Lorsque les points 'pointI' et 'pointJ' sont plus proches voisins, ils sont 8-connectes. */
Eblock
ATes
Bblock
EGAL(ACCES_CONNEXION(pointI,pointJ),FAUX);
/* Cas ou les points 'pointI' et 'pointJ' ne sont pas 8-connectes... */
Eblock
ETes
Eblock
EDoI
Eblock
EDoI
/* Nota : il est possible de modifier ici la liste "theorique" (par exemple en utilisant */
/* 'PROCESS_ARGUMENT_C(...)'). */
#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_point_intermediaire_du_reseau))
Bblock
CAse(POINT_INTERMEDIAIRE_DU_RESEAU)
Bblock
TRANSFERT_POINT_3D(ACCES_POINT(point),ACCES_CIBLE(point));
/* Initialisation d'un point intermediaire afin de "stabiliser" le cube dans 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));
/* Les autres points sont places aleatoirement dans l'espace... */
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(I3ET(IFOU(IL_NE_FAUT_PAS(bloquer_le_premier_point_du_reseau)
,IFNE(point,PREMIER_POINT_DU_RESEAU)
)
,IFOU(IL_NE_FAUT_PAS(bloquer_le_point_intermediaire_du_reseau)
,IFNE(point,POINT_INTERMEDIAIRE_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));
DEFV(Float,INIT(perturbation_en_Z,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)
);
GENERATION_D_UNE_VALEUR(perturbation_en_Z
,NEGA(AMPLITUDE_ALEATOIRE_EN_Z)
,NEUT(AMPLITUDE_ALEATOIRE_EN_Z)
);
/* Valeurs de perturbation des coordonnees 'X', 'Y' et 'Z'... */
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));
INCR(ASD1(ACCES_POINT(point),z),LIMITATION_DE_L_AMPLITUDE_ALEATOIRE(perturbation_en_Z));
/* Perturbation aleatoire des points a l'exception du premier et du dernier. */
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