_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S Q U I N E P E U V E N T E T R E D E S " D E F I N E S " : */ /* */ /* */ /* Definition : */ /* */ /* Dans ce fichier, se trouvent toutes */ /* les fonctions primitives d'acces aux */ /* pixels d'une image qui ne peuvent */ /* etre des "defines" pour des raisons */ /* de compilation... */ /* */ /* */ /* N O T A T I O N S : */ /* */ /* */ /* On notera 'imageA' les images Arguments, */ /* et 'imageR' les images Resultats ; 'arg' */ /* designera des arguments, et 'Vf' une */ /* fonction "variable"... */ /* */ /* */ /* Author of '$xiipf/fonction.3$FON' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19870000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N D ' U N E A B S C I S S E E N U N I N D I C E : */ /* */ /*************************************************************************************************************************************/ BFonctionI /* Je note le 20170712164739 que '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' ne doit pas */ /* etre teste ici afin de rendre la fonction 'Findice_X(...)' conditionnelle car, en effet, */ /* les librairies n'utilisent pas toutes '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' a un */ /* instant donne... */ DEFV(Common,DEFV(FonctionI,Findice_X(X,Y))) DEFV(Argument,DEFV(Int,X)); DEFV(Argument,DEFV(Int,Y)); /* Abscisse 'X' et ordonnee 'Y' courantes. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(INDX(MODU(ADD2(INTX(DEFORMATION_OX(X,Y)) ,translationX ) ,Xmin ,Xmax ) ,Xmin ) ); Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N D ' U N E O R D O N N E E E N U N I N D I C E : */ /* */ /*************************************************************************************************************************************/ BFonctionI /* Je note le 20170712164739 que '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' ne doit pas */ /* etre teste ici afin de rendre la fonction 'Findice_Y(...)' conditionnelle car, en effet, */ /* les librairies n'utilisent pas toutes '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' a un */ /* instant donne... */ DEFV(Common,DEFV(FonctionI,Findice_Y(X,Y))) DEFV(Argument,DEFV(Int,X)); DEFV(Argument,DEFV(Int,Y)); /* Abscisse 'X' et ordonnee 'Y' courantes. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(INDX(MODU(ADD2(INTY(DEFORMATION_OY(X,Y)) ,translationY ) ,Ymin ,Ymax ) ,Ymin ) ); Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N D ' U N E P R O F O N D E U R E N U N I N D I C E : */ /* */ /*************************************************************************************************************************************/ BFonctionI /* Je note le 20170712164739 que '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' ne doit pas */ /* etre teste ici afin de rendre la fonction 'Findice_Z(...)' conditionnelle car, en effet, */ /* les librairies n'utilisent pas toutes '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' a un */ /* instant donne... */ DEFV(Common,DEFV(FonctionI,Findice_Z(X,Y,Z))) DEFV(Argument,DEFV(Int,X)); DEFV(Argument,DEFV(Int,Y)); DEFV(Argument,DEFV(Int,Z)); /* Abscisse 'X', ordonnee 'Y' et profondeur 'Z' courantes. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(INDX(MODU(ADD2(INTZ(DEFORMATION_OZ(X,Y,Z)) ,translationZ ) ,Zmin ,Zmax ) ,Zmin ) ); Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N D ' U N T E M P S E N U N I N D I C E : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,Findice_T(X,Y,Z,T))) DEFV(Argument,DEFV(Int,X)); DEFV(Argument,DEFV(Int,Y)); DEFV(Argument,DEFV(Int,Z)); DEFV(Argument,DEFV(Int,T)); /* Abscisse 'X', ordonnee 'Y', profondeur 'Z' et temps 'T' courants. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(INDX(MODU(ADD2(INTT(DEFORMATION_OT(X,Y,Z,T)) ,translationT ) ,Tmin ,Tmax ) ,Tmin ) ); Eblock EFonctionI _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E N O R M A L I S A T I O N D E L A C O O R D O N N E E ' X ' : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,fV_cDENORMALISE_OX(Xf))) /* Fonction introduite le 20101119132724 pour alleger 'v $ximcf/conformes$FON'. */ DEFV(Argument,DEFV(Float,Xf)); /* Abscisse 'X' courante. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(V_cDENORMALISE_OX(Xf)); Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E N O R M A L I S A T I O N D E L A C O O R D O N N E E ' Y ' : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,fV_cDENORMALISE_OY(Yf))) /* Fonction introduite le 20101119132724 pour alleger 'v $ximcf/conformes$FON'. */ DEFV(Argument,DEFV(Float,Yf)); /* Ordonnee 'Y' courante. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(V_cDENORMALISE_OY(Yf)); Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E N O R M A L I S A T I O N D E L A C O O R D O N N E E ' Z ' : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,fV_cDENORMALISE_OZ(Zf))) /* Fonction introduite le 20120323072315 par symetrie avec 'fV_cDENORMALISE_OX(...)' et */ /* 'fV_cDENORMALISE_OY(...)'. */ DEFV(Argument,DEFV(Float,Zf)); /* Profondeur 'Z' courante. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(V_cDENORMALISE_OZ(Zf)); Eblock EFonctionI _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O R M A L I S A T I O N Q U E L C O N Q U E S U R L ' A X E ' OX ' : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(Float,SINT(f____cNORMALISE_OX_____borne_inferieure,COORDONNEE_BARYCENTRIQUE_MINIMALE))); DEFV(Common,DEFV(Float,SINT(f____cNORMALISE_OX_____borne_superieure,COORDONNEE_BARYCENTRIQUE_MAXIMALE))); /* Bornes de normalisation courantes. */ DEFV(Common,DEFV(FonctionF,f____cNORMALISE_OX(cX))) /* Fonction introduite le 20120323072315 par symetrie avec 'f____cNORMALISE_OZ(...)'. */ DEFV(Argument,DEFV(Int,cX)); /* Abscisse 'cX' courante. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(DENO(_____cNORMALISE_OX(cX) ,f____cNORMALISE_OX_____borne_inferieure ,f____cNORMALISE_OX_____borne_superieure ) ); Eblock EFonctionF BFonctionF DEFV(Common,DEFV(Float,SINT(f____lNORMALISE_OX_____borne_inferieure,COORDONNEE_BARYCENTRIQUE_MINIMALE))); DEFV(Common,DEFV(Float,SINT(f____lNORMALISE_OX_____borne_superieure,COORDONNEE_BARYCENTRIQUE_MAXIMALE))); /* Bornes de normalisation courantes. */ DEFV(Common,DEFV(FonctionF,f____lNORMALISE_OX(lX))) /* Fonction introduite le 20120323072315 par symetrie avec 'f____cNORMALISE_OX(...)'. */ DEFV(Argument,DEFV(Int,lX)); /* Longueur 'cX' courante. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(DENO(_____lNORMALISE_OX(lX) ,f____lNORMALISE_OX_____borne_inferieure ,f____lNORMALISE_OX_____borne_superieure ) ); Eblock EFonctionF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O R M A L I S A T I O N Q U E L C O N Q U E S U R L ' A X E ' OY ' : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(Float,SINT(f____cNORMALISE_OY_____borne_inferieure,COORDONNEE_BARYCENTRIQUE_MINIMALE))); DEFV(Common,DEFV(Float,SINT(f____cNORMALISE_OY_____borne_superieure,COORDONNEE_BARYCENTRIQUE_MAXIMALE))); /* Bornes de normalisation courantes. */ DEFV(Common,DEFV(FonctionF,f____cNORMALISE_OY(cY))) /* Fonction introduite le 20120323072315 par symetrie avec 'f____cNORMALISE_OZ(...)'. */ DEFV(Argument,DEFV(Int,cY)); /* Ordonnee 'cY' courante. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(DENO(_____cNORMALISE_OY(cY) ,f____cNORMALISE_OY_____borne_inferieure ,f____cNORMALISE_OY_____borne_superieure ) ); Eblock EFonctionF BFonctionF DEFV(Common,DEFV(Float,SINT(f____lNORMALISE_OY_____borne_inferieure,COORDONNEE_BARYCENTRIQUE_MINIMALE))); DEFV(Common,DEFV(Float,SINT(f____lNORMALISE_OY_____borne_superieure,COORDONNEE_BARYCENTRIQUE_MAXIMALE))); /* Bornes de normalisation courantes. */ DEFV(Common,DEFV(FonctionF,f____lNORMALISE_OY(lY))) /* Fonction introduite le 20120323072315 par symetrie avec 'f____cNORMALISE_OY(...)'. */ DEFV(Argument,DEFV(Int,lY)); /* Longueur 'cY' courante. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(DENO(_____lNORMALISE_OY(lY) ,f____lNORMALISE_OY_____borne_inferieure ,f____lNORMALISE_OY_____borne_superieure ) ); Eblock EFonctionF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O R M A L I S A T I O N Q U E L C O N Q U E S U R L ' A X E ' OZ ' : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(Float,SINT(f____cNORMALISE_OZ_____borne_inferieure,COORDONNEE_BARYCENTRIQUE_MINIMALE))); DEFV(Common,DEFV(Float,SINT(f____cNORMALISE_OZ_____borne_superieure,COORDONNEE_BARYCENTRIQUE_MAXIMALE))); /* Bornes de normalisation courantes. */ DEFV(Common,DEFV(FonctionF,f____cNORMALISE_OZ(cZ))) /* Fonction introduite le 20120323072315 lors de l'etude du probleme decrit dans */ /* 'v $xiii/di_album$FON 20120321113814'... */ DEFV(Argument,DEFV(Int,cZ)); /* Profondeur 'cZ' courante. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(DENO(_____cNORMALISE_OZ(cZ) ,f____cNORMALISE_OZ_____borne_inferieure ,f____cNORMALISE_OZ_____borne_superieure ) ); Eblock EFonctionF BFonctionF DEFV(Common,DEFV(Float,SINT(f____lNORMALISE_OZ_____borne_inferieure,COORDONNEE_BARYCENTRIQUE_MINIMALE))); DEFV(Common,DEFV(Float,SINT(f____lNORMALISE_OZ_____borne_superieure,COORDONNEE_BARYCENTRIQUE_MAXIMALE))); /* Bornes de normalisation courantes. */ DEFV(Common,DEFV(FonctionF,f____lNORMALISE_OZ(lZ))) /* Fonction introduite le 20120323072315 par symetrie avec 'f____cNORMALISE_OZ(...)'. */ DEFV(Argument,DEFV(Int,lZ)); /* Longueur 'cZ' courante. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(DENO(_____lNORMALISE_OZ(lZ) ,f____lNORMALISE_OZ_____borne_inferieure ,f____lNORMALISE_OZ_____borne_superieure ) ); Eblock EFonctionF _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O M P L E M E N T A T I O N D ' U N E V A L E U R : */ /* */ /* Definition : */ /* */ /* Cette fonction 'FCOMP' est */ /* introduite en plus du "define" */ /* 'VCOMP' a cause de l'ordre des */ /* references a 'COMP', et en par- */ /* ticulier dans 'FMINMAX' (dans */ /* les fonctions de combinaison des */ /* niveaux entre eux...). */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,FCOMP(argument))) DEFV(Argument,DEFV(genere_p,argument)); /* Argument. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(VCOMP(argument)); Eblock EFonctionP _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R C O U R S C I R C U L A I R E D ' U N E S P I R A L E C A R R E E : */ /* */ /* */ /* Definition : */ /* */ /* Cette fonction permet de calculer */ /* les coordonnees successives des points */ /* 'point_de_numero_cherche_relatif_au_centre' situes */ /* sur une spirale "carree" (telle que definie */ /* dans 'v $xiii/begin_end$DEF "S.P.I.R.A.L.E"') */ /* mais de facon a ce qu'ils soient obtenus dans */ /* dans le sens trigonometrique et de plus par */ /* distance croissante par rapport au centre de */ /* la spirale. Enfin, cette fonction s'inspire */ /* des programmes 'v $xtc/SpiLogCar.01$c', */ /* 'v $xtc/SpiLogCar.11$c' et 'v $xtc/SpiLogCar.12$c'. */ /* */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * ** * * * * * ** * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * ** * * * * * ** */ /* * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* */ /* ATTENTION : */ /* */ /* Il ne faut pas confondre le parcours */ /* circulaire d'une spirale carree avec, par */ /* exemple, un noyau de convolution circulaire */ /* ('v $xiii/di_image$FON 20060606125544'). */ /* */ /*************************************************************************************************************************************/ BFonctionI #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ DEFV(Common,DEFV(Logical,_____FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01)); #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ DEFV(Common,DEFV(Logical,_____FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02)); #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 DenumeT05(SPIRALE_CODE_DE_REENTREE_INITIAL ,SPIRALE_CODE_DE_REENTREE_1 ,SPIRALE_CODE_DE_REENTREE_2 ,SPIRALE_CODE_DE_REENTREE_3 ,SPIRALE_CODE_DE_REENTREE_4 ,codes_de_reentree_dans_Fparcours_circulaire_d_une_spirale_carree ) DEFV(Local,DEFV(Int,INIT(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree,UNDEF))); /* Code de reentree dans 'Fparcours_circulaire_d_une_spirale_carree(...)' apres en etre */ /* sorti... */ DEFV(Local,DEFV(Positive,INIT(numero_du_point_courant,UNDEF))); /* Numero du point courant. */ DEFV(Local,DEFV(Int,INIT(carre_de_la_distance_au_centre,UNDEF))); /* Definition du carre de la distance. */ DEFV(Local,DEFV(pointI_2D,point_courant_relatif_au_centre)); /* Definition des coordonnees courantes. */ # define LE_POINT_COURANT_EST_IL_ATTEINT(code_de_reentree,condition_d_acceptation_du_point_courant,X,Y) \ Bblock \ Test(condition_d_acceptation_du_point_courant) \ Bblock \ INITIALISATION_POINT_2D(point_satisfaisant_relatif_au_centre,X,Y); \ /* Mise en place d'un point satisfaisant... */ \ EGAL(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree,SPIRALE_CODE_DE_REENTREE_INITIAL); \ /* A priori, mise en place du code de reentree 'INITIAL'... */ \ \ Test(IFEQ(numero_du_point_courant,numero_du_point_courant_utilise)) \ Bblock \ EGAL(iterer,FAUX); \ /* Dans le cas ou le point satisfaisant est le point cherche, on s'arrete, */ \ EGAL(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree,code_de_reentree); \ /* Et on memorise l'emplacement du 'LE_POINT_COURANT_EST_IL_ATTEINT(...)' correspondant */ \ /* dans 'Fparcours_circulaire_d_une_spirale_carree(...)'. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ INCR(numero_du_point_courant,I); \ /* Comptage des points satisfaisants... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Procedure testant si le point cherche est atteint. */ #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 DEFV(Common,DEFV(Logical,ZINT(Fparcours_circulaire_d_une_spirale_carree_____compatibilite_2014082117,FAUX))); /* Introduit le 20140821171340 afin de permettre de retablir le comportement anterieur */ DEFV(Local,DEFV(Positive,INIT(une_initialisation_de_la_spirale_a_ete_faite,FAUX))); /* Afin de valider les requetes apres une initialisation... */ DEFV(Local,DEFV(Positive,INIT(nombre_de_points_de_la_spirale_initialisee,UNDEF))); /* Afin de valider les requetes apres une initialisation... */ DEFV(pointI_2D,DdTb1(POINTERs ,liste_des_points_de_la_spirale ,UNDEF ,ADRESSE_NON_ENCORE_DEFINIE ) ); /* Liste des points de la spirale... */ # define PREMIER_POINT_DE_LA_SPIRALE \ PREMIER_POINT # define DERNIER_POINT_DE_LA_SPIRALE \ Fparcours_circulaire_d_une_spirale_carree_____numero_du_dernier_point /* Introduits le 20141125091220... */ # define ACCES_AUX_POINTS_DE_LA_SPIRALE(numero) \ IdTb1(liste_des_points_de_la_spirale \ ,INDX(numero,PREMIER_POINT_DE_LA_SPIRALE) \ ,nombre_de_points_de_la_spirale_initialisee \ ) \ /* Procedure d'acces aux points de la spirale... */ DEFV(Common,DEFV(Positive,INIT(Fparcours_circulaire_d_une_spirale_carree_____numero_du_dernier_point,PREMIER_POINT_DE_LA_SPIRALE))); /* Numero du dernier point de la spirale (introduit le 20141124184050). */ # define LE_POINT_COURANT_EST_IL_ATTEINT(condition_d_acceptation_du_point_courant,X,Y) \ Bblock \ Test(IFLE(numero_du_point_courant \ ,LSTX(PREMIER_POINT_DE_LA_SPIRALE,nombre_de_points_de_la_spirale_initialisee) \ ) \ ) \ Bblock \ Test(condition_d_acceptation_du_point_courant) \ Bblock \ INITIALISATION_POINT_2D(ACCES_AUX_POINTS_DE_LA_SPIRALE(numero_du_point_courant),X,Y); \ /* Mise en place d'un point satisfaisant... */ \ \ EGAL(DERNIER_POINT_DE_LA_SPIRALE \ ,numero_du_point_courant \ ); \ /* Afin de memoriser le numero du dernier point (introduit le 20141124184050). */ \ \ INCR(numero_du_point_courant,I); \ /* Comptage des points satisfaisants... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("trop de points sont ranges dans la spirale courante"); \ CAL1(Prer1("nombre maximal de points=%d\n",nombre_de_points_de_la_spirale_initialisee)); \ CAL1(Prer1("numero du point courant =%d\n",numero_du_point_courant)); \ Eblock \ ETes \ Eblock \ /* Procedure testant si le point cherche est atteint. */ #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 DEFV(Common,DEFV(FonctionI,Fparcours_circulaire_d_une_spirale_carree(point_de_numero_cherche_relatif_au_centre ,numero_du_point_courant_cherche ,valeur_maximale_de_X_et_de_Y_relatifs ,initialiser_le_processus ,desinitialiser_le_processus ) ) ) DEFV(Argument,DEFV(pointI_2D,POINTERs(point_de_numero_cherche_relatif_au_centre))); /* Definition du couple {x,y} anterieur... */ DEFV(Argument,DEFV(Positive,numero_du_point_courant_cherche)); /* Numero du point courant recherche. */ DEFV(Argument,DEFV(Int,valeur_maximale_de_X_et_de_Y_relatifs)); /* Valeur maximale commune a 'X' et a 'Y' (puisque la spirale est carree...). */ DEFV(Argument,DEFV(Logical,initialiser_le_processus)); /* Indicateur d'initialisation a faire. */ DEFV(Argument,DEFV(Logical,desinitialiser_le_processus)); /* Indicateur de desinitialisation a faire. ATTENTION, cet indicateur n'a pas de sens en */ /* 'FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01' mais est mis malgre */ /* tout pour simplifier... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ DEFV(Positive,INIT(numero_du_point_courant_utilise,numero_du_point_courant_cherche)); /* Numero du point reellement utilise... */ #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 DEFV(Logical,INIT(iterer,VRAI)); /* Pour controler la boucle 'Tant(...)'. */ DEFV(pointI_2D,point_satisfaisant_relatif_au_centre); /* Definition des coordonnees courantes d'un point satisfaisant. */ #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 DEFV(Positive,INIT(nombre_de_points_de_la_spirale_courante ,NBRE(PREMIER_POINT_DE_LA_SPIRALE ,DERNIER_POINT_D_UNE_SPIRALE_CIRCULAIRE(valeur_maximale_de_X_et_de_Y_relatifs) ) ) ); /* Afin de valider les requetes apres une initialisation... */ DEFV(Positive,INIT(numero_du_point_courant,PREMIER_POINT_DE_LA_SPIRALE)); /* Numero du point courant initialise sur le premier point de la liste... */ DEFV(Int,INIT(carre_de_la_distance_au_centre,UNDEF)); /* Definition du carre de la distance. */ #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 /*..............................................................................................................................*/ Test(IFEXff(numero_du_point_courant_utilise ,PREMIER_POINT_DE_LA_SPIRALE ,DERNIER_POINT_D_UNE_SPIRALE_CIRCULAIRE(valeur_maximale_de_X_et_de_Y_relatifs) ) ) Bblock PRINT_ERREUR("le numero du point courant est hors limite (1)"); #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 PRINT_ERREUR("le processus va malheureusement entrer dans une boucle infinie"); #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 PRINT_ERREUR("on va utiliser le dernier point possible"); EGAL(numero_du_point_courant_utilise,DERNIER_POINT_D_UNE_SPIRALE_CIRCULAIRE(valeur_maximale_de_X_et_de_Y_relatifs)); #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 CAL1(Prer1("numero demande=%d\n",numero_du_point_courant_utilise)); CAL1(Prer1("borne inferieure=%d\n",PREMIER_POINT_DE_LA_SPIRALE)); CAL1(Prer1("borne superieure=%d\n",DERNIER_POINT_D_UNE_SPIRALE_CIRCULAIRE(valeur_maximale_de_X_et_de_Y_relatifs))); Eblock ATes Bblock Eblock ETes #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 Test(IL_FAUT(initialiser_le_processus)) Bblock /* Cas ou l'initialisation est necessaire : */ EGAL(numero_du_point_courant,PREMIER_POINT_DE_LA_SPIRALE); /* Numero du premier point... */ INITIALISATION_POINT_2D(point_courant_relatif_au_centre,Xmin,Ymin); EGAL(carre_de_la_distance_au_centre ,disI2D(Xmin,Ymin,ASD1(point_courant_relatif_au_centre,x),ASD1(point_courant_relatif_au_centre,y)) ); /* Initialisation du point relatif au centre de la spirale courant. */ EGAL(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree,SPIRALE_CODE_DE_REENTREE_INITIAL); Eblock ATes Bblock /* Cas ou l'initialisation a deja ete faite... */ Eblock ETes #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 Test(IL_FAUT(initialiser_le_processus)) Bblock /* Cas ou l'initialisation est demandee : */ Test(EST_VRAI(une_initialisation_de_la_spirale_a_ete_faite)) Bblock /* Cas ou une initialisation a deja ete faite : */ Test(IFNE(nombre_de_points_de_la_spirale_initialisee,nombre_de_points_de_la_spirale_courante)) Bblock FdTb1(liste_des_points_de_la_spirale ,nombre_de_points_de_la_spirale_initialisee ,pointI_2D ,ADRESSE_NON_ENCORE_DEFINIE ); /* Lorsque l'ancienne spirale et la nouvelle ne sont pas identiques, on rend l'espace */ /* alloue a l'ancienne, */ /* */ /* Le 'ADRESSE_NON_ENCORE_DEFINIE' a ete introduit le 20050221165319... */ EGAL(une_initialisation_de_la_spirale_a_ete_faite,FAUX); /* Puis on force une initialisation de facon a creer la nouvelle... */ Eblock ATes Bblock /* Cas ou l'ancienne spirale et la nouvelle sont identiques, il est alors inutile de */ /* reinitialiser... */ Eblock ETes Eblock ATes Bblock /* Cas ou il n'y a pas d'initialisation anterieure a celle qui est demandee ici... */ Eblock ETes /* ATTENTION, il est impossible de reunir les deux tests : */ /* */ /* Test(EST_VRAI(une_initialisation_de_la_spirale_a_ete_faite)) */ /* */ /* (qui precede) */ /* */ /* Test(EST_FAUX(une_initialisation_de_la_spirale_a_ete_faite)) */ /* */ /* (qui suit) a cause de la modification apportee eventuellement ci-dessus a l'indicateur */ /* 'une_initialisation_de_la_spirale_a_ete_faite'... */ Test(EST_FAUX(une_initialisation_de_la_spirale_a_ete_faite)) Bblock /* Cas ou l'initialisation est necessaire : */ EGAL(nombre_de_points_de_la_spirale_initialisee,nombre_de_points_de_la_spirale_courante); /* Nombre de points de la spirale a allouer... */ MdTb1(liste_des_points_de_la_spirale ,nombre_de_points_de_la_spirale_initialisee ,pointI_2D ,ADRESSE_NON_ENCORE_DEFINIE ); /* Allocation de la memoire, qui ne sera jamais rendue malheureusement... */ DoIn(carre_de_la_distance_au_centre ,disI2D(Xmin,Ymin,Xmin,Ymin) ,COND(IL_FAUT(Fparcours_circulaire_d_une_spirale_carree_____compatibilite_2014082117) ,disI2D(Xmin,Ymin,valeur_maximale_de_X_et_de_Y_relatifs,valeur_maximale_de_X_et_de_Y_relatifs) ,CHOI(disI2D(Xmin,Ymin,valeur_maximale_de_X_et_de_Y_relatifs,Ymin) ,disI2D(Xmin,Ymin,Xmin,valeur_maximale_de_X_et_de_Y_relatifs) ) ) ,I ) /* Ainsi, on parcourt toutes les distances possibles a l'interieur du cercle utile... */ /* Une erreur grossiere a ete corrigee le 20140821171340 : avant cette date, on utilisait */ /* la demi-diagonale du carre circonscrit et non pas son demi-cote... */ Bblock begin_imageQ(DoIn ,Ymin,valeur_maximale_de_X_et_de_Y_relatifs,pasY ,DoIn ,Xmin,valeur_maximale_de_X_et_de_Y_relatifs,pasX ) Bblock Test(IFEQ(disI2D(Xmin,Ymin,X,Y),carre_de_la_distance_au_centre)) Bblock LE_POINT_COURANT_EST_IL_ATTEINT(TOUJOURS_VRAI ,NEUT(X) ,NEUT(Y) ); /* Test du point {X,Y} dans le premier quadrant (de la spirale). */ LE_POINT_COURANT_EST_IL_ATTEINT(IFNE(X,Xmin) ,COXA(SOUS(Xmin,X)) ,NEUT(Y) ); /* Test du point {Xmin-X,Y} dans le deuxieme quadrant (de la spirale). */ LE_POINT_COURANT_EST_IL_ATTEINT(IFET(IFNE(X,Xmin) ,IFNE(Y,Ymin) ) ,COXA(SOUS(Xmin,X)) ,COYA(SOUS(Ymin,Y)) ); /* Test du point {Xmin-X,Ymin-Y} dans le troisieme quadrant (de la spirale). */ LE_POINT_COURANT_EST_IL_ATTEINT(IFNE(Y,Ymin) ,NEUT(X) ,COYA(SOUS(Ymin,Y)) ); /* Test du point {X,Ymin-Y} dans le quatrieme quadrant (de la spirale). */ Eblock ATes Bblock Eblock ETes Eblock end_imageQ(EDoI,EDoI) Eblock EDoI EGAL(une_initialisation_de_la_spirale_a_ete_faite,VRAI); /* Afin de savoir qu'au moins une initialisation a ete faite... */ Eblock ATes Bblock /* Cas ou l'initialisation a deja ete faite... */ Eblock ETes Eblock ATes Bblock /* Cas ou l'initialisation n'est pas demandee... */ Test(IL_NE_FAUT_PAS(desinitialiser_le_processus)) Bblock Test(IFEXff(numero_du_point_courant_utilise ,PREMIER_POINT_DE_LA_SPIRALE ,DERNIER_POINT_DE_LA_SPIRALE ) ) /* Test introduit le 20141125091220... */ Bblock PRINT_ERREUR("le numero du point courant est hors limite (2)"); CAL1(Prer1("numero demande=%d\n",numero_du_point_courant_utilise)); CAL1(Prer1("borne inferieure=%d\n",PREMIER_POINT_DE_LA_SPIRALE)); CAL1(Prer1("borne superieure=%d\n",DERNIER_POINT_DE_LA_SPIRALE)); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ETes #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 Tant(IL_FAUT(iterer)) Bblock Test(IFET(IFEQ(disI2D(Xmin,Ymin,ASD1(point_courant_relatif_au_centre,x),ASD1(point_courant_relatif_au_centre,y)) ,carre_de_la_distance_au_centre ) ,IFET(IFLE(ASD1(point_courant_relatif_au_centre,x),valeur_maximale_de_X_et_de_Y_relatifs) ,IFLE(ASD1(point_courant_relatif_au_centre,y),valeur_maximale_de_X_et_de_Y_relatifs) ) ) ) Bblock /* Cas ou le point courant 'point_courant_relatif_au_centre' est a la bonne distance du */ /* centre de la spirale (voir 'carre_de_la_distance_au_centre'), tout en etant sur la */ /* spirale (voir 'valeur_maximale_de_X_et_de_Y_relatifs'). Soit {X,Y} ce point... */ /* */ /* On trouvera ci-apres une spirale ou les points sont marques a l'aide du carre de la */ /* distance au centre de la spirale '0' : */ /* */ /* */ /* 8 5 4 5 8 */ /* / \ */ /* / \ */ /* 5 2 1 2 5 */ /* / \ */ /* / \ */ /* 4 1 0 1 4 */ /* \ / */ /* \ / */ /* 5 2 1 2 5 */ /* \ / */ /* \ / */ /* 8 5 4 5 8 */ /* */ /* */ /* l'ordre etant donne par le programme 'v $xtc/SpiLogCar.01$c'. */ LE_POINT_COURANT_EST_IL_ATTEINT(SPIRALE_CODE_DE_REENTREE_1 ,IFET(IFOU(IFEQ(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree ,SPIRALE_CODE_DE_REENTREE_INITIAL ) ,IFEQ(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree ,SPIRALE_CODE_DE_REENTREE_4 ) ) ,IL_FAUT(iterer) ) ,ASD1(point_courant_relatif_au_centre,x) ,ASD1(point_courant_relatif_au_centre,y) ); /* Test du point {X,Y} dans le premier quadrant (de la spirale). */ LE_POINT_COURANT_EST_IL_ATTEINT(SPIRALE_CODE_DE_REENTREE_2 ,IFET(IFOU(IFEQ(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree ,SPIRALE_CODE_DE_REENTREE_INITIAL ) ,IFLE(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree ,SPIRALE_CODE_DE_REENTREE_1 ) ) ,IFET(IL_FAUT(iterer) ,IFNE(ASD1(point_courant_relatif_au_centre,x),Xmin) ) ) ,COXA(SOUS(Xmin,ASD1(point_courant_relatif_au_centre,x))) ,ASD1(point_courant_relatif_au_centre,y) ); /* Test du point {Xmin-X,Y} dans le deuxieme quadrant (de la spirale). */ LE_POINT_COURANT_EST_IL_ATTEINT(SPIRALE_CODE_DE_REENTREE_3 ,IFET(IFOU(IFEQ(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree ,SPIRALE_CODE_DE_REENTREE_INITIAL ) ,IFLE(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree ,SPIRALE_CODE_DE_REENTREE_2 ) ) ,IFET(IL_FAUT(iterer) ,IFET(IFNE(ASD1(point_courant_relatif_au_centre,x),Xmin) ,IFNE(ASD1(point_courant_relatif_au_centre,y),Ymin) ) ) ) ,COXA(SOUS(Xmin,ASD1(point_courant_relatif_au_centre,x))) ,COYA(SOUS(Ymin,ASD1(point_courant_relatif_au_centre,y))) ); /* Test du point {Xmin-X,Ymin-Y} dans le troisieme quadrant (de la spirale). */ LE_POINT_COURANT_EST_IL_ATTEINT(SPIRALE_CODE_DE_REENTREE_4 ,IFET(IFOU(IFEQ(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree ,SPIRALE_CODE_DE_REENTREE_INITIAL ) ,IFLE(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree ,SPIRALE_CODE_DE_REENTREE_3 ) ) ,IFET(IL_FAUT(iterer) ,IFNE(ASD1(point_courant_relatif_au_centre,y),Ymin) ) ) ,ASD1(point_courant_relatif_au_centre,x) ,COYA(SOUS(Ymin,ASD1(point_courant_relatif_au_centre,y))) ); /* Test du point {X,Ymin-Y} dans le quatrieme quadrant (de la spirale). */ Eblock ATes Bblock Eblock ETes Test(IFOU(IL_FAUT(iterer) ,IFET(IL_NE_FAUT_PAS(iterer) ,IFEQ(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree,SPIRALE_CODE_DE_REENTREE_4) ) ) ) Bblock /* Cas ou il faut modifier {X,Y} : */ /* */ /* On notera que le parcours se fait en modifiant dans l'ordre : */ /* */ /* X, */ /* Y, */ /* carre_de_la_distance_au_centre, */ /* */ /* ce qui, avec la gestion de 'LE_POINT_COURANT_EST_IL_ATTEINT(...)' donne un ordre de */ /* parcours peu satisfaisant : */ /* */ /* */ /* 23 19 12 18 22 */ /* */ /* */ /* 15 07 04 06 14 */ /* */ /* */ /* 11 03 01 02 10 */ /* */ /* */ /* 16 08 05 09 17 */ /* */ /* */ /* 24 20 13 21 25 */ /* */ /* */ EGAL(Fparcours_circulaire_d_une_spirale_carree_____code_de_reentree,SPIRALE_CODE_DE_REENTREE_INITIAL); INCR(ASD1(point_courant_relatif_au_centre,x),pasX); /* Progression de 'X'. */ Test(IFGT(ASD1(point_courant_relatif_au_centre,x),valeur_maximale_de_X_et_de_Y_relatifs)) Bblock EGAL(ASD1(point_courant_relatif_au_centre,x),Xmin); INCR(ASD1(point_courant_relatif_au_centre,y),pasY); /* Progression de 'Y' et reinitialisation de 'X'. */ Test(IFGT(ASD1(point_courant_relatif_au_centre,y),valeur_maximale_de_X_et_de_Y_relatifs)) Bblock EGAL(ASD1(point_courant_relatif_au_centre,y),Ymin); INCR(carre_de_la_distance_au_centre,I); /* Progression de la longueur courante et reinitialisation de 'Y'. */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ETan TRANSFERT_POINT_2D(PINDIRECT(point_de_numero_cherche_relatif_au_centre),point_satisfaisant_relatif_au_centre); /* Renvoi du point recherche... */ #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 Test(EST_VRAI(une_initialisation_de_la_spirale_a_ete_faite)) Bblock Test(IL_NE_FAUT_PAS(desinitialiser_le_processus)) Bblock /* Cas des acces a la spirale... */ Test(IFEQ(nombre_de_points_de_la_spirale_courante,nombre_de_points_de_la_spirale_initialisee)) Bblock TRANSFERT_POINT_2D(PINDIRECT(point_de_numero_cherche_relatif_au_centre) ,ACCES_AUX_POINTS_DE_LA_SPIRALE(numero_du_point_courant_cherche) ); /* Renvoi du point recherche... */ Eblock ATes Bblock PRINT_ERREUR("une spirale est accedee au dela de ce qui a ete alloue, on renvoie l'origine"); INITIALISATION_POINT_2D(PINDIRECT(point_de_numero_cherche_relatif_au_centre),Xmin,Ymin); Eblock ETes Eblock ATes Bblock FdTb1(liste_des_points_de_la_spirale ,nombre_de_points_de_la_spirale_initialisee ,pointI_2D ,ADRESSE_NON_ENCORE_DEFINIE ); /* Lorsque la desinitialisation est demandee, on rend l'espace de la spirale. */ /* */ /* Le 'ADRESSE_NON_ENCORE_DEFINIE' a ete introduit le 20050221165319... */ EGAL(nombre_de_points_de_la_spirale_initialisee,UNDEF); EGAL(une_initialisation_de_la_spirale_a_ete_faite,FAUX); /* Et enfin, on memorise qu'il n'y a plus de spirale... */ Eblock ETes Eblock ATes Bblock PRINT_ERREUR("une spirale non initialisee est utilisee, on renvoie l'origine"); INITIALISATION_POINT_2D(PINDIRECT(point_de_numero_cherche_relatif_au_centre),Xmin,Ymin); Eblock ETes #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 RETU_ERROR; Eblock #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 # undef LE_POINT_COURANT_EST_IL_ATTEINT #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_01 #ifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 # undef DERNIER_POINT_DE_LA_SPIRALE # undef PREMIER_POINT_DE_LA_SPIRALE # undef ACCES_AUX_POINTS_DE_LA_SPIRALE # undef LE_POINT_COURANT_EST_IL_ATTEINT #Aifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 #Eifdef FACON_DE_PARCOURIR_CIRCULAIREMENT_UNE_SPIRALE_CARREE_VERSION_02 EFonctionI _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R C O U R S A L A " P E A N O " D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define IPeano(v1,v2) \ INTE(MOYS(v2,v1)) \ /* Pour se placer au milieu du segment [v1,v2]. */ #define M2Peano(v1,v2) \ ADD2(v1,IPeano(v1,v2)) \ /* Pour determiner les points du type 'point*2' et 'point2*' sur le segment [v1,v2]. */ #define M3Peano(v1,v2) \ SOUS(v2,IPeano(v1,v2)) \ /* Pour determiner les points du type 'point*3' et 'point3*' sur le segment [v1,v2]. */ #define SPeano(point,Cx,Cy) \ Bblock \ INITIALISATION_POINT_2D(point,Cx,Cy); \ Eblock \ /* Initialisation de l'un des points d'un "cadre". */ DEFV(Common,DEFV(FonctionI,FPeano(ARGUMENT_POINTERs(point1) ,ARGUMENT_POINTERs(point2) ,ARGUMENT_POINTERs(point3) ,ARGUMENT_POINTERs(point4) ,emission_des_coordonnees ,ARGUMENT_FACULTATIF(ARGUMENT_POINTERs(processus_recepteur)) ) ) ) DEFV(Argument,DEFV(pointI_2D,POINTERs(point1))); DEFV(Argument,DEFV(pointI_2D,POINTERs(point2))); DEFV(Argument,DEFV(pointI_2D,POINTERs(point3))); DEFV(Argument,DEFV(pointI_2D,POINTERs(point4))); /* Definition des quatres coins donnant l'ordre dans lequel on parcours le "cadre" courant : */ /* */ /* 2-----------------------------3 */ /* | | */ /* | | */ /* | | */ /* | | */ /* | | */ /* | | */ /* | | */ /* ^ | */ /* | | */ /* | | */ /* | | */ /* | | */ /* | | */ /* | | */ /* 1 4 */ /* */ DEFV(Argument,DEFV(Logical,emission_des_coordonnees)); /* Indique si les coordonnees doivent etre transmises ('VRAI') ou pas ('FAUX') au */ /* 'processus_recepteur'. */ DEFV(Argument,DEFV(processus,POINTERs(processus_recepteur))); /* Description du processus auquel transmettre les coordonnees dans [Xmin,Xmax]x[Ymin,Ymax] */ /* des coordonnees extraites recursivement... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; DEFV(pointI_2D,point11); DEFV(pointI_2D,point12); DEFV(pointI_2D,point13); DEFV(pointI_2D,point14); DEFV(pointI_2D,point21); DEFV(pointI_2D,point22); DEFV(pointI_2D,point23); DEFV(pointI_2D,point24); DEFV(pointI_2D,point31); DEFV(pointI_2D,point32); DEFV(pointI_2D,point33); DEFV(pointI_2D,point34); DEFV(pointI_2D,point41); DEFV(pointI_2D,point42); DEFV(pointI_2D,point43); DEFV(pointI_2D,point44); /* Definition de la subdivision recursive du "cadre" courant : */ /* */ /* 41-----------42 43-----------44 */ /* | | | | */ /* | | | | */ /* | | | | */ /* ^ | ^ | */ /* | | | | */ /* | | | | */ /* 31 32 33 34 */ /* */ /* 21-----------22 23-----<-----24 */ /* | | */ /* | | */ /* | | */ /* | | */ /* | | */ /* | | */ /* 11----->-----12 13-----------14 */ /* */ /* On notera que si l'on ne conserve que le premier point de chaque "sous-cadre" (a */ /* savoir '11', '31', '33' puis enfin '24') le "remplissage" du plan obtenu n'est pas */ /* regulier (en particulier '24' est tres different des autres...). */ /* */ /* */ /* Decoupage recursif de [a,b] : */ /* b * */ /* / */ /* / */ /* / */ /* / */ /* + <-- (b - IPeano(a,b)) */ /* + <-- (a + IPeano(a,b)) */ /* / */ /* / */ /* / */ /* / */ /* a * */ /* */ /* */ /*..............................................................................................................................*/ Test(IFOU(IFGE(SOUA(CHOI(ASI1(point4,x),ASI1(point3,x)),CHOI(ASI1(point1,x),ASI1(point2,x))),pasX) ,IFGE(SOUA(CHOI(ASI1(point4,y),ASI1(point3,y)),CHOI(ASI1(point1,y),ASI1(point2,y))),pasY) ) ) Bblock SPeano(point11,ASI1(point1,x),ASI1(point1,y)); SPeano(point41,ASI1(point2,x),ASI1(point2,y)); SPeano(point44,ASI1(point3,x),ASI1(point3,y)); SPeano(point14,ASI1(point4,x),ASI1(point4,y)); /* Determination des 4 sommets principaux. */ SPeano(point12,M2Peano(ASD1(point11,x),ASD1(point14,x)),M2Peano(ASD1(point11,y),ASD1(point14,y))); SPeano(point13,M3Peano(ASD1(point11,x),ASD1(point14,x)),M3Peano(ASD1(point11,y),ASD1(point14,y))); SPeano(point42,M2Peano(ASD1(point41,x),ASD1(point44,x)),M2Peano(ASD1(point41,y),ASD1(point44,y))); SPeano(point43,M3Peano(ASD1(point41,x),ASD1(point44,x)),M3Peano(ASD1(point41,y),ASD1(point44,y))); SPeano(point21,M2Peano(ASD1(point11,x),ASD1(point41,x)),M2Peano(ASD1(point11,y),ASD1(point41,y))); SPeano(point31,M3Peano(ASD1(point11,x),ASD1(point41,x)),M3Peano(ASD1(point11,y),ASD1(point41,y))); SPeano(point24,M2Peano(ASD1(point14,x),ASD1(point44,x)),M2Peano(ASD1(point14,y),ASD1(point44,y))); SPeano(point34,M3Peano(ASD1(point14,x),ASD1(point44,x)),M3Peano(ASD1(point14,y),ASD1(point44,y))); /* Determination des 8 milieux des cotes. */ SPeano(point22 ,CHOI(M2Peano(ASD1(point21,x),ASD1(point24,x)) ,M2Peano(ASD1(point12,x),ASD1(point42,x)) ) ,CHOI(M2Peano(ASD1(point21,y),ASD1(point24,y)) ,M2Peano(ASD1(point12,y),ASD1(point42,y)) ) ); SPeano(point23 ,CHOI(M3Peano(ASD1(point21,x),ASD1(point24,x)) ,M2Peano(ASD1(point13,x),ASD1(point43,x)) ) ,CHOI(M3Peano(ASD1(point21,y),ASD1(point24,y)) ,M2Peano(ASD1(point13,y),ASD1(point43,y)) ) ); SPeano(point32 ,CHOI(M2Peano(ASD1(point31,x),ASD1(point34,x)) ,M3Peano(ASD1(point12,x),ASD1(point42,x)) ) ,CHOI(M2Peano(ASD1(point31,y),ASD1(point34,y)) ,M3Peano(ASD1(point12,y),ASD1(point42,y)) ) ); SPeano(point33 ,CHOI(M3Peano(ASD1(point31,x),ASD1(point34,x)) ,M3Peano(ASD1(point13,x),ASD1(point43,x)) ) ,CHOI(M3Peano(ASD1(point31,y),ASD1(point34,y)) ,M3Peano(ASD1(point13,y),ASD1(point43,y)) ) ); /* Determination des 4 centres du "cadre" initial. */ CALS(FPeano(ADRESSE(point11),ADRESSE(point12),ADRESSE(point22),ADRESSE(point21) ,emission_des_coordonnees,processus_recepteur ) ); CALS(FPeano(ADRESSE(point31),ADRESSE(point41),ADRESSE(point42),ADRESSE(point32) ,emission_des_coordonnees,processus_recepteur ) ); CALS(FPeano(ADRESSE(point33),ADRESSE(point43),ADRESSE(point44),ADRESSE(point34) ,emission_des_coordonnees,processus_recepteur ) ); CALS(FPeano(ADRESSE(point24),ADRESSE(point23),ADRESSE(point13),ADRESSE(point14) ,emission_des_coordonnees,processus_recepteur ) ); /* Et enfin, subdivision recursive en 4 "sous-cadres" non reduits a un seul point. */ Eblock ATes Bblock Test(IL_FAUT(emission_des_coordonnees)) Bblock SEND_I(INDIRECT(processus_recepteur),ASI1(point1,x)); SEND_I(INDIRECT(processus_recepteur),ASI1(point1,y)); /* Et ainsi, on envoie a un processus interesse, les coordonnees du premier point 'point1' */ /* du "cadre" courant, dans l'ordre 'x' puis 'y'... */ Eblock ATes Bblock CAL3(Prme2("(%d,%d)\n",ASI1(point1,x),ASI1(point1,y))); /* Sinon, on edite les coordonnees {x,y}... */ Eblock ETes Eblock ETes RETU_ERROR; Eblock #undef SPeano #undef M3Peano #undef M2Peano #undef IPeano EFonctionI _______________________________________________________________________________________________________________________________________