/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' A R B R E S R E C U R S I F S : */ /* */ /* */ /* Nota tres important : */ /* */ /* Je note le 20160209115226 qu'en ce qui */ /* concerne les numeros de noeuds et leurs */ /* etiquettes, ces deux notions ne sont pas */ /* ce que l'on pourrait attendre intuitivement : */ /* */ /* 1-'numero_du_noeud_courant' : */ /* */ /* On notera qu'un noeud qui est a un embranchement (qui n'est donc pas une feuille) */ /* a plusieurs numeros differents correspondant aux differentes fois ou l'on passe par */ /* lui... */ /* */ /* */ /* 2-'etiquette_du_noeud_courant' : */ /* */ /* L'etiquette du noeud de numero 'n' est definie par rapport a l'etiquette du noeud de */ /* numero 'n-1' selon : */ /* */ /* Etiquette(0) = 1 */ /* Etiquette(n) = Etiquette(n-1) + Increment > 0 */ /* */ /* avec : */ /* */ /* Increment E {-1,0,+1} */ /* */ /* choisi aleatoirement. Ces etiquettes peuvent etre ensuite utilisees pour obtenir un */ /* graphe a partir d'un arbre par un procede de quadrangulation qui est defini dans */ /* 'v $xrv/QuadrangulationArbre.11$K'... */ /* */ /* */ /* Author of '$xci/valeurs_Arbre.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20130330114146). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define COMPATIBILITE_20160216 \ FAUX \ /* Permet d'assurer la compatibilite anterieure au 20160216170712 si besoin est... */ #define MODE_BIDIMENSIONNEL \ VRAI \ /* Doit-on utiliser les fonctions bidimensionnelles ('VRAI') ou tridimensionnelles */ \ /* ('FAUX') ? Ceci a ete introduit le 20130415133426... */ #define SIGNER_LES_VALEURS \ VRAI \ /* Faut-il signer toutes les valeurs ('VRAI') ou pas ('FAUX') ? Ceci a ete introduit */ \ /* le 20150628185445... */ #define EDITER_LES_COORDONNEES_SOUS_FORME_CARTESIENNE \ VRAI \ /* Faut-il editer les coordonnees sous forme cartesienne ('VRAI') ou spheriques ('FAUX') ? */ \ /* Ceci a ete introduit le 20160208131143... */ #define NUMERO_ABSOLU_DES_BRANCHES \ FAUX \ /* Faut-il numeroter en absolu ('VRAI') ou en relatif ('FAUX') les branches ? */ #define NUMEROTER_LES_NOEUDS_DE_L_ARBRE \ FAUX #define NUMERO_DE_LA_RACINE_DE_L_ARBRE \ UN #define ETIQUETTER_LES_NOEUDS_DE_L_ARBRE \ FAUX #define ETIQUETTE_DE_LA_RACINE_DE_L_ARBRE \ UN #define L_ETIQUETTAGE_EST_EXOTIQUE \ FAUX /* Le 20150622112341 a ete introduite la possibilite de numeroter et etiquetter les */ /* noeuds de l'arbre... */ /* */ /* Le 20150625105105 a ete introduite la possibilite d'un etiquettage non standard (dit */ /* "exotique")... */ #define BRANCHE_DE_DEPART_X0 \ FZERO #define BRANCHE_DE_DEPART_Y0 \ FZERO #define BRANCHE_DE_DEPART_Z0 \ FDU /* Definition de la racine de quadrangulation (introduite le 20150624082447). */ #define BRANCHE_DE_DEPART_X1 \ FDU #define BRANCHE_DE_DEPART_Y1 \ FZERO #define BRANCHE_DE_DEPART_Z1 \ FDU /* Definition de la racine de l'arbre... */ #define BRANCHE_DE_DEPART_X2 \ BRANCHE_DE_DEPART_X1 #define BRANCHE_DE_DEPART_Y2 \ FDU #define BRANCHE_DE_DEPART_Z2 \ BRANCHE_DE_DEPART_Z1 /* Definition de la branche de depart. Le 20130402104649 la troisieme dimension a ete */ /* introduite. On notera que cette troisieme dimension 'Z' n'a de sens que sous sa forme */ /* aleatoire ('v $xiirv/TREE.33'). */ #define MARQUER_L_EXTREMITE_DES_BRANCHES \ FAUX \ /* Faut-il marquer l'extremite des branches ('VRAI') ou pas ('FAUX') ? Ceci a ete */ \ /* introduit le 20160209141408. */ #define PROFONDEUR_DE_LA_GENERATION \ DEUX \ /* Profondeur de la generation recursive... */ #define FAIRE_VARIER_ALEATOIREMENT_LA_PROFONDEUR_DE_LA_GENERATION \ FAUX #define PROBABILITE_D_INTERROMPRE_LA_PROGRESSION_DANS_L_ARBRE \ PROBABILITE_NULLE /* Le 20150622093648 a ete introduite la possibilite de progresser aleatoirement dans */ /* la profondeur de l'arbre... */ #define NOMBRE_DE_BRANCHES_THETA_EN_CHAQUE_NOEUD \ TROIS #define EVASEMENT_TOTAL_THETA_DES_BRANCHES \ PI #define FACTEUR_DE_L_EVASEMENT_THETA_DES_BRANCHES \ FU #define NOMBRE_DE_BRANCHES_PHI__EN_CHAQUE_NOEUD \ UN #define EVASEMENT_TOTAL_PHI__DES_BRANCHES \ FZERO #define FACTEUR_DE_L_EVASEMENT_PHI__DES_BRANCHES \ FU #define FACTEUR_DE_REDUCTION_DES_BRANCHES \ FDU /* Definition d'une nouvelle generation de branches. On notera que par defaut, on genere */ /* un arbre ternaire dont les branches sont horizontales ou verticales... */ /* */ /* L'angle 'Phi' a ete introduit le 20130417145751... */ #define CONSERVER_LA_DIRECTION_INITIALE \ FAUX \ /* Indique si la premiere branche "fils" doit avoir la meme direction que sa branche "pere" */ \ /* ('VRAI') ou pas ('FAUX'). Ceci a ete introduit le 20160321092815 et la valeur par defaut */ \ /* garantit la compatibilite anterieure... */ #define GRAINE \ PARE(1789) \ /* Definition du generateur aleatoire... */ #define BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DU_NOMBRE_DE_BRANCHES_THETA \ ZERO #define BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DU_NOMBRE_DE_BRANCHES_THETA \ ZERO #define BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DU_NOMBRE_DE_BRANCHES_PHI_ \ ZERO #define BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DU_NOMBRE_DE_BRANCHES_PHI_ \ ZERO #define BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DE_RHO_ \ FZERO #define BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DE_RHO_ \ FZERO #define BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DE_THETA \ FZERO #define BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DE_THETA \ FZERO #define BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DE_PHI_ \ FZERO #define BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DE_PHI_ \ FZERO #define BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DE_Z___ \ FZERO #define BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DE_Z___ \ FZERO /* Definition des perturbations aleatoires du nombre de branches, de {Rho,Theta} et de 'Z'. */ /* */ /* La perturbation aleatoire de {Phi} a ete introduite le 20130417142344... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /* On notera que l'on ne peut utiliser ici : */ /* */ /* #include xci/valeurs.02.I" */ /* #include xci/valeurs.03.I" */ /* */ /* car, en effet, des variables initialisees de facon dynamique y sont definies, par */ /* exemple via 'INIC(...)'. */ #define PRINT(valeur,nom_de_la_valeur,format) \ Bblock \ CAL2(Prin1(Cara(chain_Aconcaten5(" " \ ,nom_de_la_valeur \ ,"=%" \ ,COND(IL_FAUT(signer_les_valeurs),"+",C_VIDE) \ ,format \ ) \ ) \ ,valeur \ ) \ ); \ Eblock \ /* On ne peut donc pas utiliser 'v $xci/valeurs.03.I valeurs_signees'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T E U R A L E A T O I R E : */ /* */ /*************************************************************************************************************************************/ SPIRALE_DEFINITION_GENERALE(SPIRALE_DELTA_HORIZONTAL_GLOBAL,SPIRALE_DELTA_VERTICAL_GLOBAL) DEFV(Int,INIT(graine,GRAINE)); DEFV(pointI_2D,point_courant_de_l_espace_de_parametrage_2D); /* Definition du generateur aleatoire... */ #define GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(valeur_aleatoire,borne_inf,borne_sup,Fconversion) \ Bblock \ Test(IFLT(borne_inf,borne_sup)) \ Bblock \ EGAL(valeur_aleatoire \ ,Fconversion(rdnI2D(ADRESSE(point_courant_de_l_espace_de_parametrage_2D) \ ,graine \ ,RDN_INIT_AND_GENERE \ ,borne_inf,borne_sup \ ) \ ) \ ); \ \ SPIRALE_INITIALISATION; \ /* Initialisation dynamique de 'spirale_nombre_de_points_a_traiter'. */ \ SPIRALE_DEPLACEMENT(ASD1(point_courant_de_l_espace_de_parametrage_2D,x) \ ,ASD1(point_courant_de_l_espace_de_parametrage_2D,y) \ ); \ /* Deplacement du point courant de la spirale de l'espace de parametrage. */ \ SPIRALE_PARCOURS; \ /* Parcours de la spirale avec rotation eventuelle de PI/2 du bras courant... */ \ Eblock \ ATes \ Bblock \ EGAL(valeur_aleatoire,CHOI(borne_inf,borne_sup)); \ /* Introduit le 20130402104649 afin que le parametrage du generateur aleatoire ne */ \ /* change pas (via 'point_courant_de_l_espace_de_parametrage_2D' lorsque l'aleatoire */ \ /* n'est pas requis (lorsque les bornes inferieure et superieure sont egales ou inversees). */ \ Eblock \ ETes \ Eblock #define PERTURBER_UNE_VALEUR(nombre_de_repetitions) \ IFOU(IL_NE_FAUT_PAS(conserver_la_direction_initiale) \ ,IFET(IL_FAUT(conserver_la_direction_initiale) \ ,IFNE(SOUS(compteur_des_repetitions_du_Repe,PREMIERE_ITERATION_D_UN_Repe) \ ,MOYS(nombre_de_repetitions,PREMIERE_ITERATION_D_UN_Repe) \ ) \ ) \ ) #define PAS_DE_PERTURBATION \ FZERO #define GENERATION_EVENTUELLE_DE_LA_VALEUR_ALEATOIRE_COURANTE(valeur_aleatoire,borne_inf,borne_sup,Fconversion,condition,valeur_defo) \ Bblock \ Test(EST_VRAI(condition)) \ Bblock \ GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(valeur_aleatoire,borne_inf,borne_sup,Fconversion); \ Eblock \ ATes \ Bblock \ EGAL(valeur_aleatoire,valeur_defo); \ Eblock \ ETes \ Eblock /* Generation eventuelle introduite le 20160321092815... */ DEFV(Logical,INIT(conserver_la_direction_initiale,CONSERVER_LA_DIRECTION_INITIALE)); /* Indique si la premiere branche "fils" doit avoir la meme direction que sa branche "pere" */ /* ('VRAI') ou pas ('FAUX'). Ceci a ete introduit le 20160321092815 et la valeur par defaut */ /* garantit la compatibilite anterieure... */ DEFV(Int,INIT(borne_inferieure_perturbation_aleatoire_du_nombre_de_branches_theta ,BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DU_NOMBRE_DE_BRANCHES_THETA ) ); DEFV(Int,INIT(borne_superieure_perturbation_aleatoire_du_nombre_de_branches_theta ,BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DU_NOMBRE_DE_BRANCHES_THETA ) ); DEFV(Int,INIT(borne_inferieure_perturbation_aleatoire_du_nombre_de_branches_phi_ ,BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DU_NOMBRE_DE_BRANCHES_PHI_ ) ); DEFV(Int,INIT(borne_superieure_perturbation_aleatoire_du_nombre_de_branches_phi_ ,BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DU_NOMBRE_DE_BRANCHES_PHI_ ) ); /* Definition de la perturbation aleatoire du nombre de branches... */ DEFV(Float,INIT(borne_inferieure_perturbation_aleatoire_de_rho_,BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DE_RHO_)); DEFV(Float,INIT(borne_superieure_perturbation_aleatoire_de_rho_,BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DE_RHO_)); DEFV(Float,INIT(borne_inferieure_perturbation_aleatoire_de_theta,BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DE_THETA)); DEFV(Float,INIT(borne_superieure_perturbation_aleatoire_de_theta,BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DE_THETA)); DEFV(Float,INIT(borne_inferieure_perturbation_aleatoire_de_phi_,BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DE_PHI_)); DEFV(Float,INIT(borne_superieure_perturbation_aleatoire_de_phi_,BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DE_PHI_)); /* Definition des perturbations aleatoires de {Rho,Theta}... */ /* */ /* La perturbation aleatoire de {Phi} a ete introduite le 20130417142344... */ DEFV(Float,INIT(borne_inferieure_perturbation_aleatoire_de_Z___,BORNE_INFERIEURE_PERTURBATION_ALEATOIRE_DE_Z___)); DEFV(Float,INIT(borne_superieure_perturbation_aleatoire_de_Z___,BORNE_SUPERIEURE_PERTURBATION_ALEATOIRE_DE_Z___)); /* Definition de la perturbation aleatoire dee 'Z'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N R E C U R S I V E D ' A R B R E : */ /* */ /*************************************************************************************************************************************/ DEFV(Logical,INIT(compatibilite_20160216,COMPATIBILITE_20160216)); /* Permet d'assurer la compatibilite anterieure au 20160216170712 si besoin est... */ DEFV(pointF_3D,racine_de_quadrangulation); /* Definition de la recine de quadrangulation. */ DEFV(vectorF_3D,branche_de_depart); /* Definition de la branche de depart... */ DEFV(Positive,INIT(profondeur_de_la_generation,PROFONDEUR_DE_LA_GENERATION)); /* Profondeur de la generation recursive... */ #define EDITIONS(numero,etiquette,impression1,sequence1,sequence2,impression2) \ Bblock \ BLOC(impression1); \ \ Test(IL_FAUT(numeroter_les_noeuds_de_l_arbre)) \ Bblock \ BLOC(sequence1); \ \ PRINT(numero,"NumeroNoeud","d"); \ /* Edition introduite le 20150622112341... */ \ /* */ \ /* On notera que l'edition a lieu apres l'incrementation 'INCR(...)' precedente car, en */ \ /* effet, il y a un noeud de plus que de branches : c'est le noeud racine qui est edite */ \ /* avant le premier appel de 'GenerationDeLArbre(...)'. */ \ /* */ \ /* Le signe a ete introduit le 20150624095949... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(etiquetter_les_noeuds_de_l_arbre)) \ Bblock \ BLOC(sequence2); \ \ PRINT(etiquette,"EtiquetteNoeud","d"); \ /* Edition introduite le 20150622112341... */ \ /* */ \ /* On notera que l'edition a lieu apres l'incrementation 'INCR(...)' precedente car, en */ \ /* effet, il y a un noeud de plus que de branches : c'est le noeud racine qui est edite */ \ /* avant le premier appel de 'GenerationDeLArbre(...)'. */ \ /* */ \ /* Le signe a ete introduit le 20150624095949... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFOU(IL_FAUT(numeroter_les_noeuds_de_l_arbre),IL_FAUT(etiquetter_les_noeuds_de_l_arbre))) \ Bblock \ BLOC(impression2); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Editions diverses... */ DEFV(Logical,INIT(numeroter_les_noeuds_de_l_arbre,NUMEROTER_LES_NOEUDS_DE_L_ARBRE)); DEFV(Int,INIT(numero_de_la_racine_de_l_arbre,NUMERO_DE_LA_RACINE_DE_L_ARBRE)); DEFV(Int,INIT(numero_du_noeud_courant,UNDEF)); DEFV(Logical,INIT(etiquetter_les_noeuds_de_l_arbre,ETIQUETTER_LES_NOEUDS_DE_L_ARBRE)); DEFV(Int,INIT(etiquette_de_la_racine_de_l_arbre,ETIQUETTE_DE_LA_RACINE_DE_L_ARBRE)); DEFV(Logical,INIT(l_etiquettage_est_exotique,L_ETIQUETTAGE_EST_EXOTIQUE)); /* Le 20150622112341 a ete introduite la possibilite de numeroter et etiquetter les */ /* noeuds de l'arbre... */ /* */ /* Le 20150625105105 a ete introduite la possibilite d'un etiquettage non standard (dit */ /* "exotique")... */ DEFV(Logical,INIT(marquer_l_extremite_des_branches,MARQUER_L_EXTREMITE_DES_BRANCHES)); /* Faut-il marquer l'extremite des branches ('VRAI') ou pas ('FAUX') ? Ceci a ete */ /* introduit le 20160209141408. */ DEFV(Logical,INIT(faire_varier_aleatoirement_la_profondeur_de_la_generation ,FAIRE_VARIER_ALEATOIREMENT_LA_PROFONDEUR_DE_LA_GENERATION ) ); DEFV(Float,INIT(probabilite_d_interrompre_la_progression_dans_l_arbre,PROBABILITE_D_INTERROMPRE_LA_PROGRESSION_DANS_L_ARBRE)); /* Le 20150622093648 a ete introduite la possibilite de progresser aleatoirement dans */ /* la profondeur de l'arbre... */ DEFV(Logical,INIT(mode_bidimensionnel,MODE_BIDIMENSIONNEL)); /* Doit-on utiliser les fonctions bidimensionnelles ('VRAI') ou tridimensionnelles */ /* ('FAUX') ? Ceci a ete introduit le 20130415133426... */ DEFV(Logical,INIT(signer_les_valeurs,SIGNER_LES_VALEURS)); /* Faut-il signer toutes les valeurs ('VRAI') ou pas ('FAUX') ? Ceci a ete introduit */ /* le 20150628185445... */ DEFV(Logical,INIT(editer_les_coordonnees_sous_forme_cartesienne,EDITER_LES_COORDONNEES_SOUS_FORME_CARTESIENNE)); /* Faut-il editer les coordonnees sous forme cartesienne ('VRAI') ou spheriques ('FAUX') ? */ /* Ceci a ete introduit le 20160208131143... */ DEFV(Positive,INIT(nombre_de_branches_theta_en_chaque_noeud,NOMBRE_DE_BRANCHES_THETA_EN_CHAQUE_NOEUD)); DEFV(Float,INIT(evasement_total_theta_des_branches,EVASEMENT_TOTAL_THETA_DES_BRANCHES)); DEFV(Float,INIT(facteur_de_l_evasement_theta_des_branches,FACTEUR_DE_L_EVASEMENT_THETA_DES_BRANCHES)); DEFV(Positive,INIT(nombre_de_branches_phi__en_chaque_noeud,NOMBRE_DE_BRANCHES_PHI__EN_CHAQUE_NOEUD)); DEFV(Float,INIT(evasement_total_phi__des_branches,EVASEMENT_TOTAL_PHI__DES_BRANCHES)); DEFV(Float,INIT(facteur_de_l_evasement_phi__des_branches,FACTEUR_DE_L_EVASEMENT_PHI__DES_BRANCHES)); DEFV(Float,INIT(facteur_de_reduction_des_branches,FACTEUR_DE_REDUCTION_DES_BRANCHES)); /* Definition d'une nouvelle generation de branches. On notera que par defaut, on genere */ /* un arbre ternaire dont les branches sont horizontales ou verticales... */ DEFV(Logical,INIT(numero_absolu_des_branches,NUMERO_ABSOLU_DES_BRANCHES)); /* Faut-il numeroter en absolu ('VRAI') ou en relatif ('FAUX') les branches ? */ #define NUMERO_INCREMENTAL_DES_BRANCHES \ COND(IL_FAUT(numero_absolu_des_branches) \ ,numero_incremental_absolu__des_branches \ ,numero_incremental_relatif_des_branches \ ) #define PREMIERE_BRANCHE \ UN DEFV(Int,INIT(numero_incremental_absolu__des_branches,PREMIERE_BRANCHE)); /* Numero absolu de la branche courante... */ #define EPSILON_DE_COLINEARITE \ GRAND_EPSILON DEFV(Float,INIT(epsilon_de_colinearite,EPSILON_DE_COLINEARITE)); DEFV(Int,INIT(numero_aligne_des_branches,PREMIERE_BRANCHE)); /* Numero dit "aligne" de la branche courante (introduit le 20160324142723). Ce numero */ /* n'a en fait de sens que si 'IL_FAUT(conserver_la_direction_initiale)' et il permet */ /* de reperer les branches alignees puisqu'en fait il ne change alors que s'il y a */ /* changement de direction (a epsilon pres...). */ #define NOMBRE_EFFECTIF_DE_BRANCHES_THETA_EN_CHAQUE_NOEUD \ ADD2(nombre_de_branches_theta_en_chaque_noeud,perturbation_aleatoire_du_nombre_de_branches_theta_en_chaque_noeud) #define NOMBRE_EFFECTIF_DE_BRANCHES_PHI__EN_CHAQUE_NOEUD \ ADD2(nombre_de_branches_phi__en_chaque_noeud,perturbation_aleatoire_du_nombre_de_branches_phi__en_chaque_noeud) #define MODULE_EFFECTIF____________DES_FILS_DE_LA_BRANCHE_COURANTE \ ADD2(module___________des_fils_de_la_branche_courante,perturbation_aleatoire_de_rho_) #define ORIENTATION_THETA_EFFECTIVE_DES_FILS_DE_LA_BRANCHE_COURANTE \ COND(IL_FAUT(compatibilite_20160216) \ ,NEUT(ADD2(orientation_theta_des_fils_de_la_branche_courante,perturbation_aleatoire_de_theta)) \ ,MODF(ADD2(orientation_theta_des_fils_de_la_branche_courante,perturbation_aleatoire_de_theta) \ ,FZERO \ ,CERCLE_TRIGONOMETRIQUE \ ) \ ) #define ORIENTATION_PHI__EFFECTIVE_DES_FILS_DE_LA_BRANCHE_COURANTE \ COND(IL_FAUT(compatibilite_20160216) \ ,NEUT(ADD2(orientation_phi__des_fils_de_la_branche_courante,perturbation_aleatoire_de_phi_)) \ ,MODF(ADD2(orientation_phi__des_fils_de_la_branche_courante,perturbation_aleatoire_de_phi_) \ ,FZERO \ ,PI \ ) \ ) /* On rappelle le 20160216151434 que les notations sont ici inversees, le 'theta' et le */ /* 'phi' etant permutes par rapport a 'v $ximD/definit.1$DEF Xcartesienne_3D.rho.phi.theta'. */ /* Dans ces conditions, on a : */ /* */ /* theta E [0,2.pi] */ /* phi E [0,pi] */ /* */ #define EVASEMENT_EFFECTIF_THETA_DES_BRANCHES \ MUL2(PUIX(facteur_de_l_evasement_theta_des_branches,SOUS(profondeur_de_la_generation,profondeur_courante)) \ ,evasement_total_theta_des_branches \ ) #define EVASEMENT_EFFECTIF_PHI__DES_BRANCHES \ MUL2(PUIX(facteur_de_l_evasement_phi__des_branches,SOUS(profondeur_de_la_generation,profondeur_courante)) \ ,evasement_total_phi__des_branches \ ) /* Introduit le 20160217171323 afin de permettre, par exemple, avec des facteurs inferieurs */ /* a 1 de resserer les branches au fur et a mesure de la recursivite... */ BFonctionI DEFV(LoF,DEFV(FonctionI,GenerationDeLArbre(profondeur_courante ,numero_du_pere_de_la_branche_courante ,numero_aligne_de_la_branche_courante ,branche_courante ,etiquette_du_noeud_precedent ,filiation ) ) ) DEFV(Argument,DEFV(Int,profondeur_courante)); /* Profondeur de la generation courante... */ DEFV(Argument,DEFV(Positive,numero_du_pere_de_la_branche_courante)); DEFV(Argument,DEFV(Positive,numero_aligne_de_la_branche_courante)); DEFV(Argument,DEFV(vectorF_3D,POINTERs(branche_courante))); DEFV(Argument,DEFV(Int,etiquette_du_noeud_precedent)); /* Definition de la branche courante. Le numero dit "aligne" a ete introduit le */ /* 20160324142723... */ DEFV(Argument,DEFV(CHAR,DTb0(filiation))); /* Memorisation des filiations... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Int,INIT(profondeur_courante_effective,profondeur_courante)); /* Profondeur de la generation courante... */ DEFV(Int,INIT(etiquette_du_noeud_courant,etiquette_du_noeud_precedent)); INIT_ERROR; /*..............................................................................................................................*/ Test(IL_FAUT(faire_varier_aleatoirement_la_profondeur_de_la_generation)) /* En toute generalite, cet indicateur est inutile : il suffirait que par defaut */ /* 'probabilite_d_interrompre_la_progression_dans_l_arbre' soit egale a 0. Mais en fait, */ /* si l'on souhaite garantir la compabilite anterieure, il ne faut pas faire des appels */ /* a 'GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE' qui n'existaient pas avant la date */ /* du 20150622093648, sous peine de changer les autres generations aleatoires... */ Bblock DEFV(Float,INIT(probabilite_de_progresser_dans_l_arbre,FLOT__UNDEF)); GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(probabilite_de_progresser_dans_l_arbre ,PROBABILITE_NULLE ,PROBABILITE_UNITE ,ndNEUT ); Test(IFGE(probabilite_de_progresser_dans_l_arbre,probabilite_d_interrompre_la_progression_dans_l_arbre)) /* Cas ou la progression (en profondeur) se poursuit... */ Bblock Eblock ATes Bblock /* Cas ou la progression (en profondeur) doit s'interrompre : */ EGAL(profondeur_courante_effective,ZERO); /* Ainsi la progression (en profondeur) dans l'arbre est bloquee... */ Eblock ETes Eblock ATes Bblock Eblock ETes EDITIONS(numero_du_noeud_courant ,etiquette_du_noeud_courant ,BLOC(Bblock CAL2(Prin1("Arborescence=%s",filiation)); Eblock ) ,BLOC(Bblock Test(IL_FAUT(numeroter_les_noeuds_de_l_arbre)) Bblock PRINT(numero_du_pere_de_la_branche_courante,"NumeroPere","d"); /* Edition introduite le 20150622112341... */ Test(IL_FAUT(conserver_la_direction_initiale)) Bblock PRINT(numero_aligne_de_la_branche_courante,"NumeroAligne","d"); /* Edition introduite le 20160324142723... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes INCR(numero_du_noeud_courant,I); Eblock ) ,BLOC(Bblock DEFV(Float,INIT(selecteur_de_l_increment_de_l_etiquette,FLOT__UNDEF)); DEFV(Int,INIT(increment_de_l_etiquette,UNDEF)); GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(selecteur_de_l_increment_de_l_etiquette ,FZERO ,FTROIS ,ndNEUT ); Test(EST_FAUX(l_etiquettage_est_exotique)) Bblock /* Cas de l'etiquettage "standard" : */ Test(IFEQ(etiquette_du_noeud_courant,etiquette_de_la_racine_de_l_arbre)) Bblock EGAL(increment_de_l_etiquette ,COND(IFLT(selecteur_de_l_increment_de_l_etiquette,MOYE(FU,FDEUX)) ,ZERO ,NEUT(UN) ) ); /* Cas ou l'on est sur la racine, l'etiquette ne peut pas diminuer... */ Eblock ATes Bblock EGAL(increment_de_l_etiquette ,COND(IFLT(selecteur_de_l_increment_de_l_etiquette,FU) ,NEGA(UN) ,COND(IFLT(selecteur_de_l_increment_de_l_etiquette,FDEUX) ,ZERO ,NEUT(UN) ) ) ); /* Autres cas, la variation est aleatoire dans {-1,0,+1}... */ Eblock ETes Eblock ATes Bblock /* Cas de l'etiquettage "exotique" (introduit le 20150625105105) : */ Test(IFEQ(etiquette_du_noeud_courant,etiquette_de_la_racine_de_l_arbre)) Bblock EGAL(increment_de_l_etiquette,NEUT(UN)); /* Cas ou l'on est sur la racine, il faut alors incrementer l'etiquette... */ Eblock ATes Bblock Test(IZEQ(profondeur_courante_effective)) Bblock EGAL(increment_de_l_etiquette,NEGA(UN)); /* Cas ou l'on est sur une feuille, il faut alors decrementer l'etiquette... */ Eblock ATes Bblock EGAL(increment_de_l_etiquette ,COND(IFLT(selecteur_de_l_increment_de_l_etiquette,FU) ,NEGA(UN) ,COND(IFLT(selecteur_de_l_increment_de_l_etiquette,FDEUX) ,ZERO ,NEUT(UN) ) ) ); /* Autres cas, la variation est aleatoire dans {-1,0,+1}... */ Eblock ETes Eblock ETes Eblock ETes INCR(etiquette_du_noeud_courant ,increment_de_l_etiquette ); /* L'etiquette du noeud de numero 'n' est definie par rapport a l'etiquette du noeud de */ /* numero 'n-1' selon : */ /* */ /* Etiquette(0) = 1 */ /* Etiquette(n) = Etiquette(n-1) + Increment > 0 */ /* */ /* avec : */ /* */ /* Increment E {-1,0,+1} */ /* */ /* choisi aleatoirement. Ces etiquettes peuvent etre ensuite utilisees pour obtenir un */ /* graphe a partir d'un arbre par un procede de quadrangulation qui est defini dans */ /* 'v $xrv/QuadrangulationArbre.11$K'... */ Eblock ) ,BLOC(VIDE;) ); Test(IL_FAUT(editer_les_coordonnees_sous_forme_cartesienne)) Bblock PRINT(ASI2(branche_courante,origine,x),"X1",".^^^"); PRINT(ASI2(branche_courante,origine,y),"Y1",".^^^"); PRINT(ASI2(branche_courante,origine,z),"Z1",".^^^"); PRINT(ASI2(branche_courante,extremite,x),"X2",".^^^"); PRINT(ASI2(branche_courante,extremite,y),"Y2",".^^^"); PRINT(ASI2(branche_courante,extremite,z),"Z2",".^^^"); /* On notera qu'en permanence {X2,Y2,Z2} donne les coordonnees du noeud 'NumeroNoeud'... */ Eblock ATes Bblock /* L'edition sous forme spherique a ete introduite le 20160208131143... */ PRINT(Rho_3D(SOUS(ASI2(branche_courante,origine,x),BRANCHE_DE_DEPART_X1) ,SOUS(ASI2(branche_courante,origine,y),BRANCHE_DE_DEPART_Y1) ,SOUS(ASI2(branche_courante,origine,z),BRANCHE_DE_DEPART_Z1) ) ,"R1" ,".^^^" ); PRINT(Phi_3D(SOUS(ASI2(branche_courante,origine,x),BRANCHE_DE_DEPART_X1) ,SOUS(ASI2(branche_courante,origine,y),BRANCHE_DE_DEPART_Y1) ,SOUS(ASI2(branche_courante,origine,z),BRANCHE_DE_DEPART_Z1) ) ,"P1" ,".^^^" ); PRINT(Theta_3D(SOUS(ASI2(branche_courante,origine,x),BRANCHE_DE_DEPART_X1) ,SOUS(ASI2(branche_courante,origine,y),BRANCHE_DE_DEPART_Y1) ,SOUS(ASI2(branche_courante,origine,z),BRANCHE_DE_DEPART_Z1) ) ,"T1" ,".^^^" ); PRINT(Rho_3D(SOUS(ASI2(branche_courante,extremite,x),BRANCHE_DE_DEPART_X1) ,SOUS(ASI2(branche_courante,extremite,y),BRANCHE_DE_DEPART_Y1) ,SOUS(ASI2(branche_courante,extremite,z),BRANCHE_DE_DEPART_Z1) ) ,"R2" ,".^^^" ); PRINT(Phi_3D(SOUS(ASI2(branche_courante,extremite,x),BRANCHE_DE_DEPART_X1) ,SOUS(ASI2(branche_courante,extremite,y),BRANCHE_DE_DEPART_Y1) ,SOUS(ASI2(branche_courante,extremite,z),BRANCHE_DE_DEPART_Z1) ) ,"P2" ,".^^^" ); PRINT(Theta_3D(SOUS(ASI2(branche_courante,extremite,x),BRANCHE_DE_DEPART_X1) ,SOUS(ASI2(branche_courante,extremite,y),BRANCHE_DE_DEPART_Y1) ,SOUS(ASI2(branche_courante,extremite,z),BRANCHE_DE_DEPART_Z1) ) ,"T2" ,".^^^" ); Eblock ETes CAL2(Prin0(" ")); /* Un espace a ete introduit a la fin pour 'v $xiirv/.TREE.11.$U' le 20130401083322 et ce */ /* donc afin de faciliter le decoupage... */ CAL2(Prin0("\n")); /* Edition de la branche courante... */ Test(IZGT(profondeur_courante_effective)) Bblock DEFV(Int,INIT(numero_incremental_relatif_des_branches,PREMIERE_BRANCHE)); /* Numero relatif de la branche courante... */ DEFV(Int,INIT(perturbation_aleatoire_du_nombre_de_branches_theta_en_chaque_noeud,UNDEF)); DEFV(Float,INIT(module___________de_la_branche_courante ,COND(IL_FAUT(mode_bidimensionnel) ,gRho_2D(ASI2(branche_courante,origine,x) ,ASI2(branche_courante,origine,y) ,ASI2(branche_courante,extremite,x) ,ASI2(branche_courante,extremite,y) ) ,gRho_3D(ASI2(branche_courante,origine,x) ,ASI2(branche_courante,origine,y) ,ASI2(branche_courante,origine,z) ,ASI2(branche_courante,extremite,x) ,ASI2(branche_courante,extremite,y) ,ASI2(branche_courante,extremite,z) ) ) ) ); DEFV(Float,INIT(orientation_theta_de_la_branche_courante ,COND(IL_FAUT(mode_bidimensionnel) ,gaAngle1_2D(ASI2(branche_courante,origine,x) ,ASI2(branche_courante,origine,y) ,ASI2(branche_courante,extremite,x) ,ASI2(branche_courante,extremite,y) ) ,gaAngle1_3D(ASI2(branche_courante,origine,x) ,ASI2(branche_courante,origine,y) ,ASI2(branche_courante,origine,z) ,ASI2(branche_courante,extremite,x) ,ASI2(branche_courante,extremite,y) ,ASI2(branche_courante,extremite,z) ) ) ) ); DEFV(Float,INIT(orientation_phi__de_la_branche_courante ,COND(IL_FAUT(mode_bidimensionnel) ,PI_SUR_2 ,gaAngle2_3D(ASI2(branche_courante,origine,x) ,ASI2(branche_courante,origine,y) ,ASI2(branche_courante,origine,z) ,ASI2(branche_courante,extremite,x) ,ASI2(branche_courante,extremite,y) ,ASI2(branche_courante,extremite,z) ) ) ) ); /* Caracterisation de la branche courante... */ DEFV(Float,INIT(module___________des_fils_de_la_branche_courante,FLOT__UNDEF)); DEFV(Float,INIT(orientation_theta_des_fils_de_la_branche_courante,FLOT__UNDEF)); DEFV(Float,INIT(orientation_phi__des_fils_de_la_branche_courante,FLOT__UNDEF)); GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(perturbation_aleatoire_du_nombre_de_branches_theta_en_chaque_noeud ,FLOT(borne_inferieure_perturbation_aleatoire_du_nombre_de_branches_theta) ,FLOT(borne_superieure_perturbation_aleatoire_du_nombre_de_branches_theta) ,INTE ); EGAL(module___________des_fils_de_la_branche_courante ,MUL2(facteur_de_reduction_des_branches,module___________de_la_branche_courante) ); EGAL(orientation_theta_des_fils_de_la_branche_courante ,SOUS(orientation_theta_de_la_branche_courante,MOIT(EVASEMENT_EFFECTIF_THETA_DES_BRANCHES)) ); /* Les fils de la branche courante vont etre d'une part plus petit a priori que lui et */ /* d'autre part dans une direction differente... */ Repe(NOMBRE_EFFECTIF_DE_BRANCHES_THETA_EN_CHAQUE_NOEUD) Bblock DEFV(vectorF_3D,fils_courant_de_la_branche_courante); DEFV(Int,INIT(perturbation_aleatoire_du_nombre_de_branches_phi__en_chaque_noeud,UNDEF)); DEFV(Float,INIT(perturbation_aleatoire_de_rho_,FLOT__UNDEF)); DEFV(Float,INIT(perturbation_aleatoire_de_theta,FLOT__UNDEF)); DEFV(Float,INIT(perturbation_aleatoire_de_Z___,FLOT__UNDEF)); GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(perturbation_aleatoire_de_rho_ ,borne_inferieure_perturbation_aleatoire_de_rho_ ,borne_superieure_perturbation_aleatoire_de_rho_ ,ndNEUT ); #define NOMBRE_EFFECTIF_DE_BRANCHES_THETA \ NOMBRE_EFFECTIF_DE_BRANCHES_THETA_EN_CHAQUE_NOEUD \ /* Pour raccourcir certaines lignes qui suivent... */ GENERATION_EVENTUELLE_DE_LA_VALEUR_ALEATOIRE_COURANTE(perturbation_aleatoire_de_theta ,borne_inferieure_perturbation_aleatoire_de_theta ,borne_superieure_perturbation_aleatoire_de_theta ,ndNEUT ,PERTURBER_UNE_VALEUR(NOMBRE_EFFECTIF_DE_BRANCHES_THETA) ,SOUS(orientation_theta_de_la_branche_courante ,orientation_theta_des_fils_de_la_branche_courante ) ); Test(IL_FAUT(mode_bidimensionnel)) Bblock EGAL(perturbation_aleatoire_du_nombre_de_branches_phi__en_chaque_noeud,ZERO); Eblock ATes Bblock GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(perturbation_aleatoire_du_nombre_de_branches_phi__en_chaque_noeud ,FLOT(borne_inferieure_perturbation_aleatoire_du_nombre_de_branches_phi_) ,FLOT(borne_superieure_perturbation_aleatoire_du_nombre_de_branches_phi_) ,INTE ); /* Possibilite introduite le 20130417151159... */ Eblock ETes GENERATION_EVENTUELLE_DE_LA_VALEUR_ALEATOIRE_COURANTE(perturbation_aleatoire_de_Z___ ,borne_inferieure_perturbation_aleatoire_de_Z___ ,borne_superieure_perturbation_aleatoire_de_Z___ ,ndNEUT ,PERTURBER_UNE_VALEUR(NOMBRE_EFFECTIF_DE_BRANCHES_THETA) ,PAS_DE_PERTURBATION ); /* On notera l'usage de 'ndNEUT(...)' et non pas de 'NEUT(...)' car, en effet, ce dernier */ /* est un operateur derivable et ne peut donc pas se situer au niveau le plus bas (et donc */ /* dans un '$K')... */ #undef NOMBRE_EFFECTIF_DE_BRANCHES_THETA EGAL(orientation_phi__des_fils_de_la_branche_courante ,SOUS(orientation_phi__de_la_branche_courante,MOIT(EVASEMENT_EFFECTIF_PHI__DES_BRANCHES)) ); Repe(NOMBRE_EFFECTIF_DE_BRANCHES_PHI__EN_CHAQUE_NOEUD) /* Boucle sur 'Phi' introduite le 20130417150500... */ Bblock DEFV(Float,INIT(perturbation_aleatoire_de_phi_,FLOT__UNDEF)); Test(IL_FAUT(mode_bidimensionnel)) Bblock EGAL(perturbation_aleatoire_de_phi_,FZERO); Eblock ATes Bblock #define NOMBRE_EFFECTIF_DE_BRANCHES_PHI_ \ NOMBRE_EFFECTIF_DE_BRANCHES_PHI__EN_CHAQUE_NOEUD \ /* Pour raccourcir certaines lignes qui suivent... */ GENERATION_EVENTUELLE_DE_LA_VALEUR_ALEATOIRE_COURANTE(perturbation_aleatoire_de_phi_ ,borne_inferieure_perturbation_aleatoire_de_phi_ ,borne_superieure_perturbation_aleatoire_de_phi_ ,ndNEUT ,PERTURBER_UNE_VALEUR(NOMBRE_EFFECTIF_DE_BRANCHES_PHI_) ,SOUS(orientation_phi__de_la_branche_courante ,orientation_phi__des_fils_de_la_branche_courante ) ); /* Possibilite introduite le 20130417142344... */ #undef NOMBRE_EFFECTIF_DE_BRANCHES_PHI_ Eblock ETes INITIALISATION_VECTEUR_3D(fils_courant_de_la_branche_courante ,ASI2(branche_courante,extremite,x) ,ASI2(branche_courante,extremite,y) ,ASI2(branche_courante,extremite,z) ,ADD2(ASI2(branche_courante,extremite,x) ,Xcartesienne_3D(MODULE_EFFECTIF____________DES_FILS_DE_LA_BRANCHE_COURANTE ,ORIENTATION_THETA_EFFECTIVE_DES_FILS_DE_LA_BRANCHE_COURANTE ,ORIENTATION_PHI__EFFECTIVE_DES_FILS_DE_LA_BRANCHE_COURANTE ) ) ,ADD2(ASI2(branche_courante,extremite,y) ,Ycartesienne_3D(MODULE_EFFECTIF____________DES_FILS_DE_LA_BRANCHE_COURANTE ,ORIENTATION_THETA_EFFECTIVE_DES_FILS_DE_LA_BRANCHE_COURANTE ,ORIENTATION_PHI__EFFECTIVE_DES_FILS_DE_LA_BRANCHE_COURANTE ) ) ,ADD2(ASI2(branche_courante,extremite,z) ,COND(IL_FAUT(mode_bidimensionnel) ,MUL2(facteur_de_reduction_des_branches,perturbation_aleatoire_de_Z___) ,Zcartesienne_3D(MODULE_EFFECTIF____________DES_FILS_DE_LA_BRANCHE_COURANTE ,ORIENTATION_THETA_EFFECTIVE_DES_FILS_DE_LA_BRANCHE_COURANTE ,ORIENTATION_PHI__EFFECTIVE_DES_FILS_DE_LA_BRANCHE_COURANTE ) ) ) ); /* Generation du fils courant de la branche courante... */ /* */ /* On notera les conventions d'ecritures ci-dessus qui sont contraires a celle de la */ /* definition de 'v $ximD/definit.1$DEF Xcartesienne_3D.rho.phi.theta.' et de */ /* 'v $ximD/definit.1$DEF Ycartesienne_3D.rho.phi.theta.' et ce afin de rappeler */ /* qu'ici 'theta' est l'angle polaire dans le plan {OX,OY}... */ /* */ /* */ /* Le 20160216134258, on notera une certaine "ambiguite". En effet, il y a des */ /* configurations de {theta,phi} qui donnent les memes coordonnees tridimensionnelles. */ /* Ainsi, par exemple, a partir de : */ /* */ /* $xci/valeurs_Arbre.01$X \ */ /* tridimensionnel=VRAI \ */ /* X1=0.5 Y1=0 Z1=0.5 \ */ /* X2=0.5 Y2=0.5 Z2=0.5 \ */ /* iterations=2 \ */ /* nombre_branches_theta=2 evasement_theta=$pis2 \ */ /* nombre_branches_phi=2 evasement_phi=$pis2 \ */ /* facteur_reduction=0.75 */ /* */ /* on obtient en particulier: */ /* */ /* --> theta=-0.000000 phi=-0.000000 */ /* | Xcart_3D(...)=-0.000000 Ycart_3D(...)=0.000000 Zcart_3D(...)=0.281250 */ /* | Arborescence=1/1/1/ */ /* # X1=+0.6875 Y1=+0.6875 Z1=+0.76516504 */ /* | X2=+0.6875 Y2=+0.6875 Z2=+1.046415 <--------------------------------- */ /* | | */ /* --> theta=1.570796 phi=-0.000000 | */ /* Xcart_3D(...)=-0.000000 Ycart_3D(...)=-0.000000 Zcart_3D(...)=0.281250 = */ /* Arborescence=1/1/3/ | */ /* X1=+0.6875 Y1=+0.6875 Z1=+0.76516504 | */ /* X2=+0.6875 Y2=+0.6875 Z2=+1.046415 <--------------------------------- */ /* */ /* Ainsi, avec deux couples differents {theta,phi} (soit {0,0} et {pi/2,0}), on obtient */ /* deux fois le meme point {X2,Y2,Z2}... */ /* */ /* Tout cela a ete verifie en parallele grace a : */ /* */ /* $xrv/RPT_XYZ.01$X \ */ /* ne=1 \ */ /* LISTE_RHO=1 \ */ /* LISTE_PHI=<le 'theta' en fait> \ */ /* LISTE_THETA=<le 'phi' en fait> \ */ /* px=0/1 py=0/1 pz=0/1 */ /* */ /* en n'oubliant donc pas qu'ici {theta,phi} sont inverses par rapport a l'usage habituel... */ begin_nouveau_block Bblock DEFV(Positive,INIT(numero_aligne_effectif,UNDEF)); INCR(numero_aligne_des_branches,I); EGAL(numero_aligne_effectif,numero_aligne_des_branches); /* A priori, le numero dit "aligne" progresse quitte a annuler cela ensuite si besoin est... */ Test(IL_FAUT(conserver_la_direction_initiale)) Bblock DEFV(deltaF_3D,delta_branche_courante); DEFV(deltaF_3D,delta_fils_courant_de_la_branche_courante); DEFV(deltaF_3D,produit_vectoriel_des_deux_branches_successives); INITIALISATION_ACCROISSEMENT_3D(delta_branche_courante ,SOUS(ASI2(branche_courante,extremite,x) ,ASI2(branche_courante,origine,x) ) ,SOUS(ASI2(branche_courante,extremite,y) ,ASI2(branche_courante,origine,y) ) ,SOUS(ASI2(branche_courante,extremite,z) ,ASI2(branche_courante,origine,z) ) ); INITIALISATION_ACCROISSEMENT_3D(delta_fils_courant_de_la_branche_courante ,SOUS(ASD2(fils_courant_de_la_branche_courante,extremite,x) ,ASD2(fils_courant_de_la_branche_courante,origine,x) ) ,SOUS(ASD2(fils_courant_de_la_branche_courante,extremite,y) ,ASD2(fils_courant_de_la_branche_courante,origine,y) ) ,SOUS(ASD2(fils_courant_de_la_branche_courante,extremite,z) ,ASD2(fils_courant_de_la_branche_courante,origine,z) ) ); PRODUIT_VECTORIEL_ACCROISSEMENT_3D(produit_vectoriel_des_deux_branches_successives ,delta_branche_courante ,delta_fils_courant_de_la_branche_courante ); Test(IFLE(GpytF3D(ASD1(produit_vectoriel_des_deux_branches_successives,dx) ,ASD1(produit_vectoriel_des_deux_branches_successives,dy) ,ASD1(produit_vectoriel_des_deux_branches_successives,dz) ) ,epsilon_de_colinearite ) ) Bblock EGAL(numero_aligne_effectif,numero_aligne_de_la_branche_courante); /* Lorsque la branche courante ("fils") est alignee (a epsilon pres) avec la branche */ /* "pere", on conserve le numero dit "aligne"... */ DECR(numero_aligne_des_branches,I); /* Puis on annule le 'INCR(...)' inutile donc fait precedemment... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes INCR(numero_incremental_absolu__des_branches,I); CALS(GenerationDeLArbre(PRED(profondeur_courante_effective) ,numero_du_noeud_courant ,numero_aligne_effectif ,ADRESSE(fils_courant_de_la_branche_courante) ,etiquette_du_noeud_courant ,chain_Aconcaten3(filiation,chain_numero_exact(NUMERO_INCREMENTAL_DES_BRANCHES),C_SLASH) ) ); /* Generation recursive... */ Eblock end_nouveau_block INCR(numero_incremental_relatif_des_branches,I); INCR(orientation_phi__des_fils_de_la_branche_courante ,DIVZ(EVASEMENT_EFFECTIF_PHI__DES_BRANCHES,FLOT(PRED(NOMBRE_EFFECTIF_DE_BRANCHES_PHI__EN_CHAQUE_NOEUD))) ); /* Le 'PRED(...)' vient du fameux probleme des piquets et des intervalles... */ Eblock ERep INCR(orientation_theta_des_fils_de_la_branche_courante ,DIVZ(EVASEMENT_EFFECTIF_THETA_DES_BRANCHES,FLOT(PRED(NOMBRE_EFFECTIF_DE_BRANCHES_THETA_EN_CHAQUE_NOEUD))) ); /* Le 'PRED(...)' vient du fameux probleme des piquets et des intervalles... */ Eblock ERep Eblock ATes Bblock Test(IL_FAUT(marquer_l_extremite_des_branches)) Bblock /* Edition introduite le 20160209141408... */ CAL2(Prin0("FinDeBranche\n")); Eblock ATes Bblock Eblock ETes Eblock ETes EDITIONS(numero_du_noeud_courant ,etiquette_du_noeud_precedent ,BLOC(Bblock Test(IFOU(IL_FAUT(numeroter_les_noeuds_de_l_arbre),IL_FAUT(etiquetter_les_noeuds_de_l_arbre))) Bblock CAL2(Prin1("Retour......=%s",filiation)); Eblock ATes Bblock Eblock ETes Eblock ) ,BLOC(Bblock INCR(numero_du_noeud_courant,I); /* On notera qu'un noeud qui est a un embranchement (qui n'est donc pas une feuille) */ /* a plusieurs numeros differents correspondant aux differentes fois ou l'on passe par */ /* lui... */ Eblock ) ,BLOC(VIDE;) ,BLOC(Bblock Test(IL_FAUT(numeroter_les_noeuds_de_l_arbre)) Bblock PRINT(ASI2(branche_courante,origine,x),"X2",".^^^"); PRINT(ASI2(branche_courante,origine,y),"Y2",".^^^"); PRINT(ASI2(branche_courante,origine,z),"Z2",".^^^"); /* ATTENTION : ce n'ext pas un erreur, c'est bien 'origine' et {X2,Y2,Z2} qu'il faut */ /* utiliser lors du "Retour"... */ /* */ /* On notera qu'en permanence {X2,Y2,Z2} donne les coordonnees du noeud 'NumeroNoeud'... */ CAL2(Prin0(" ")); Eblock ATes Bblock Eblock ETes CAL2(Prin0("\n")); Eblock ) ); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' A R B R E S R E C U R S I F S : */ /* */ /*************************************************************************************************************************************/ #define NUMERO_DE_LA_RACINE_DE_QUADRANGULATION \ PRED(numero_de_la_racine_de_l_arbre) #define ETIQUETTE_DE_LA_RACINE_DE_QUADRANGULATION \ PRED(etiquette_de_la_racine_de_l_arbre) BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(filiation),C_VIDE)); /* Definition de la filiation... */ /*..............................................................................................................................*/ INITIALISATION_POINT_3D(racine_de_quadrangulation ,BRANCHE_DE_DEPART_X0,BRANCHE_DE_DEPART_Y0,BRANCHE_DE_DEPART_Z0 ); INITIALISATION_VECTEUR_3D(branche_de_depart ,BRANCHE_DE_DEPART_X1,BRANCHE_DE_DEPART_Y1,BRANCHE_DE_DEPART_Z1 ,BRANCHE_DE_DEPART_X2,BRANCHE_DE_DEPART_Y2,BRANCHE_DE_DEPART_Z2 ); GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20160216=",compatibilite_20160216); /* Parametre introduit le 20160216170712... */ GET_ARGUMENT_L("bidimensionnel=""2D=",mode_bidimensionnel); GET_ARGUMENT_N("tridimensionnel=""3D=",mode_bidimensionnel); /* Parametres introduits le 20130415133426... */ GET_ARGUMENT_L("numeros_absolus=""na=",numero_absolu_des_branches); GET_ARGUMENT_N("numeros_relatifs=""nr=",numero_absolu_des_branches); GET_ARGUMENT_L("numeroter=""num=",numeroter_les_noeuds_de_l_arbre); GET_ARGUMENT_I("numero_racine=""numr=",numero_de_la_racine_de_l_arbre); GET_ARGUMENT_L("etiquetter=""eti=",etiquetter_les_noeuds_de_l_arbre); GET_ARGUMENT_I("etiquette_racine=""etir=",etiquette_de_la_racine_de_l_arbre); GET_ARGUMENT_L("etiquettage_exotique=""exotique=",l_etiquettage_est_exotique); /* Parametres introduits le 20150622112341 et complete le 20150625105105... */ GET_ARGUMENT_L("marquer_extremite_branches=""meb=",marquer_l_extremite_des_branches); /* Parametres introduits le 20160209141408... */ GET_ARGUMENT_F("x0=""X0=",ASD1(racine_de_quadrangulation,x)); GET_ARGUMENT_F("y0=""Y0=",ASD1(racine_de_quadrangulation,y)); GET_ARGUMENT_F("z0=""Z0=",ASD1(racine_de_quadrangulation,z)); /* Parametres introduits le 20150624085814... */ GET_ARGUMENT_F("x1=""X1=",ASD2(branche_de_depart,origine,x)); GET_ARGUMENT_F("y1=""Y1=",ASD2(branche_de_depart,origine,y)); GET_ARGUMENT_F("z1=""Z1=",ASD2(branche_de_depart,origine,z)); GET_ARGUMENT_F("x2=""X2=",ASD2(branche_de_depart,extremite,x)); GET_ARGUMENT_F("y2=""Y2=",ASD2(branche_de_depart,extremite,y)); GET_ARGUMENT_F("z2=""Z2=",ASD2(branche_de_depart,extremite,z)); GET_ARGUMENT_F("epsilon_colinearite=""epsilon=",epsilon_de_colinearite); /* Parametres introduits le 20160324142723... */ GET_ARGUMENT_I("profondeur=""recursivite=""iterations=",profondeur_de_la_generation); GET_ARGUMENT_L("profondeur_aleatoire=""pa=",faire_varier_aleatoirement_la_profondeur_de_la_generation); GET_ARGUMENT_N("profondeur_fixe=""pf=",faire_varier_aleatoirement_la_profondeur_de_la_generation); GET_ARGUMENT_F("probabilite_profondeur=""pp=",probabilite_d_interrompre_la_progression_dans_l_arbre); /* Parametres introduits le 20150622093648... */ GET_ARGUMENT_I("nombre_branches_theta=""branches_theta=""nbt=",nombre_de_branches_theta_en_chaque_noeud); GET_ARGUMENT_F("evasement_theta=""anglet=""et=",evasement_total_theta_des_branches); GET_ARGUMENT_F("facteur_evasement_theta=""facteurt=""ft=",facteur_de_l_evasement_theta_des_branches); GET_ARGUMENT_I("nombre_branches_phi=""branches_phi=""nbp=",nombre_de_branches_phi__en_chaque_noeud); GET_ARGUMENT_F("evasement_phi=""anglep=""ep=",evasement_total_phi__des_branches); GET_ARGUMENT_F("facteur_evasement_phi=""facteurp=""fp=",facteur_de_l_evasement_phi__des_branches); /* Parametres introduits le 20130417145751 et completes le 20160217171323... */ GET_ARGUMENT_F("facteur_reduction=""facteur=",facteur_de_reduction_des_branches); GET_ARGUMENT_I("graine=""g=",graine); GET_ARGUMENT_L("conserver_direction_initiale=""conserver=""cdi=",conserver_la_direction_initiale); /* Parametres introduits le 20160321092815... */ GET_ARGUMENT_I("borne_inferieure_branches_theta=""bipbt=" ,borne_inferieure_perturbation_aleatoire_du_nombre_de_branches_theta ); GET_ARGUMENT_I("borne_superieure_branches_theta=""bspbt=" ,borne_superieure_perturbation_aleatoire_du_nombre_de_branches_theta ); GET_ARGUMENT_I("borne_inferieure_branches_phi=""bipbp=" ,borne_inferieure_perturbation_aleatoire_du_nombre_de_branches_phi_ ); GET_ARGUMENT_I("borne_superieure_branches_phi=""bspbp=" ,borne_superieure_perturbation_aleatoire_du_nombre_de_branches_phi_ ); /* Parametres introduits le 20130417151621... */ GET_ARGUMENT_F("borne_inferieure_rho=""bipr=",borne_inferieure_perturbation_aleatoire_de_rho_); GET_ARGUMENT_F("borne_superieure_rho=""bspr=",borne_superieure_perturbation_aleatoire_de_rho_); GET_ARGUMENT_F("borne_inferieure_theta=""bipt=",borne_inferieure_perturbation_aleatoire_de_theta); GET_ARGUMENT_F("borne_superieure_theta=""bspt=",borne_superieure_perturbation_aleatoire_de_theta); GET_ARGUMENT_F("borne_inferieure_phi=""bipp=",borne_inferieure_perturbation_aleatoire_de_phi_); GET_ARGUMENT_F("borne_superieure_phi=""bspp=",borne_superieure_perturbation_aleatoire_de_phi_); GET_ARGUMENT_F("borne_inferieure_Z=""bipz=",borne_inferieure_perturbation_aleatoire_de_Z___); GET_ARGUMENT_F("borne_superieure_Z=""bspz=",borne_superieure_perturbation_aleatoire_de_Z___); GET_ARGUMENT_L("signer_valeurs=""signe=",signer_les_valeurs); /* Parametres introduits le 20150628185445... */ GET_ARGUMENT_L("cartesiennes=""cartesienne=",editer_les_coordonnees_sous_forme_cartesienne); GET_ARGUMENT_N("spheriques=""spherique=",editer_les_coordonnees_sous_forme_cartesienne); ) ); EGAL(numero_du_noeud_courant,numero_de_la_racine_de_l_arbre); EDITIONS(NUMERO_DE_LA_RACINE_DE_QUADRANGULATION ,ETIQUETTE_DE_LA_RACINE_DE_QUADRANGULATION ,BLOC(Bblock Test(IFOU(IL_FAUT(numeroter_les_noeuds_de_l_arbre),IL_FAUT(etiquetter_les_noeuds_de_l_arbre))) Bblock CAL2(Prin0("RacineQuadrangulation")); Eblock ATes Bblock Eblock ETes Eblock ) ,BLOC(VIDE;) ,BLOC(VIDE;) ,BLOC(Bblock Test(IL_FAUT(numeroter_les_noeuds_de_l_arbre)) Bblock PRINT(ASD1(racine_de_quadrangulation,x),"X2",".^^^"); PRINT(ASD1(racine_de_quadrangulation,y),"Y2",".^^^"); PRINT(ASD1(racine_de_quadrangulation,z),"Z2",".^^^"); /* On notera qu'en permanence {X2,Y2,Z2} donne les coordonnees du noeud 'NumeroNoeud'... */ CAL2(Prin0(" ")); Eblock ATes Bblock Eblock ETes CAL2(Prin0("\n")); Eblock ) ); EDITIONS(numero_de_la_racine_de_l_arbre ,etiquette_de_la_racine_de_l_arbre ,BLOC(Bblock Test(IFOU(IL_FAUT(numeroter_les_noeuds_de_l_arbre),IL_FAUT(etiquetter_les_noeuds_de_l_arbre))) Bblock CAL2(Prin0("RacineArbre")); Eblock ATes Bblock Eblock ETes Eblock ) ,BLOC(Bblock Test(IL_FAUT(numeroter_les_noeuds_de_l_arbre)) Bblock PRINT(NUMERO_DE_LA_RACINE_DE_QUADRANGULATION,"NumeroPere","d"); Eblock ATes Bblock Eblock ETes Eblock ) ,BLOC(VIDE;) ,BLOC(Bblock Test(IL_FAUT(numeroter_les_noeuds_de_l_arbre)) Bblock PRINT(BRANCHE_DE_DEPART_X1,"X2",".^^^"); PRINT(BRANCHE_DE_DEPART_Y1,"Y2",".^^^"); PRINT(BRANCHE_DE_DEPART_Z1,"Z2",".^^^"); /* ATTENTION : ce n'ext pas un erreur, c'est bien {X1,Y,Z1} et {X2,Y2,Z2} qu'il faut */ /* utiliser pour la racine de l'arbre... */ /* */ /* On notera qu'en permanence {X2,Y2,Z2} donne les coordonnees du noeud 'NumeroNoeud'... */ CAL2(Prin0(" ")); Eblock ATes Bblock Eblock ETes CAL2(Prin0("\n")); Eblock ) ); SPIRALE_VALIDATION; INITIALISATION_POINT_2D(point_courant_de_l_espace_de_parametrage_2D,Xmin,Ymin); CALS(GenerationDeLArbre(profondeur_de_la_generation ,numero_de_la_racine_de_l_arbre ,numero_aligne_des_branches ,ADRESSE(branche_de_depart) ,etiquette_de_la_racine_de_l_arbre ,chain_Aconcaten3(filiation,chain_numero_exact(numero_incremental_absolu__des_branches),C_SLASH) ) ); /* Initialisation de la recursivite... */ RETU_Commande; Eblock ECommande