/*************************************************************************************************************************************/ /* */ /* Q U A D R A N G U L A T I O N D ' U N A R B R E */ /* G R A C E A L A B I J E C T I O N D E S C H A E F F E R : */ /* */ /* */ /* Author of '$xrv/QuadrangulationArbre.11$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20150622141319). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define EDITER_LES_ARETES \ FAUX \ /* Doit-on editer les aretes ('VRAI') ou uniquement les noeuds ('FAUX') ? */ #define TRIER_LES_NOEUDS_DES_ARETES \ VRAI \ /* Si 'IL_FAUT(editer_les_aretes)' doit-on alors trier les numeros de noeuds de facon */ \ /* croissante ('VRAI') ou les laisser tel quel ('FAUX') ? Ceci a ete introduit le */ \ /* 20150624112622... */ #define EDITER_LE_DERNIER_NUMERO \ VRAI \ /* Doit-on editer le dernier numero ('VRAI') ou l'ignorer ('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" #define NUMERO_IMPLICITE \ FZERO #define ETIQUETTE_IMPLICITE \ FZERO gGENERATION_D_UN_FICHIER(fichier_des_numeros,liste_des_numeros); gGENERATION_D_UN_FICHIER(fichier_des_etiquettes,liste_des_etiquettes); /* Definition en memoire des fichiers. */ #define ELEMENT_DU_FICHIER_NUMEROS(index) \ gELEMENT_DU_FICHIER(liste_des_numeros,index) #define ELEMENT_DU_FICHIER_ETIQUETTES(index) \ gELEMENT_DU_FICHIER(liste_des_etiquettes,index) /* Acces a un element courant des fichiers. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E D I T I O N D ' U N E A R E T E : */ /* */ /*************************************************************************************************************************************/ #include xrv/QuadrangulationArbre.11.I" /* Introduit le 20150624114117 a cause de 'v $xcc/cpp$Z 20111129084103'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* Q U A D R A N G U L A T I O N D ' U N A R B R E */ /* G R A C E A L A B I J E C T I O N D E S C H A E F F E R : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xrv/ARITHMET.22.I" #include xci/valeurs.03.I" DEFV(Logical,INIT(editer_les_aretes,EDITER_LES_ARETES)); /* Doit-on editer les aretes ('VRAI') ou uniquement les noeuds ('FAUX') ? */ DEFV(Logical,INIT(trier_les_noeuds_des_aretes,TRIER_LES_NOEUDS_DES_ARETES)); /* Si 'IL_FAUT(editer_les_aretes)' doit-on alors trier les numeros de noeuds de facon */ /* croissante ('VRAI') ou les laisser tel quel ('FAUX') ? Ceci a ete introduit le */ /* 20150624112622... */ DEFV(Logical,INIT(editer_le_dernier_numero,EDITER_LE_DERNIER_NUMERO)); /* Doit-on editer le dernier numero ('VRAI') ou l'ignorer ('FAUX') ? */ /*..............................................................................................................................*/ #include xrv/champs_5.1A.I" GET_ARGUMENTS_(nombre_d_arguments ,BLOC(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; PROKESF_ARGUMENT_FICHIER("numeros=" ,fichier_des_numeros ,liste_des_numeros ,NUMERO_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); PROKESF_ARGUMENT_FICHIER("etiquettes=" ,fichier_des_etiquettes ,liste_des_etiquettes ,ETIQUETTE_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); GET_ARGUMENT_L("aretes=",editer_les_aretes); GET_ARGUMENT_N("noeuds=",editer_les_aretes); GET_ARGUMENT_L("trier_noeuds=""trier=",trier_les_noeuds_des_aretes); /* Argument introduit le 20150624112622... */ GET_ARGUMENT_L("editer_dernier_numero=""edn=""dernier=",editer_le_dernier_numero); GET_ARGUMENT_N("tous_numeros=""tn=""tous=",editer_le_dernier_numero); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3; PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_5; /* Cette procedure fut introduite le 20211005104742... */ ) ); gOPERATION_SUR_LES_FICHIERS(BLOC( DEFV(Float,INIT(etiquette_courante,ELEMENT_DU_FICHIER_ETIQUETTES(index))); /* Recuperation de l'etiquette courante... */ DEFV(Logical,INIT(editer_le_numero,LUNDEF)); DEFV(Float,INIT(numero_a_editer,FLOT__UNDEF)); Test(IFGT(index,PREMIER_ELEMENT_D_UN_FICHIER)) Bblock DEFV(Int,INIT(index_inferieur,PRED(index))); DEFV(Logical,INIT(chercher_l_etiquette_inferieure,VRAI)); Tant(IL_FAUT(chercher_l_etiquette_inferieure)) Bblock Test(IFGE(ELEMENT_DU_FICHIER_ETIQUETTES(index_inferieur),etiquette_courante)) Bblock Test(IFGT(index_inferieur,PREMIER_ELEMENT_D_UN_FICHIER)) Bblock DECR(index_inferieur,I); /* On s'eloigne un peu plus de 'index'... */ Eblock ATes Bblock PRINT_ERREUR("erreur dans la liste des etiquettes"); EGAL(chercher_l_etiquette_inferieure,FAUX); Eblock ETes Eblock ATes Bblock EGAL(chercher_l_etiquette_inferieure,FAUX); /* Ainsi, on s'arrete sur la premiere etiquette strictement inferieure a l'etiquette */ /* courante. C'est le numero associe (de meme index 'index_inferieur') que l'on editera */ /* plus loin... */ /* */ /* On notera que d'une facon generale, l'etiquette d'un noeud donne la distance (en terme */ /* de nombre d'arcs) a la racine dite de "quadrangulation"... */ /* */ /* On notera qu'un noeud a en general plusieurs numeros car, en effet, lorsque l'on decrit */ /* l'arbre via son "contour exterieur", on passe plusieurs fois par les noeuds situes a des */ /* embranchements (c'est-a-dire des noeuds qui ne sont pas des feuilles...). */ /* */ /* Voici un exemple ('v $xiirv/.QUAD.21.1.$U LeGall') : */ /* */ /* NUMEROS = {0 1 2 3 4 5 6 7 8 9 10 11 12} */ /* ETIQUETTES = {0 1 2 1 2 3 2 1 2 3 2 3 2} */ /* */ /* Les aretes du graphe obtenu par quadrangulation sont : */ /* */ /* 1 --> 0 */ /* 2 --> 1 */ /* 3 --> 0 */ /* 4 --> 3 */ /* 5 --> 4 */ /* 6 --> 3 */ /* 7 --> 0 */ /* 8 --> 7 */ /* 9 --> 8 */ /* 10 --> 7 */ /* 11 --> 10 */ /* 12 --> 7 */ /* */ /* */ /* Soit donc l'arbre (chaque noeud possede le numero "N" et l'etiquette "E" qui est */ /* en fait la distance -en nombre d'arcs franchis- pour aller de la racine dans la carte, */ /* soit le noeud d'etiquette E=0, a ce noeud) : */ /* */ /* */ /* N=7 */ /* */ /* * */ /* E=1 */ /* / */ /* / */ /* / */ /* / */ /* / */ /* / */ /* N=6 * N=8 * N=10 */ /* \ / */ /* E=2\ /E=2 */ /* \ / */ /* \ / */ /* \ / */ /* N=3 \N=9/ */ /* \ / */ /* * N=5 * N=11 */ /* \ / */ /* E=1\ /E=3 */ /* \ / */ /* \ / */ /* \ / */ /* \N=4/ */ /* \ / */ /* N=2 * N=12 */ /* | */ /* E=2 */ /* | */ /* | */ /* | */ /* N=0 | */ /* | */ /* * N=1 * N=13 */ /* */ /* E=0 E=1 */ /* */ /* */ /* La quadrangulation de cet arbre donne le graphe suivant grace a la bijection de */ /* Schaeffer ('v $xiirv/QUAD.21') : */ /* */ /* */ /* N=7 */ /* */ /* + + + + + + + + + + + + + + * + + + + + + + + + + + */ /* E=1 */ /* + / + + */ /* / + */ /* + / + + */ /* / + */ /* + / + + */ /* / + */ /* + N=6 * N=8 * N=10 + */ /* + \ / */ /* + +E=2\ /E=2 + */ /* + \ / */ /* + + \ / + */ /* + \ / */ /* + N=3+ \N=9/ + */ /* + \ / */ /* + * N=5 * N=11 + */ /* \ / */ /* + E=1\ /E=3 + */ /* \ / */ /* + + \ / + */ /* \ / */ /* + \N=4/ + */ /* + \ / */ /* + N=2 * N=12 + + + + + + + + + + + + */ /* | */ /* + + E=2 */ /* | */ /* + | */ /* + | */ /* N=0 | */ /* | */ /* * + + + + + + + N=1 * N=13 */ /* */ /* E=0 E=1 */ /* */ /* */ /* Les symboles "*" representent les noeuds de l'arbre (leurs numeros sont "N" et leurs */ /* etiquettes "E"). Les symboles "\", "|" et "/" representent les branches de cet arbre */ /* (puis ils font partie du graphe obtenu par quadrangulation). Enfin, les symboles "+" */ /* representent les nouveauc arcs introduits pour completer le graphe... */ Eblock ETes Eblock ETan Test(IFOU(IFLT(index,DERNIER_ELEMENT_D_UN_FICHIER) ,IFET(IFEQ(index,DERNIER_ELEMENT_D_UN_FICHIER) ,IL_FAUT(editer_le_dernier_numero) ) ) ) /* En effet, dans le cas d'une "vraie" quadrangulation, le dernier numero correspond */ /* theoriquement au premier numero (au niveau "physique"...). */ Bblock DEFV(Float,INIT(numero2,ELEMENT_DU_FICHIER_NUMEROS(index_inferieur))); Test(IL_FAUT(editer_les_aretes)) Bblock DEFV(Float,INIT(numero1,ELEMENT_DU_FICHIER_NUMEROS(index))); EDITION_D_UNE_ARETE; /* Et ceci a cause de l'operateur 'OPC2' reference... */ Eblock ATes Bblock EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(numero2); Eblock ETes CAL2(Prin0("\n")); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes ) ,FLOT__ARGUMENT_ABSENT ,NE_PAS_EDITER_LA_VALEUR_RESULTANTE_DANS_gOPERATION_SUR_LES_FICHIERS /* On notera que l'edition ne peut avoir lieu ici a cause de la gestion des "K_NL" dans */ /* 'v $xrv/ARITHMET.21$I gOPERATION_SUR_LES_FICHIERS' qui provoquerait la mise des deux */ /* noeuds d'une meme arete sur deux lignes successives... */ ,nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes ); /* Edition du numero... */ lGENERATION_D_UN_FICHIER(liste_des_etiquettes,ETIQUETTE_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_des_numeros,NUMERO_IMPLICITE); RETU_Commande; Eblock ECommande