/*************************************************************************************************************************************/ /* */ /* R E C H E R C H E T R I D I M E N S I O N N E L L E D E P O I N T S V O I S I N S D A N S U N A L B U M : */ /* */ /* */ /* Author of '$xrv/PointsVoisins_3D.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20150809093608). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A L E U R S I M P L I C I T E S D E S P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #include xci/album.01.I" #define COMPATIBILITE_20150813 \ FAUX \ /* Permet de faire des calculs compatibles a ceux faits anterieurement au 20150813172627... */ #define UTILISER_DES_SPHERES_PLUTOT_QUE_DES_CUBES \ VRAI \ /* Doit-on utiliser des cubes "concentriques" ('FAUX') ou bien des spheres concentriques */ \ /* ('VRAI'). Ceci a ete introduit le 20150813175902... */ #define NIVEAU_DES_POINTS \ BLANC \ /* Niveau des points a etudier... */ #define NOMBRE_DE_VOISINS_CHERCHES \ SIX \ /* Nombre de voisins recherches. */ #define NOMBRE_MAXIMAL_DE_POINTS_A_TESTER \ MILLE \ /* Nombre maximal de points a tester autour de chaque point de 'niveau_des_points'. */ #define DISTANCE_MINIMALE_ENTRE_DEUX_POINTS \ FZERO #define DISTANCE_MAXIMALE_ENTRE_DEUX_POINTS \ F_INFINI /* Distances extremales entre deux points voisins (le minimum a ete introduit */ /* 20150812093727). */ #define TRIER_LES_DEUX_POINTS_DANS_UN_COUPLE \ VRAI \ /* Faut-il trier les deux points d'un couple {A,B} de facon a ce que {B,A} apparaissent */ /* sous la forme {A,B} ('VRAI') ou pas ('FAUX') ? */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S F I C H I E R S : */ /* */ /*************************************************************************************************************************************/ #include xrv/ARITHMET.1d.I" #include xrv/ARITHMET.21.I" #include xrv/champs_5.41.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define AMPLITUDE_XYZ \ CHOY(PasX,PasY,PasZ) #define PREMIER_VOISIN \ INDEX0 #define LISTE_DES_VOISINS(index) \ IdTb1(liste_des_voisins_du_point_courant \ ,INDX(index,PREMIER_VOISIN) \ ,nombre_de_voisins_cherches \ ) #define COORDONNEES_DES_VOISINS(index,coordonnee) \ ASD1(LISTE_DES_VOISINS(index) \ ,coordonnee \ ) /* Acces a la liste des voisins (introduit le 20150813130734). */ #define cXA \ SOUS(ASD1(point_central_courant,x),amplitude_X) #define cXB \ ADD2(ASD1(point_central_courant,x),amplitude_X) #define cXC \ cXB #define cXD \ cXA #define cXE \ cXA #define cXF \ cXB #define cXG \ cXC #define cXH \ cXD #define cYA \ SOUS(ASD1(point_central_courant,y),amplitude_Y) #define cYB \ cYA #define cYC \ ADD2(ASD1(point_central_courant,y),amplitude_Y) #define cYD \ cYC #define cYE \ cYA #define cYF \ cYB #define cYG \ cYC #define cYH \ cYD #define cZA \ SOUS(ASD1(point_central_courant,z),amplitude_Z) #define cZB \ cZA #define cZC \ cZA #define cZD \ cZA #define cZE \ ADD2(ASD1(point_central_courant,z),amplitude_Z) #define cZF \ cZE #define cZG \ cZE #define cZH \ cZE #define cX_AD__ \ CHOI(cXA,cXD) #define cX_AEHD \ CHOZ(cXA,cXE,cXH,cXD) #define cX_AE__ \ CHOI(cXA,cXE) #define cX_BC__ \ CHOI(cXB,cXC) #define cX_BFGC \ CHOZ(cXB,cXF,cXG,cXC) #define cX_BF__ \ CHOI(cXB,cXF) #define cX_CG__ \ CHOI(cXC,cXG) #define cX_DH__ \ CHOI(cXD,cXH) #define cX_EH__ \ CHOI(cXE,cXH) #define cX_FG__ \ CHOI(cXF,cXG) #define cY_ABFE \ CHOZ(cYA,cYB,cYF,cYE) #define cY_AB__ \ CHOI(cYA,cYB) #define cY_AE__ \ CHOI(cYA,cYE) #define cY_BF__ \ CHOI(cYB,cYF) #define cY_CD__ \ CHOI(cYC,cYD) #define cY_CG__ \ CHOI(cYC,cYG) #define cY_DCGH \ CHOZ(cYD,cYC,cYG,cYH) #define cY_DH__ \ CHOI(cYD,cYH) #define cY_EF__ \ CHOI(cYE,cYF) #define cY_GH__ \ CHOI(cYG,cYH) #define cZ_ABCD \ CHOZ(cZA,cZB,cZC,cZD) #define cZ_AB__ \ CHOI(cZA,cZB) #define cZ_AD__ \ CHOI(cZA,cZD) #define cZ_BC__ \ CHOI(cZB,cZC) #define cZ_DC__ \ CHOI(cZD,cZC) #define cZ_EFGH \ CHOZ(cZE,cZF,cZG,cZH) #define cZ_EF__ \ CHOI(cZE,cZF) #define cZ_EH__ \ CHOI(cZE,cZH) #define cZ_FG__ \ CHOI(cZF,cZG) #define cZ_HG__ \ CHOI(cZH,cZG) /* Definition du cube courant de centre 'point_central_courant' : */ /* */ /* */ /* H ---------- G */ /* */ /* / . / | */ /* / . / | */ /* / . / | */ /* . | */ /* D ---------- C | */ /* */ /* | E .....|.... F */ /* | | */ /* | . | / */ /* | . | / */ /* | . | / */ /* */ /* A ---------- B */ /* */ #define distance_minimale_locale_entre_deux_points \ distance_minimale_entre_deux_points #define distance_maximale_locale_entre_deux_points \ distance_maximale_entre_deux_points #include xrv/PointsVoisins_2D.01.I" #define PARCOURS_D_UNE_STRUCTURE_LINEAIRE(x1,x2,y1,y2,z1,z2) \ Bblock \ Test(IL_FAUT(iterer_la_recherche_des_voisins_du_point_central_courant)) \ /* Ce test apparemment redondant est la pour des raisons d'optimisation... */ \ Bblock \ begin_albumQ(DoIn,MIN2(z1,z2),MAX2(z1,z2),PasZ \ ,DoIn,MIN2(y1,y2),MAX2(y1,y2),PasY \ ,DoIn,MIN2(x1,x2),MAX2(x1,x2),PasX \ ) \ /* Parcours d'un sous-ensemble du cube {{x1,x2},{y1,y2},{z1,z2}}, */ \ Bblock \ Test(IL_FAUT(iterer_la_recherche_des_voisins_du_point_central_courant)) \ /* Ce test apparemment redondant est la pour des raisons d'optimisation... */ \ Bblock \ DEFV(Int,INIT(X_effectif,X)); \ DEFV(Int,INIT(Y_effectif,Y)); \ DEFV(Int,INIT(Z_effectif,Z)); \ /* Introduit le 20150813113406 en prevision d'une possible extension en autorisant en */ \ /* plus des cubes concentriques, des spheres concentriques qui auraient l'avantage, par */ \ /* rapport aux cubes, de permettre une recherche isotrope... */ \ \ Test(IL_FAUT(utiliser_des_spheres_plutot_que_des_cubes)) \ /* Test introduit le 20150813180227... */ \ Bblock \ DEFV(Float,INIT(delta_X,FLOT(SOUS(ASD1(point_central_courant,x),X_effectif)))); \ DEFV(Float,INIT(delta_Y,FLOT(SOUS(ASD1(point_central_courant,y),Y_effectif)))); \ DEFV(Float,INIT(delta_Z,FLOT(SOUS(ASD1(point_central_courant,z),Z_effectif)))); \ DEFV(Float,INIT(phi_,FLOT__UNDEF)); \ DEFV(Float,INIT(theta,FLOT__UNDEF)); \ \ EGAL(phi_,Phi_3D(delta_X,delta_Y,delta_Z)); \ EGAL(theta,Theta_3D(delta_X,delta_Y,delta_Z)); \ /* On notera que : */ \ /* */ \ /* EGAL(rho_,Rho_3D(delta_X,delta_Y,delta_Z)); */ \ /* */ \ /* serait inutile puisque l'on va forcer 'rayon_des_spheres' juste apres... */ \ \ EGAL(X_effectif \ ,ADD2(ASD1(point_central_courant,x) \ ,INTE(Xcartesienne_3D(rayon_des_spheres,phi_,theta)) \ ) \ ); \ EGAL(Y_effectif \ ,ADD2(ASD1(point_central_courant,y) \ ,INTE(Ycartesienne_3D(rayon_des_spheres,phi_,theta)) \ ) \ ); \ EGAL(Z_effectif \ ,ADD2(ASD1(point_central_courant,z) \ ,INTE(Zcartesienne_3D(rayon_des_spheres,phi_,theta)) \ ) \ ); \ /* Ainsi, on ramene les points du cube a la surface de la sphere inscrite. Au passage, */ \ /* il y a moins de points sur une sphere quantifiee que sur un cube lui-aussi quantifie */ \ /* et c'est cela qui a necessite la mise en place de 'LISTE_DES_VOISINS(...)'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(I3ET(IFEQ(X_effectif,ASD1(point_central_courant,x)) \ ,IFEQ(Y_effectif,ASD1(point_central_courant,y)) \ ,IFEQ(Z_effectif,ASD1(point_central_courant,z)) \ ) \ ) \ Bblock \ /* Cas ou l'on est sur le point central qui ne peut donc etre son propre voisin... */ \ /* */ \ /* On notera que ce test est peut-etre inutile a cause de l'intialisation qui est faite */ \ /* de {amplitude_X,amplitude_Y,amplitude_Z} et qui est telle que le point {X,Y,Z} ne peut */ \ /* jamais etre le point central (on commence par le plus petit carre le contenant...). */ \ /* Malgre tout, il est preferable de le conserver, on ne sait jamais... */ \ Eblock \ ATes \ Bblock \ Test(TEST_DANS_L_ALBUM(X_effectif,Y_effectif,Z_effectif)) \ Bblock \ Test(IFEQ(Aload_point(album_d_images,X_effectif,Y_effectif,Z_effectif) \ ,niveau_des_points \ ) \ ) \ /* Le point {X_effectif,Y_effectif,Z_effectif} est un voisin possible, mais il a peut-etre */ \ /* ete deja rencontre... */ \ Bblock \ DEFV(Logical,INIT(ce_voisin_a_deja_ete_rencontre,FAUX)); \ \ Test(IL_NE_FAUT_PAS(compatibilite_20150813)) \ /* Test introduit le 20150813172627... */ \ Bblock \ DEFV(Int,INIT(index_des_voisins,UNDEF)); \ \ DoIn(index_des_voisins \ ,PREMIER_VOISIN \ ,LSTX(PREMIER_VOISIN,nombre_de_voisins_trouves) \ ,I \ ) \ Bblock \ Test(IFEQ_Rpoints3D(X_effectif \ ,Y_effectif \ ,Z_effectif \ ,COORDONNEES_DES_VOISINS(index_des_voisins,x) \ ,COORDONNEES_DES_VOISINS(index_des_voisins,y) \ ,COORDONNEES_DES_VOISINS(index_des_voisins,z) \ ) \ ) \ Bblock \ EGAL(ce_voisin_a_deja_ete_rencontre,VRAI); \ /* Ce voisin a deja ete rencontre dans cette structure... */ \ /* */ \ /* On notera que ce dispositif est utile aussi avec les cubes "concentriques" car, en */ \ /* effet, les sommets et les aretes sont explorees plusieurs fois puisqu'ils appartiennent */ \ /* a plusieurs aretes et plusieurs faces... */ \ /* */ \ /* Le 20150814071404 je note d'ailleurs qu'avant ce dispositif certains points devenaient */ \ /* des voisins multiples (appartenant donc a des aretes ou des sommets de cube). Cela */ \ /* faisait donc qu'ils comptaient pour plusieurs voisins (alors donc qu'ils etaient */ \ /* identiques) et ainsi on n'atteignait pas 'nombre_de_voisins_cherches' avec des voisins */ \ /* tous differents, ce qui est donc maintenant le cas... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ EDoI \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(EST_FAUX(ce_voisin_a_deja_ete_rencontre)) \ /* Test introduit le 20150813130734... */ \ Bblock \ /* Cas ou le point courant est un "bon" voisin du point central courant : */ \ DEFV(Float,INIT(coordonnee_X1 \ ,_____cNORMALISE_OX(ASD1(point_central_courant,x)) \ ) \ ); \ DEFV(Float,INIT(coordonnee_Y1 \ ,_____cNORMALISE_OY(ASD1(point_central_courant,y)) \ ) \ ); \ DEFV(Float,INIT(coordonnee_Z1 \ ,_____cNORMALISE_OZ(ASD1(point_central_courant,z)) \ ) \ ); \ DEFV(Float,INIT(coordonnee_X2,_____cNORMALISE_OX(X_effectif))); \ DEFV(Float,INIT(coordonnee_Y2,_____cNORMALISE_OY(Y_effectif))); \ DEFV(Float,INIT(coordonnee_Z2,_____cNORMALISE_OZ(Z_effectif))); \ \ DEFV(Int,INIT(save_nombre_de_voisins_trouves,nombre_de_voisins_trouves)); \ \ EDITION_D_UN_POINT_VOISIN; \ /* Edition d'un nouveau voisin et comptage... */ \ \ Test(IFET(IL_NE_FAUT_PAS(compatibilite_20150813) \ ,IFGT(nombre_de_voisins_trouves,save_nombre_de_voisins_trouves) \ ) \ ) \ /* Cas ou un voisin a ete trouve : */ \ Bblock \ INITIALISATION_POINT_3D(LISTE_DES_VOISINS(LSTX(PREMIER_VOISIN \ ,nombre_de_voisins_trouves \ ) \ ) \ ,X_effectif \ ,Y_effectif \ ,Z_effectif \ ); \ /* Memorisation du nouveau voisin... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ \ INCR(nombre_de_points_testes,I); \ /* Comptage des points testes (meme ceux qui sont hors album et ce afin de ne pas creer */ \ /* d'effets de bord...). */ \ \ Test(IFET(IFLT(nombre_de_points_testes,nombre_maximal_de_points_a_tester) \ ,IFLT(nombre_de_voisins_trouves,nombre_de_voisins_cherches) \ ) \ ) \ Bblock \ Eblock \ ATes \ Bblock \ EGAL(iterer_la_recherche_des_voisins_du_point_central_courant,FAUX); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ end_albumQ(EDoI,EDoI,EDoI) \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Procedure de parcours d'une structure lineaire tridimensionnelle. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E C H E R C H E T R I D I M E N S I O N N E L L E D E P O I N T S V O I S I N S D A N S U N A L B U M : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Logical,INIT(compatibilite_20150813,COMPATIBILITE_20150813)); /* Permet de faire des calculs compatibles a ceux faits anterieurement au 20150813172627... */ #include xrv/ARITHMET.22.I" #include xci/valeurs.03.I" DEFV(CHAR,INIT(POINTERc(nom_imageA),NOM_PIPE_Local)); /* Nom des images. */ DEFV(CHAR,INIC(POINTERc(nom_postfixe),NOM_UNDEF_VIDE)); /* Nom d'un eventuel postfixe a placer derriere <nom_imageA><numero> (par exemple '$ROUGE'). */ DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(Int,INIT(nombre_de_chiffres,NOMBRE_DE_CHIFFRES)); /* Nombre de chiffres codant le numero des images de la serie... */ DEFV(Logical,INIT(utiliser_des_spheres_plutot_que_des_cubes,UTILISER_DES_SPHERES_PLUTOT_QUE_DES_CUBES)); /* Doit-on utiliser des cubes "concentriques" ('FAUX') ou bien des spheres concentriques */ /* ('VRAI'). Ceci a ete introduit le 20150813175902... */ DEFV(genere_p,INIT(niveau_des_points,NIVEAU_DES_POINTS)); /* Niveau des points a etudier... */ DEFV(Positive,INIT(nombre_de_voisins_cherches,NOMBRE_DE_VOISINS_CHERCHES)); /* Nombre de voisins recherches. */ DEFV(Positive,INIT(nombre_maximal_de_points_a_tester,NOMBRE_MAXIMAL_DE_POINTS_A_TESTER)); /* Nombre maximal de points a tester autour de chaque point de 'niveau_des_points'. */ DEFV(Float,INIT(distance_minimale_entre_deux_points,DISTANCE_MINIMALE_ENTRE_DEUX_POINTS)); DEFV(Float,INIT(distance_maximale_entre_deux_points,DISTANCE_MAXIMALE_ENTRE_DEUX_POINTS)); /* Distances extremales entre deux points voisins (le minimum a ete introduit */ /* 20150812093727). */ DEFV(Logical,INIT(trier_les_deux_points_dans_un_couple,TRIER_LES_DEUX_POINTS_DANS_UN_COUPLE)); /* Faut-il trier les deux points d'un couple {A,B} de facon a ce que {B,A} apparaissent */ /* sous la forme {A,B} ('VRAI') ou pas ('FAUX') ? */ /*..............................................................................................................................*/ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20150813=",compatibilite_20150813); PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers"); Eblock ) ); PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01; GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("postfixe=",nom_postfixe); GET_ARGUMENT_I("premiere=",premiere_image); GET_ARGUMENT_I("pas=",pas_des_images); /* ATTENTION, jusqu'au 20150813122542, il y avait ici : */ /* */ /* GET_ARGUMENTS2_I("pas=",pas_des_images,pasZ); */ /* */ /* mais etant donne que partout, ce sont {PasX,PasY,PasZ} qui sont utilises, mieux vaut */ /* ne pas modifier 'pasZ' ici... */ GET_ARGUMENT_I("chiffres=",nombre_de_chiffres); GET_ARGUMENT_L("spheres=""sp=",utiliser_des_spheres_plutot_que_des_cubes); GET_ARGUMENT_N("cubes=""cu=",utiliser_des_spheres_plutot_que_des_cubes); /* Arguments introduits le 20150813175902... */ GET_ARGUMENT_P("niveau=""n=",niveau_des_points); GET_ARGUMENT_I("nombre_voisins=""nv=",nombre_de_voisins_cherches); GET_ARGUMENT_I("nombre_points=""np=",nombre_maximal_de_points_a_tester); GET_ARGUMENT_F("distance_minimale=""dm=",distance_minimale_entre_deux_points); GET_ARGUMENT_F("distance_maximale=""dM=",distance_maximale_entre_deux_points); GET_ARGUMENT_L("trier_couple=""trier=""tc=",trier_les_deux_points_dans_un_couple); ) ); begin_nouveau_block Bblock BDEFV(album,album_d_images); /* Definition de l'album d'images a explorer. */ CALi(dAload_album(album_d_images ,nom_imageA ,nom_postfixe ,premiere_image ,pas_des_images ,nombre_de_chiffres ,FAUX ,UNDEF ,FAUX ) ); Test(PAS_D_ERREUR(CODE_ERREUR)) Bblock begin_album Bblock Test(IFEQ(Aload_point(album_d_images,X,Y,Z),niveau_des_points)) Bblock DEFV(Logical,INIT(iterer_la_recherche_des_voisins_du_point_central_courant,VRAI)); /* Controle des iterations... */ DEFV(Int,INIT(nombre_de_voisins_trouves,ZERO)); DEFV(Int,INIT(nombre_de_points_testes,ZERO)); /* Compteurs divers... */ DEFV(Int,INIT(amplitude_X,AMPLITUDE_XYZ)); DEFV(Int,INIT(amplitude_Y,AMPLITUDE_XYZ)); DEFV(Int,INIT(amplitude_Z,AMPLITUDE_XYZ)); /* Pour definir les surfaces des cubes imbriques les uns dans les autres, a la facon d'un */ /* oignon cubique. On notera au passage que l'on ne commence pas par un cube "nul" car, */ /* en effet, il ne contiendrait qu'un seul point, le 'point_central_courant', qui ne peut */ /* etre evidemment son propre voisin (c'est cela qui rend "un peu" redondant un test contenu */ /* dans 'PARCOURS_D_UNE_STRUCTURE_LINEAIRE(...)' concernant le 'point_central_courant', mais */ /* qui est malgre tout conserve : on ne sait jamais...). */ DEFV(Int,INIT(rayon_des_spheres,UNDEF)); /* Pour definir les surfaces des imbriquees les unes dans les autres... */ DEFV(pointI_3D,point_central_courant); DEFV(pointI_3D,DdTb1(POINTERs ,liste_des_voisins_du_point_courant ,nombre_de_voisins_cherches ,tMalo(MUL2(nombre_de_voisins_cherches,SIZE(pointI_3D)),pointI_3D) ) ); /* Definition et allocation du vecteur contenant les voisins du point courant. */ EGAL(rayon_des_spheres,CHOY(amplitude_X,amplitude_Y,amplitude_Z)); /* Initialisation du rayon des spheres... */ INITIALISATION_POINT_3D(point_central_courant,X,Y,Z); begin_nouveau_block Bblock DEFV(Int,INIT(index_des_voisins,UNDEF)); DoIn(index_des_voisins,PREMIER_VOISIN,LSTX(PREMIER_VOISIN,nombre_de_voisins_cherches),I) Bblock INITIALISATION_POINT_3D(LISTE_DES_VOISINS(INDX(index_des_voisins,PREMIER_VOISIN)) ,PREX(Xmin) ,PREY(Ymin) ,PREZ(Zmin) ); /* Initialisation de la liste des voisins sur un point impossible (hors album...). En fait, */ /* cela ne sert a rien, mais c'est plus propre... */ Eblock EDoI Eblock end_nouveau_block Tant(IL_FAUT(iterer_la_recherche_des_voisins_du_point_central_courant)) Bblock /* Definition du cube courant de centre 'point_central_courant' : */ /* */ /* */ /* H ---------- G */ /* */ /* / . / | */ /* / . / | */ /* / . / | */ /* . | */ /* D ---------- C | */ /* */ /* | E .....|.... F */ /* | | */ /* | . | / */ /* | . | / */ /* | . | / */ /* */ /* A ---------- B */ /* */ PARCOURS_D_UNE_STRUCTURE_LINEAIRE(cX_AD__,cX_BC__ ,cY_AB__,cY_CD__ ,cZ_ABCD,cZ_ABCD ); /* Exploration de la face {A,B,C,D} (verticale avant). */ PARCOURS_D_UNE_STRUCTURE_LINEAIRE(cX_EH__,cX_FG__ ,cY_EF__,cY_GH__ ,cZ_EFGH,cZ_EFGH ); /* Exploration de la face {E,F,G,H} (verticale arriere). */ PARCOURS_D_UNE_STRUCTURE_LINEAIRE(cX_AEHD,cX_AEHD ,cY_AE__,cY_DH__ ,cZ_AD__,cZ_EH__ ); /* Exploration de la face {A,E,H,D} (verticale gauche). */ PARCOURS_D_UNE_STRUCTURE_LINEAIRE(cX_BFGC,cX_BFGC ,cY_BF__,cY_CG__ ,cZ_BC__,cZ_FG__ ); /* Exploration de la face {B,F,G,C} (verticale droite). */ PARCOURS_D_UNE_STRUCTURE_LINEAIRE(cX_AE__,cX_BF__ ,cY_ABFE,cY_ABFE ,cZ_AB__,cZ_EF__ ); /* Exploration de la face {A,B,F,E} (horizontale dessous). */ PARCOURS_D_UNE_STRUCTURE_LINEAIRE(cX_DH__,cX_CG__ ,cY_DCGH,cY_DCGH ,cZ_DC__,cZ_HG__ ); /* Exploration de la face {D,C,G,H} (horizontale dessus). */ INCR(amplitude_X,PasX); INCR(amplitude_Y,PasY); INCR(amplitude_Z,PasZ); /* Passage a un cube "superieur" (c'est-a-dire englobant les cubes precedents...). */ INCR(rayon_des_spheres,CHOY(PasX,PasY,PasZ)); /* Passage a une sphere "superieure" (si besoin est...). */ Eblock ETan FdTb1(liste_des_voisins_du_point_courant,nombre_de_voisins_cherches,pointI_3D,ADRESSE_PLUS_DEFINIE); /* Liberation du vecteur contenant la liste des voisins. */ Eblock ATes Bblock Eblock ETes Eblock end_album Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes EDEFV(album,album_d_images); /* Definition de l'album d'images a explorer. */ Eblock end_nouveau_block RETU_Commande; Eblock ECommande