/*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A S U R F A C E P R O P R E M E N T D I T : */ /* */ /* */ /* Author of '$xrs/surfaces.12$I' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1993??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S I M A G E S F L O T T A N T E S U T I L E S : */ /* */ /*************************************************************************************************************************************/ -define image_Texture_R \ -_-_-_- IFmageA1 -define image_Texture_V \ -_-_-_- IFmageA2 -define image_Texture_B \ -_-_-_- IFmageA3 -define image_Rayon \ -_-_-_- IFmageA4 -define image_Coordonnee_U \ -_-_-_- IFmageA5 -define image_Coordonnee_V \ -_-_-_- IFmageA6 -define image_Trous \ -_-_-_- IFmageA7 -define image_Droite_UV_Calculee__ \ -_-_-_- IFmageA8 -define image_Droite_UV_Definition \ -_-_-_- IFmageA9 /* L'ensemble de ces definitions fut introduit le 20080705095732... */ /* */ /* Le 20170210155045, 'image_Droite_UV' est devenue 'image_Droite_UV_Calculee__' et */ /* 'image_Droite_UV_Definition' afin de faire la difference avec les eventuels Argument */ /* et Resultat... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A S U R F A C E V I A L E S C O O R D O N N E E S C U R V I L I G N E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.1A.I" #include xrv/champs_5.19.I" /* Pour eviter le message : */ /* */ /* Static function is not referenced. */ /* */ #include xrk/attractor.19.I" /* Validations et definition de l'espace physique. */ -define u_NORMALISEE \ -_-_-_- NORM(TRON(u,minimum_de_u,maximum_de_u),minimum_de_u,maximum_de_u) -define v_NORMALISEE \ -_-_-_- NORM(TRON(v,minimum_de_v,maximum_de_v),minimum_de_v,maximum_de_v) /* Introduit le 20041113111751. On notera que l'on ne peut utiliser {u_effectif,v_effectif} */ /* vu l'usage qui en est fait, en particulier pour acceder aux deux matrices */ /* {image_Coordonnee_U,image_Coordonnee_V} qui precisemment definissent */ /* {u_effectif,v_effectif} : cela "se mordrait la queue"... */ /* */ /* Le 20091102123057, la fonction 'TRON(...)' a ete introduite car, en effet, rien ne */ /* garantit avec certitude que les coordonnees {u,v} sont bien comprises entre les deux */ /* extrema... */ -define imageA_Droite_uv__interpoler \ -_-_-_- imageA_Droite_uv__interpoler_bilineairement_ou_bicubiquement -define imageA_Droite_uv__use_interpolation_lineaire \ -_-_-_- imageA_Droite_uv__utiliser_l_interpolation_bilineaire -define imageA_Droite_uv__eviter__discontinuites \ -_-_-_- imageA_Droite_uv__eviter_les_fortes_discontinuites -define imageA_Droite_uv__epsilon_discontinuites \ -_-_-_- imageA_Droite_uv__epsilon_detection_des_fortes_discontinuites -define image_Coordonnee_U__interpoler \ -_-_-_- image_Coordonnee_U__interpoler_bilineairement_ou_bicubiquement -define image_Coordonnee_U__use_interpolation_lineaire \ -_-_-_- image_Coordonnee_U__utiliser_l_interpolation_bilineaire -define image_Coordonnee_U__eviter__discontinuites \ -_-_-_- image_Coordonnee_U__eviter_les_fortes_discontinuites -define image_Coordonnee_U__epsilon_discontinuites \ -_-_-_- image_Coordonnee_U__epsilon_detection_des_fortes_discontinuites -define image_Coordonnee_V__interpoler \ -_-_-_- image_Coordonnee_V__interpoler_bilineairement_ou_bicubiquement -define image_Coordonnee_V__use_interpolation_lineaire \ -_-_-_- image_Coordonnee_V__utiliser_l_interpolation_bilineaire -define image_Coordonnee_V__eviter__discontinuites \ -_-_-_- image_Coordonnee_V__eviter_les_fortes_discontinuites -define image_Coordonnee_V__epsilon_discontinuites \ -_-_-_- image_Coordonnee_V__epsilon_detection_des_fortes_discontinuites -define image_Trous__interpoler \ -_-_-_- image_Trous__interpoler_bilineairement_ou_bicubiquement -define image_Trous__use_interpolation_lineaire \ -_-_-_- image_Trous__utiliser_l_interpolation_bilineaire -define image_Trous__eviter__discontinuites \ -_-_-_- image_Trous__eviter_les_fortes_discontinuites -define image_Trous__epsilon_discontinuites \ -_-_-_- image_Trous__epsilon_detection_des_fortes_discontinuites -define image_Rayon__interpoler \ -_-_-_- image_Rayon__interpoler_bilineairement_ou_bicubiquement -define image_Rayon__use_interpolation_lineaire \ -_-_-_- image_Rayon__utiliser_l_interpolation_bilineaire -define image_Rayon__eviter__discontinuites \ -_-_-_- image_Rayon__eviter_les_fortes_discontinuites -define image_Rayon__epsilon_discontinuites \ -_-_-_- image_Rayon__epsilon_detection_des_fortes_discontinuites -define image_Texture_R__interpoler \ -_-_-_- image_Texture_R__interpoler_bilineairement_ou_bicubiquement -define image_Texture_R__use_interpolation_lineaire \ -_-_-_- image_Texture_R__utiliser_l_interpolation_bilineaire -define image_Texture_R__eviter__discontinuites \ -_-_-_- image_Texture_R__eviter_les_fortes_discontinuites -define image_Texture_R__epsilon_discontinuites \ -_-_-_- image_Texture_R__epsilon_detection_des_fortes_discontinuites -define image_Texture_V__interpoler \ -_-_-_- image_Texture_V__interpoler_bilineairement_ou_bicubiquement -define image_Texture_V__use_interpolation_lineaire \ -_-_-_- image_Texture_V__utiliser_l_interpolation_bilineaire -define image_Texture_V__eviter__discontinuites \ -_-_-_- image_Texture_V__eviter_les_fortes_discontinuites -define image_Texture_V__epsilon_discontinuites \ -_-_-_- image_Texture_V__epsilon_detection_des_fortes_discontinuites -define image_Texture_B__interpoler \ -_-_-_- image_Texture_B__interpoler_bilineairement_ou_bicubiquement -define image_Texture_B__use_interpolation_lineaire \ -_-_-_- image_Texture_B__utiliser_l_interpolation_bilineaire -define image_Texture_B__eviter__discontinuites \ -_-_-_- image_Texture_B__eviter_les_fortes_discontinuites -define image_Texture_B__epsilon_discontinuites \ -_-_-_- image_Texture_B__epsilon_detection_des_fortes_discontinuites /* Afin de raccourcir des lignes qui suivent... */ -define GENERATION_DU_TEXTURAGE_DE_LA_SURFACE(texture_x,texture_y,texture_z) \ -_-_-_- Bblock \ -_-_-_- DEFV(Float,INIT(grossissement_courant_du_rayon_de_visualisation \ -_-_-_- ,COND(IFET(DIVISIBLE(echantillonnage_courant_de_u,echantillonnage_de_u) \ -_-_-_- ,DIVISIBLE(echantillonnage_courant_de_v,echantillonnage_de_v) \ -_-_-_- ) \ -_-_-_- ,grossissement_du_rayon_de_visualisation_aux_intersections_des_lignes_de_coordonnees \ -_-_-_- ,FU \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Afin de pouvoir marquer l'intersection des meridiens et des paralleles. Ceci a ete */ \ -_-_-_- /* ete introduit le 20041229183827... */ \ -_-_-_- \ -_-_-_- BSaveModifyVariable(Logical \ -_-_-_- ,AXES_COORDONNEES_FERMES_OUVERTS_____compatibilite_20090929 \ -_-_-_- ,COND(IL_FAUT(AXES_COORDONNEES_FERMES_OUVERTS__texturage_surfaces_____compatibilite_20130220) \ -_-_-_- ,AXES_COORDONNEES_FERMES_OUVERTS_____compatibilite_20090929 \ -_-_-_- ,VRAI \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Introduit le 20130220131511 et mis avant 'rayon_de_visualisation' le 20160326104228 */ \ -_-_-_- /* (donc avec quelques annees de retard...). */ \ -_-_-_- \ -_-_-_- Test(IFEQ_chaine(fichier_des_coordonnees_RAYON,NOM_PIPE_Local)) \ -_-_-_- /* Introduit le 20240517151859... */ \ -_-_-_- Bblock \ -_-_-_- Test(IL_FAUT(rayon_de_visualisation_____compatibilite_20170303)) \ -_-_-_- /* Test introduit le 20170303103205... */ \ -_-_-_- Bblock \ -_-_-_- EGAL(rayon_de_visualisation \ -_-_-_- ,MUL2(grossissement_courant_du_rayon_de_visualisation \ -_-_-_- ,loadF_point_valide(image_Rayon \ -_-_-_- ,_cDENORMALISE_OX(u_NORMALISEE) \ -_-_-_- ,_cDENORMALISE_OY(v_NORMALISEE) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Le champ rayon a ete introduit le 20041229174601. On notera que 'loadF_point(...)' */ \ -_-_-_- /* est utilise et non pas 'sgFFload_point_coordonnees_01(...)' comme on pourrait l'imaginer. */ \ -_-_-_- /* En effet, 'loadF_point(...)' garantit la valeur recuperee dans 'IFmageA4', alors que */ \ -_-_-_- /* 'sgFFload_point_coordonnees_01(...)' ferait une interpolation ; or dans le cas ou l'image */ \ -_-_-_- /* 'IFmageA4' est initialisee ci-apres via 'ACCES_AUX_IMAGES_FLOTTANTES(...)' avec la valeur */ \ -_-_-_- /* 'rayon_de_visualisation', il est essentiel de retrouver 'rayon_de_visualisation' quelle */ \ -_-_-_- /* que soient les valeurs de {u,v}... */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20160326104228, le 'loadF_point(...)' a ete remplace, avec quelques annees de */ \ -_-_-_- /* retard par un 'loadF_point_valide(...)'... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- EGAL(rayon_de_visualisation \ -_-_-_- ,MUL2(grossissement_courant_du_rayon_de_visualisation \ -_-_-_- ,sgFFload_point_coordonnees_01(image_Rayon \ -_-_-_- ,u_NORMALISEE \ -_-_-_- ,v_NORMALISEE \ -_-_-_- ,rayon_periodiser_X,rayon_periodiser_Y \ -_-_-_- ,rayon_symetriser_X,rayon_symetriser_Y \ -_-_-_- ,rayon_prolonger_X,rayon_prolonger_Y \ -_-_-_- ,rayon_niveau_hors_image \ -_-_-_- ,image_Rayon__interpoler \ -_-_-_- ,image_Rayon__use_interpolation_lineaire \ -_-_-_- ,image_Rayon__eviter__discontinuites \ -_-_-_- ,image_Rayon__epsilon_discontinuites \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IL_FAUT(texture_____compatibilite_20170303)) \ -_-_-_- /* Test introduit le 20170303103205... */ \ -_-_-_- Bblock \ -_-_-_- EGAL(texture_x \ -_-_-_- ,loadF_point_valide(image_Texture_R \ -_-_-_- ,_cDENORMALISE_OX(u_NORMALISEE) \ -_-_-_- ,_cDENORMALISE_OY(v_NORMALISEE) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(texture_y \ -_-_-_- ,loadF_point_valide(image_Texture_V \ -_-_-_- ,_cDENORMALISE_OX(u_NORMALISEE) \ -_-_-_- ,_cDENORMALISE_OY(v_NORMALISEE) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(texture_z \ -_-_-_- ,loadF_point_valide(image_Texture_B \ -_-_-_- ,_cDENORMALISE_OX(u_NORMALISEE) \ -_-_-_- ,_cDENORMALISE_OY(v_NORMALISEE) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Le 20130221074236, les 'loadF_point(...)'s ont ete remplaces, pour des raisons de */ \ -_-_-_- /* securite, par des 'loadF_point_valide(...)'s. Ce probleme s'est vu lors de la mmise au */ \ -_-_-_- /* point de la texture de 'v $xiirs/INFL.11' et c'est d'ailleurs a cette occasion que */ \ -_-_-_- /* 'AXES_COORDONNEES_FERMES_OUVERTS__texturage_surfaces_____compatibilite_20130220' fut */ \ -_-_-_- /* introduit... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- EGAL(texture_x \ -_-_-_- ,sgFFload_point_coordonnees_01(image_Texture_R \ -_-_-_- ,u_NORMALISEE \ -_-_-_- ,v_NORMALISEE \ -_-_-_- ,textures_periodiser_X,textures_periodiser_Y \ -_-_-_- ,textures_symetriser_X,textures_symetriser_Y \ -_-_-_- ,textures_prolonger_X,textures_prolonger_Y \ -_-_-_- ,textures_niveau_hors_image \ -_-_-_- ,image_Texture_R__interpoler \ -_-_-_- ,image_Texture_R__use_interpolation_lineaire \ -_-_-_- ,image_Texture_R__eviter__discontinuites \ -_-_-_- ,image_Texture_R__epsilon_discontinuites \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(texture_y \ -_-_-_- ,sgFFload_point_coordonnees_01(image_Texture_V \ -_-_-_- ,u_NORMALISEE \ -_-_-_- ,v_NORMALISEE \ -_-_-_- ,textures_periodiser_X,textures_periodiser_Y \ -_-_-_- ,textures_symetriser_X,textures_symetriser_Y \ -_-_-_- ,textures_prolonger_X,textures_prolonger_Y \ -_-_-_- ,textures_niveau_hors_image \ -_-_-_- ,image_Texture_V__interpoler \ -_-_-_- ,image_Texture_V__use_interpolation_lineaire \ -_-_-_- ,image_Texture_V__eviter__discontinuites \ -_-_-_- ,image_Texture_V__epsilon_discontinuites \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(texture_z \ -_-_-_- ,sgFFload_point_coordonnees_01(image_Texture_B \ -_-_-_- ,u_NORMALISEE \ -_-_-_- ,v_NORMALISEE \ -_-_-_- ,textures_periodiser_X,textures_periodiser_Y \ -_-_-_- ,textures_symetriser_X,textures_symetriser_Y \ -_-_-_- ,textures_prolonger_X,textures_prolonger_Y \ -_-_-_- ,textures_niveau_hors_image \ -_-_-_- ,image_Texture_B__interpoler \ -_-_-_- ,image_Texture_B__use_interpolation_lineaire \ -_-_-_- ,image_Texture_B__eviter__discontinuites \ -_-_-_- ,image_Texture_B__epsilon_discontinuites \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- ESaveModifyVariable(Logical \ -_-_-_- ,AXES_COORDONNEES_FERMES_OUVERTS_____compatibilite_20090929 \ -_-_-_- ); \ -_-_-_- /* Introduit le 20130220131511... */ \ -_-_-_- Eblock /* Calcul du texturage de la surface au point courant {u,v} associe au point {X,Y} de */ /* texture : */ /* */ /* {u,v} <--O--> {X,Y} */ /* */ /* et du rayon de visualisation effectif... */ -define PERMUTATION_EVENTUELLE_DES_COORDONNEES_ET_DES_DIFFERENTIELLES \ -_-_-_- Bblock \ -_-_-_- Test(IL_FAUT(permuter_les_coordonnees_et_les_differentielles)) \ -_-_-_- Bblock \ -_-_-_- fSWAP(cx,dcx); \ -_-_-_- fSWAP(cy,dcy); \ -_-_-_- fSWAP(cz,dcz); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock /* Permutation eventuelle des coordonnees et des differentielles. Ce dispositif a ete */ /* introduit le 20050615083227 "pour voir ce que cela donne"... */ -define MINIMUM_DE_u_LORS_D_UNE_PROJECTION \ -_-_-_- COND(IL_FAUT(forcer_les_extrema_de_u_v_lors_de_la_projection_de_la_surface) \ -_-_-_- ,minimum_de_u \ -_-_-_- ,sauvegarde_de_minimum_de_u \ -_-_-_- ) -define MAXIMUM_DE_u_LORS_D_UNE_PROJECTION \ -_-_-_- ADD2(COND(IL_FAUT(forcer_les_extrema_de_u_v_lors_de_la_projection_de_la_surface) \ -_-_-_- ,maximum_de_u \ -_-_-_- ,sauvegarde_de_maximum_de_u \ -_-_-_- ) \ -_-_-_- ,MOIT(pas_de_u) \ -_-_-_- ) -define MINIMUM_DE_v_LORS_D_UNE_PROJECTION \ -_-_-_- COND(IL_FAUT(forcer_les_extrema_de_u_v_lors_de_la_projection_de_la_surface) \ -_-_-_- ,minimum_de_v \ -_-_-_- ,sauvegarde_de_minimum_de_v \ -_-_-_- ) -define MAXIMUM_DE_v_LORS_D_UNE_PROJECTION \ -_-_-_- ADD2(COND(IL_FAUT(forcer_les_extrema_de_u_v_lors_de_la_projection_de_la_surface) \ -_-_-_- ,maximum_de_v \ -_-_-_- ,sauvegarde_de_maximum_de_v \ -_-_-_- ) \ -_-_-_- ,MOIT(pas_de_v) \ -_-_-_- ) /* Introduit le 20050908134309... */ #ifdef SI_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS_EST_ACTIVABLE_ALORS_L_UTILISER_AUSSI_POUR_LES_DERIVEES /* Le dispositif suivant fut introduit le 20080127084712 car, en effet, sauf pour */ /* quelques programmes (tel 'v $xrs/sphere.11$K'), le code genere pour le calcul */ /* etendu des derivees est monstrueux. C'est pourquoi celui-ci est inhibe a priori */ /* et n'est autorise a cette date que pour 'v $xrs/sphere.11$K'... */ # define EXTENSION_DU_CALCUL_DES_DERIVEES(indicateur,expression) \ USe_GooF______CONDITIONNEL(indicateur,expression) #Aifdef SI_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS_EST_ACTIVABLE_ALORS_L_UTILISER_AUSSI_POUR_LES_DERIVEES # define EXTENSION_DU_CALCUL_DES_DERIVEES(indicateur,expression) \ NEUT(expression) #Eifdef SI_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS_EST_ACTIVABLE_ALORS_L_UTILISER_AUSSI_POUR_LES_DERIVEES -define Fxyz(fonction) \ -_-_-_- USe_GooF______CONDITIONNEL(Fx_Fy_Fz_____utiliser_l_arithmetique_etendue_au_lieu_de_l_arithmetique_de_base \ -_-_-_- ,fonction \ -_-_-_- ) -define dFxyz(derivee) \ -_-_-_- EXTENSION_DU_CALCUL_DES_DERIVEES(dFx_dFy_dFz_____utiliser_l_arithmetique_etendue_au_lieu_de_l_arithmetique_de_base \ -_-_-_- ,derivee \ -_-_-_- ) /* Procedures introduites le 20080126082946... */ #ifdef PERMUTER_L_ORDRE_DE_PARCOURS_DES_COORDONNEES_u_v /* Possibilite introduite a cause de 'v $xrs/referentiel3D.11$I 20170307094803' le */ /* 20170307103744... */ # define DEFINITION_DE__XY__de_projection \ DEFV(Int,INIT(Y_de_projection,Ymin)); # define DEFINITION_DE__echantillonnage_courant_de_uv \ DEFV(Int,INIT(echantillonnage_courant_de_v,translation_de_l_echantillonnage_de_v)); # define DEFINITION_DE__XY__de_projection__ET_DEFINITION_DE__echantillonnage_courant_de_uv \ /* Introduit le 20221221141412... */ \ DEFV(Int,INIT(X_de_projection,Xmin)); \ DEFV(Int,INIT(echantillonnage_courant_de_u,translation_de_l_echantillonnage_de_u)); # define DEFINITION_DE__FDoIn_uv \ FDoIn(v,minimum_de_v_effectif,maximum_de_v_effectif,pas_de_v_effectif) \ Bblock \ DEFINITION_DE__XY__de_projection__ET_DEFINITION_DE__echantillonnage_courant_de_uv; \ \ FDoIn(u,minimum_de_u_effectif,maximum_de_u_effectif,pas_de_u_effectif) \ Bblock # define DEFINITION_DE__EFDoIn_uv \ INCR(echantillonnage_courant_de_u,I); \ INCR(X_de_projection,PasX); \ Eblock \ EFDoI \ \ INCR(echantillonnage_courant_de_v,I); \ INCR(Y_de_projection,PasY); \ Eblock \ EFDoI #Aifdef PERMUTER_L_ORDRE_DE_PARCOURS_DES_COORDONNEES_u_v # define DEFINITION_DE__XY__de_projection \ DEFV(Int,INIT(X_de_projection,Xmin)); \ /* Pour indexer les trois matrices de projection... */ # define DEFINITION_DE__echantillonnage_courant_de_uv \ DEFV(Int,INIT(echantillonnage_courant_de_u,translation_de_l_echantillonnage_de_u)); \ /* Afin de gerer l'echantillonnage de 'u' (introduit le 20021008095350 ; voir a ce */ \ /* propos 'v $xrs/surfaces.14$I 20021008094407'). */ \ /* */ \ /* La translation a ete introduite le 20040330113728 afin de permettre, par sa variation */ \ /* (0, 1, 2,...), de faire glisser la grille d'echantillonnage sur la surface... */ # define DEFINITION_DE__XY__de_projection__ET_DEFINITION_DE__echantillonnage_courant_de_uv \ /* Introduit le 20221221141412... */ \ DEFV(Int,INIT(Y_de_projection,Ymin)); \ /* Pour indexer les trois matrices de projection... */ \ DEFV(Int,INIT(echantillonnage_courant_de_v,translation_de_l_echantillonnage_de_v)); \ /* Afin de gerer l'echantillonnage de 'v' (introduit le 20021008095350 ; voir a ce */ \ /* propos 'v $xrs/surfaces.14$I 20021008094407'). */ \ /* */ \ /* La translation a ete introduite le 20040330113728 afin de permettre, par sa variation */ \ /* (0, 1, 2,...), de faire glisser la grille d'echantillonnage sur la surface... */ # define DEFINITION_DE__FDoIn_uv \ FDoIn(u,minimum_de_u_effectif,maximum_de_u_effectif,pas_de_u_effectif) \ /* Passage de 'DoIn(...)' a 'FDoIn(...)' le 20060602134331... */ \ Bblock \ DEFINITION_DE__XY__de_projection__ET_DEFINITION_DE__echantillonnage_courant_de_uv; \ \ FDoIn(v,minimum_de_v_effectif,maximum_de_v_effectif,pas_de_v_effectif) \ /* Passage de 'DoIn(...)' a 'FDoIn(...)' le 20060602134331... */ \ /* */ \ /* ATTENTION : le 20050822162446 j'ai note grace a 'v $xiirs/MOB2.11' que si les parametres */ \ /* du 'DoIn(...)' precedent (de meme evidemment que celui qui le precede...) utilisait des */ \ /* valeurs du type : */ \ /* */ \ /* mv=0 */ \ /* Mv=1 */ \ /* pv=0.01 */ \ /* */ \ /* ou 'pv' est l'inverse d'une puissance de 10, alors la borne superieure du 'DoIn(...)' */ \ /* n'est jamais atteinte. Il est donc suggere d'utiliser dans ce cas des inverses de */ \ /* puissance de 2. Grace a 'v $Dbugs/APC$D/LinuxDebian$D/GCC$D/boucle10.01$c', ce */ \ /* phenomene peut etre etudie... */ \ Bblock # define DEFINITION_DE__EFDoIn_uv \ INCR(echantillonnage_courant_de_v,I); \ /* Gestion de l'echantillonnage de 'v'. */ \ INCR(Y_de_projection,PasY); \ /* Gestion de l'indexation des matrices de projection... */ \ Eblock \ EFDoI \ \ INCR(echantillonnage_courant_de_u,I); \ /* Gestion de l'echantillonnage de 'u'. */ \ INCR(X_de_projection,PasX); \ /* Gestion de l'indexation des matrices de projection... */ \ Eblock \ EFDoI #Eifdef PERMUTER_L_ORDRE_DE_PARCOURS_DES_COORDONNEES_u_v -define GENERATION_DU_POINT_uv_COURANT(Fx,Fy,Fz,calcul_eventuel_point_courant,sequence_de_generation) \ -_-_-_- /* Procedure introduite le 20221221111016... */ \ -_-_-_- Bblock \ -_-_-_- begin_nouveau_block \ -_-_-_- Bblock \ -_-_-_- begin_nouveau_block \ -_-_-_- Bblock \ -_-_-_- /* Je note le 20221222080846 que cette suite de 'Bblock's est destinee a ne pas changer */ \ -_-_-_- /* la tabulation de ce qui suit... */ \ -_-_-_- DEFV(Float,INIT(u_effectif \ -_-_-_- ,COND(IL_NE_FAUT_PAS(transformer_u_v) \ -_-_-_- ,u \ -_-_-_- ,sgFFload_point_coordonnees_01(image_Coordonnee_U \ -_-_-_- ,u_NORMALISEE \ -_-_-_- ,v_NORMALISEE \ -_-_-_- ,transformer_u_v_periodiser_u \ -_-_-_- ,transformer_u_v_periodiser_v \ -_-_-_- ,transformer_u_v_symetriser_u \ -_-_-_- ,transformer_u_v_symetriser_v \ -_-_-_- ,transformer_u_v_prolonger_u \ -_-_-_- ,transformer_u_v_prolonger_v \ -_-_-_- ,transformer_u_v_niveau_hors_image \ -_-_-_- ,image_Coordonnee_U__interpoler \ -_-_-_- ,image_Coordonnee_U__use_interpolation_lineaire \ -_-_-_- ,image_Coordonnee_U__eviter__discontinuites \ -_-_-_- ,image_Coordonnee_U__epsilon_discontinuites \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* La matrice (ou "image") definissant la transformation de la coordonnee 'u', pour etre */ \ -_-_-_- /* neutre doit avoir une structure similaire a 'v $xiio/MIRE', soit : */ \ -_-_-_- /* */ \ -_-_-_- /* */ \ -_-_-_- /* | | | | | | | | | | */ \ -_-_-_- /* | | | | | | | | | | */ \ -_-_-_- /* | | | | | | | | | | */ \ -_-_-_- /* | | | | | | | | | | */ \ -_-_-_- /* | | | | | | | | | | */ \ -_-_-_- /* | | | | | | | | | | */ \ -_-_-_- /* | | | | | | | | | | */ \ -_-_-_- /* | | | | | | | | | | */ \ -_-_-_- /* */ \ -_-_-_- /* */ \ -_-_-_- /* Je note le 20060531104200 (avec un peu de retard que les {u,v} effectifs ne peuvent */ \ -_-_-_- /* etre evalues que lorsque les {u,v} "de base" sont connus, c'est-a-dire a l'interieur de */ \ -_-_-_- /* toutes les boucles 'DoIn(...)' imbriquees, d'ou de plus l'introduction des 'FDoIn(...)' */ \ -_-_-_- /* le 20060602134331 par precaution... */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20060601121716 je note qu'il faut etre tres prudent quant aux eventuelles */ \ -_-_-_- /* discontinuites dans l'image ('v $xiipf/fonction.2$FON 20060601101800')... */ \ -_-_-_- DEFV(Float,INIT(u_effectif_translate,FLOT__UNDEF)); \ -_-_-_- /* Introduit le 20091102170618... */ \ -_-_-_- DEFV(Float,INIT(d_u_effectif,d_u)); \ -_-_-_- /* Definition de la differentielle de la coordonnee 'u' effective (introduite le */ \ -_-_-_- /* 20060117130150). */ \ -_-_-_- DEFV(Float,INIT(v_effectif \ -_-_-_- ,COND(IL_NE_FAUT_PAS(transformer_u_v) \ -_-_-_- ,v \ -_-_-_- ,sgFFload_point_coordonnees_01(image_Coordonnee_V \ -_-_-_- ,u_NORMALISEE \ -_-_-_- ,v_NORMALISEE \ -_-_-_- ,transformer_u_v_periodiser_u \ -_-_-_- ,transformer_u_v_periodiser_v \ -_-_-_- ,transformer_u_v_symetriser_u \ -_-_-_- ,transformer_u_v_symetriser_v \ -_-_-_- ,transformer_u_v_prolonger_u \ -_-_-_- ,transformer_u_v_prolonger_v \ -_-_-_- ,transformer_u_v_niveau_hors_image \ -_-_-_- ,image_Coordonnee_V__interpoler \ -_-_-_- ,image_Coordonnee_V__use_interpolation_lineaire \ -_-_-_- ,image_Coordonnee_V__eviter__discontinuites \ -_-_-_- ,image_Coordonnee_V__epsilon_discontinuites \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* La matrice (ou "image") definissant la transformation de la coordonnee 'v', pour etre */ \ -_-_-_- /* neutre doit avoir une structure similaire a 'v $xiio/MIRE' transposee, soit : */ \ -_-_-_- /* */ \ -_-_-_- /* ___________________ */ \ -_-_-_- /* ___________________ */ \ -_-_-_- /* ___________________ */ \ -_-_-_- /* ___________________ */ \ -_-_-_- /* ___________________ */ \ -_-_-_- /* ___________________ */ \ -_-_-_- /* ___________________ */ \ -_-_-_- /* ___________________ */ \ -_-_-_- /* */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20060601121716 je note qu'il faut etre tres prudent quant aux eventuelles */ \ -_-_-_- /* discontinuites dans l'image ('v $xiipf/fonction.2$FON 20060601101800')... */ \ -_-_-_- DEFV(Float,INIT(v_effectif_translate,FLOT__UNDEF)); \ -_-_-_- /* Introduit le 20091102170618... */ \ -_-_-_- DEFV(Float,INIT(d_v_effectif,d_v)); \ -_-_-_- /* Definition de la differentielle de la coordonnee 'v' effective (introduite le */ \ -_-_-_- /* 20060117130150). */ \ -_-_-_- \ -_-_-_- EGAL(u_effectif \ -_-_-_- ,COND(IL_NE_FAUT_PAS(gestion_torique_de_u) \ -_-_-_- ,NEUT(u_effectif) \ -_-_-_- ,MODF(u_effectif,minimum_de_u_effectif,maximum_de_u_effectif) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(v_effectif \ -_-_-_- ,COND(IL_NE_FAUT_PAS(gestion_torique_de_v) \ -_-_-_- ,NEUT(v_effectif) \ -_-_-_- ,MODF(v_effectif,minimum_de_v_effectif,maximum_de_v_effectif) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* La gestion "torique" des coordonnees {u,v} a ete introduite le 20060601133040... */ \ -_-_-_- \ -_-_-_- Test(IFET(IFET(IFINff(u_effectif,minimum_de_u_effectif,maximum_de_u_effectif) \ -_-_-_- ,IFINff(v_effectif,minimum_de_v_effectif,maximum_de_v_effectif) \ -_-_-_- ) \ -_-_-_- /* Ce test d'inclusion a ete introduit le 20060529155547 car il manquait... */ \ -_-_-_- ,IFOU(IL_NE_FAUT_PAS(trouer_u_v) \ -_-_-_- ,IFET(IL_FAUT(trouer_u_v) \ -_-_-_- ,EST_VRAI(fLOGI(sgFFload_point_coordonnees_01(image_Trous \ -_-_-_- ,u_NORMALISEE \ -_-_-_- ,v_NORMALISEE \ -_-_-_- ,trouer_u_v_periodiser_u \ -_-_-_- ,trouer_u_v_periodiser_v \ -_-_-_- ,trouer_u_v_symetriser_u \ -_-_-_- ,trouer_u_v_symetriser_v \ -_-_-_- ,trouer_u_v_prolonger_u \ -_-_-_- ,trouer_u_v_prolonger_v \ -_-_-_- ,LA_SURFACE_EST_INTEGRE \ -_-_-_- ,image_Trous__interpoler \ -_-_-_- ,image_Trous__use_interpolation_lineaire \ -_-_-_- ,image_Trous__eviter__discontinuites \ -_-_-_- ,image_Trous__epsilon_discontinuites \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- /* Le 20060602091942 fut introduit le 'fLOGI(...)' pour eviter des trous parasites lies */ \ -_-_-_- /* a des "rebonds" d'interpolation qui font que ce qui devrait valoir exactement 1 ('VRAI') */ \ -_-_-_- /* peut valoir un tout petit peu moins, d'ou 0 ('FAUX') avec un 'LOGI(...)'... */ \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- Bblock \ -_-_-_- /* Ce test a ete introduit le 20060529131510. Via 'IL_FAUT(transformer_u_v)', il permet */ \ -_-_-_- /* de ne visualiser que certains "morceaux" de la surface. Jusqu'au 20060529152510, cela */ \ -_-_-_- /* s'est fait en utilisant {image_Coordonnee_U,image_Coordonnee_V} de la facon suivante : */ \ -_-_-_- /* */ \ -_-_-_- /* u_effectif = u */ \ -_-_-_- /* v_effectif = v */ \ -_-_-_- /* */ \ -_-_-_- /* soit : */ \ -_-_-_- /* */ \ -_-_-_- /* image_Coordonnee_U(u,v) = u (parametre "imageU=") */ \ -_-_-_- /* image_Coordonnee_V(u,v) = v (parametre "imageV=") */ \ -_-_-_- /* */ \ -_-_-_- /* partout ou l'on souhaite visualiser la surface et par exemple : */ \ -_-_-_- /* */ \ -_-_-_- /* u_effectif = INFINI */ \ -_-_-_- /* v_effectif = INFINI */ \ -_-_-_- /* */ \ -_-_-_- /* soit : */ \ -_-_-_- /* */ \ -_-_-_- /* image_Coordonnee_U(u,v) = INFINI (parametre "imageU=") */ \ -_-_-_- /* image_Coordonnee_V(u,v) = INFINI (parametre "imageV=") */ \ -_-_-_- /* */ \ -_-_-_- /* la ou l'on souhaite ne pas la representer ('v $xci/lineaire$K 20060529134923'). On notera */ \ -_-_-_- /* qu'il est essentiel de prendre reellement une valeur tres grande (qui est notee 'INFINI' */ \ -_-_-_- /* ci-dessus) a cause de la fonction 'sgFFload_point_coordonnees_01(...)' utilisee pour */ \ -_-_-_- /* determiner les {u,v} effectifs. En effet, celle-ci fait de l'interpolation et il est */ \ -_-_-_- /* donc essentiel de pouvoir distinguer les "bons" {u,v} a visualiser des autres a ne pas */ \ -_-_-_- /* visualiser, et ce apres le processus d'interpolation... */ \ -_-_-_- /* */ \ -_-_-_- /* Soit par exemple le cas suivant : */ \ -_-_-_- /* */ \ -_-_-_- /* <A VISUALISER> <A NE PAS VISUALISER> */ \ -_-_-_- /* */ \ -_-_-_- /* u : (...) 1.0 <---> 1.1 (...) */ \ -_-_-_- /* | */ \ -_-_-_- /* image_Coordonnee_U(u,v) : (...) 1.0 | 1e100 (...) */ \ -_-_-_- /* | */ \ -_-_-_- /* | */ \ -_-_-_- /* | */ \ -_-_-_- /* | */ \ -_-_-_- /* 'u' flottant d'acces a 'image_Coordonnee_U' */ \ -_-_-_- /* via 'sgFFload_point_coordonnees_01(...)' */ \ -_-_-_- /* */ \ -_-_-_- /* avec : */ \ -_-_-_- /* */ \ -_-_-_- /* u E [0,pi] (cas de 'v $xrs/sphere.11$K' par exemple) */ \ -_-_-_- /* */ \ -_-_-_- /* La difference entre '1.0' et '1e100' est telle que la probabilite que la valeur */ \ -_-_-_- /* resultant de leur interpolation (a partir du 'u' flottant d'acces a 'image_Coordonnee_U') */ \ -_-_-_- /* soit hors de [0,pi] est pratiquement egale a 1. */ \ -_-_-_- /* */ \ -_-_-_- /* On verra a ce propos l'image 'v $xiirs/SPHE.52'... */ \ -_-_-_- /* */ \ -_-_-_- /* Malgre tout, cet alea a conduit le 20060529152510 a introduire 'IFmageA7' dont le role */ \ -_-_-_- /* est specifiquement celui de gerer le trouage... */ \ -_-_-_- DEFV(Float,INIT(equation_d_une_droite_du_plan_uv,FLOT__UNDEF)); \ -_-_-_- /* Definition, meme si elle ne sert pas par la suite) de l'equation d'une droite dans le */ \ -_-_-_- /* plan {u,v}... */ \ -_-_-_- \ -_-_-_- Test(IL_FAUT(tracer_une_droite_du_plan_uv)) \ -_-_-_- /* Test introduit le 20060817180753... */ \ -_-_-_- Bblock \ -_-_-_- DEFV(Float,INIT(u_effectif_modulo \ -_-_-_- ,MODF(u_effectif \ -_-_-_- ,minimum_de_u_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ,maximum_de_u_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- DEFV(Float,INIT(v_effectif_modulo \ -_-_-_- ,MODF(v_effectif \ -_-_-_- ,minimum_de_v_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ,maximum_de_v_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Le 20170131092659 'MODF(...)' a remplace 'MODFcs(...)', c'est beaucoup plus logique... */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20170210130509, afin de simplifier le traitement de 'nom_imageA_Droite_uv', les */ \ -_-_-_- /* coordonnees {u_effectif_modulo,v_effectif_modulo} sont calculees ici, meme s'il faut */ \ -_-_-_- /* la 'tracer_une_droite_du_plan_uv_____compatibilite_20170130'... */ \ -_-_-_- \ -_-_-_- Test(IFEQ_chaine(nom_imageA_Droite_uv,NOM_PIPE_Local)) \ -_-_-_- /* Test introduit le 20170210130509... */ \ -_-_-_- Bblock \ -_-_-_- Test(IL_FAUT(tracer_une_droite_du_plan_uv_____compatibilite_20170130)) \ -_-_-_- /* Test introduit le 20170130143806... */ \ -_-_-_- Bblock \ -_-_-_- EGAL(equation_d_une_droite_du_plan_uv \ -_-_-_- ,ADD6(FfMODFcs(MUL2(coefficient_A_d_une_droite_du_plan_uv,u_effectif) \ -_-_-_- ,minimum_de_u_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ,maximum_de_u_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ,FfMODFcs(MUL2(coefficient_B_d_une_droite_du_plan_uv,v_effectif) \ -_-_-_- ,minimum_de_v_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ,maximum_de_v_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ,coefficient_C_d_une_droite_du_plan_uv \ -_-_-_- ,MUL2(coefficient_F_d_une_droite_du_plan_uv \ -_-_-_- ,EXP2(FfMODFcs(u_effectif \ -_-_-_- ,minimum_de_u_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ,maximum_de_u_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ,MUL2(coefficient_G_d_une_droite_du_plan_uv \ -_-_-_- ,MUL2(FfMODFcs(u_effectif \ -_-_-_- ,minimum_de_u_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ,maximum_de_u_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ,FfMODFcs(v_effectif \ -_-_-_- ,minimum_de_v_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ,maximum_de_v_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ,MUL2(coefficient_H_d_une_droite_du_plan_uv \ -_-_-_- ,EXP2(FfMODFcs(v_effectif \ -_-_-_- ,minimum_de_v_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ,maximum_de_v_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Calcul de l'equation d'une droite dans le plan {u,v}... */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20071204115817 'FfMODFcs(...)' a remplace 'MODFcs(...)' afin d'alleger le code */ \ -_-_-_- /* genere... */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20170124104505, cette droite a ete "generalisee" par l'introduction de {F,G,H}... */ \ -_-_-_- /* L'usage de 'HORNER_2_02(u,v,a22,a21,a20,a12,a11,a10,a02,a01,a00)' avec : */ \ -_-_-_- /* */ \ -_-_-_- /* A = a01 */ \ -_-_-_- /* B = a10 */ \ -_-_-_- /* C = a00 */ \ -_-_-_- /* */ \ -_-_-_- /* est difficile, voire impossible, a cause de l'usage de 'FfMODFcs(...)' ci-dessus... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- EGAL(equation_d_une_droite_du_plan_uv \ -_-_-_- ,LIN5(coefficient_A_d_une_droite_du_plan_uv \ -_-_-_- ,NEUT(u_effectif_modulo) \ -_-_-_- ,coefficient_B_d_une_droite_du_plan_uv \ -_-_-_- ,NEUT(v_effectif_modulo) \ -_-_-_- ,coefficient_F_d_une_droite_du_plan_uv \ -_-_-_- ,EXP2(u_effectif_modulo) \ -_-_-_- ,coefficient_G_d_une_droite_du_plan_uv \ -_-_-_- ,MUL2(u_effectif_modulo,v_effectif_modulo) \ -_-_-_- ,coefficient_H_d_une_droite_du_plan_uv \ -_-_-_- ,EXP2(v_effectif_modulo) \ -_-_-_- ,coefficient_C_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- EGAL(equation_d_une_droite_du_plan_uv \ -_-_-_- ,sgFFload_point_coordonnees_01(image_Droite_UV_Definition \ -_-_-_- ,NORM(u_effectif_modulo \ -_-_-_- ,minimum_de_u_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ,maximum_de_u_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ,NORM(v_effectif_modulo \ -_-_-_- ,minimum_de_v_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ,maximum_de_v_du_domaine_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ,FAUX,FAUX \ -_-_-_- ,FAUX,FAUX \ -_-_-_- ,VRAI,VRAI \ -_-_-_- ,ZERO_D_UNE_DROITE_DU_PLAN_UV \ -_-_-_- ,imageA_Droite_uv__interpoler \ -_-_-_- ,imageA_Droite_uv__use_interpolation_lineaire \ -_-_-_- ,imageA_Droite_uv__eviter__discontinuites \ -_-_-_- ,imageA_Droite_uv__epsilon_discontinuites \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Ce dispositif introduit le 20170210130509 permet d'initialiser arbitrairement */ \ -_-_-_- /* la droite (qui alors peut ne plus etre une droite...). */ \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IFET(IL_FAUT(generer_les_trois_projections_de_la_surface) \ -_-_-_- ,IL_FAUT(visualiser_la_droite_tracee_dans_le_plan_uv) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- Bblock \ -_-_-_- storeF_point_valide(equation_d_une_droite_du_plan_uv \ -_-_-_- ,image_Droite_UV_Calculee__ \ -_-_-_- ,X_de_projection \ -_-_-_- ,Y_de_projection \ -_-_-_- ); \ -_-_-_- /* La memorisation d'une droite dans le plan {u,v} ne peut se faire que s'il y a projection */ \ -_-_-_- /* de la surface afin de pouvoir beneficier de {X_de_projection,Y_de_projection}... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IFOU(IFET(IL_FAUT(visualiser_les_points_du_maillage_uv) \ -_-_-_- ,IFOU(DIVISIBLE(echantillonnage_courant_de_u,echantillonnage_de_u) \ -_-_-_- ,DIVISIBLE(echantillonnage_courant_de_v,echantillonnage_de_v) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ,IFET(IL_FAUT(tracer_une_droite_du_plan_uv) \ -_-_-_- ,IZEQ_a_peu_pres(equation_d_une_droite_du_plan_uv \ -_-_-_- ,epsilon_de_definition_d_une_droite_du_plan_uv \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- /* Le test sur la droite du plan {u,v} fut introduit le 20060813111731... */ \ -_-_-_- /* */ \ -_-_-_- /* ATTENTION, on notera que l'equation de la droite est a priori : */ \ -_-_-_- /* */ \ -_-_-_- /* A.u + B.v + C = 0 */ \ -_-_-_- /* */ \ -_-_-_- /* (a "epsilon pres"). Afin de prendre en compte le "modulo" (ou "repliement"), l'equation */ \ -_-_-_- /* de la droite est en fait : */ \ -_-_-_- /* */ \ -_-_-_- /* mod(A.u,Um,UM) + mod(B.v,Vm,VM) + C = 0 */ \ -_-_-_- /* */ \ -_-_-_- /* Pour que le "repliement" de la droite ait bien lieu avec les 'modulo's ci-dessus, il */ \ -_-_-_- /* est essentiel que : */ \ -_-_-_- /* */ \ -_-_-_- /* UM - Um */ \ -_-_-_- /* --------- soit un nombre entier divisible par 'A' (si 'A' entier...) */ \ -_-_-_- /* pas_u */ \ -_-_-_- /* */ \ -_-_-_- /* et que : */ \ -_-_-_- /* */ \ -_-_-_- /* VM - Vm */ \ -_-_-_- /* --------- soit un nombre entier divisible par 'B' (si 'B' entier...) */ \ -_-_-_- /* pas_v */ \ -_-_-_- /* */ \ -_-_-_- /* ou 'pas_u' et 'pas_v' designent les pas de parcours des axes 'u' et 'v' respectivement, */ \ -_-_-_- /* ainsi que le montre la figure suivante : */ \ -_-_-_- /* */ \ -_-_-_- /* */ \ -_-_-_- /* v ^ */ \ -_-_-_- /* | */ \ -_-_-_- /* VM |------------------+ */ \ -_-_-_- /* | /. /| */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / ./ | */ \ -_-_-_- /* |..................| ATTENTION : figure correspondant */ \ -_-_-_- /* | /. /| a A=+1 et B=-3/2. Dans le cas */ \ -_-_-_- /* | / . / | A=+2 et B=-3 il y a deux fois */ \ -_-_-_- /* | / . / | plus de rectangles elementaires */ \ -_-_-_- /* | / . / | dans les deux directions... */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / ./ | */ \ -_-_-_- /* |..................| */ \ -_-_-_- /* | /. /| */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / . / | */ \ -_-_-_- /* | / ./ | */ \ -_-_-_- /* Vm |---------------------------------------> */ \ -_-_-_- /* */ \ -_-_-_- /* Um UM u */ \ -_-_-_- /* */ \ -_-_-_- /* */ \ -_-_-_- /* qui montre la droite : */ \ -_-_-_- /* */ \ -_-_-_- /* 2u - 3v = 0 */ \ -_-_-_- /* */ \ -_-_-_- /* repliee, soit avec : */ \ -_-_-_- /* */ \ -_-_-_- /* A = +2 */ \ -_-_-_- /* B = -3 */ \ -_-_-_- /* C = 0 */ \ -_-_-_- /* */ \ -_-_-_- /* qui permet, par exemple, a 'v $xrs/tore.11$K' de visualiser (dessine sur un tore) le */ \ -_-_-_- /* noeud "trefle" ('v $xiirv/KNOT.11.3.1'), a condition de prendre : */ \ -_-_-_- /* */ \ -_-_-_- /* u E [0,4.pi] */ \ -_-_-_- /* v E [0,4.pi] */ \ -_-_-_- /* */ \ -_-_-_- /* Mais, ATTENTION, on notera que la droite en fait calculee est la suivante (que l'on */ \ -_-_-_- /* peut visualiser grace a 'IL_FAUT(visualiser_la_droite_tracee_dans_le_plan_uv)' en */ \ -_-_-_- /* n'oubliant alors pas le 'IL_FAUT(generer_les_trois_projections_de_la_surface)') : */ \ -_-_-_- /* */ \ -_-_-_- /* */ \ -_-_-_- /* v ^ */ \ -_-_-_- /* | */ \ -_-_-_- /* VM |------------------+ */ \ -_-_-_- /* |\ .\ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \| */ \ -_-_-_- /* |..................| ATTENTION : figure correspondant */ \ -_-_-_- /* |\ .\ | a A=+1 et B=-3/2. Dans le cas */ \ -_-_-_- /* | \ . \ | A=+2 et B=-3 il y a deux fois */ \ -_-_-_- /* | \ . \ | plus de rectangles elementaires */ \ -_-_-_- /* | \ . \ | dans les deux directions... */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \| */ \ -_-_-_- /* |..................| */ \ -_-_-_- /* |\ .\ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \ | */ \ -_-_-_- /* | \ . \| */ \ -_-_-_- /* Vm |---------------------------------------> */ \ -_-_-_- /* */ \ -_-_-_- /* Um UM u */ \ -_-_-_- /* */ \ -_-_-_- /* */ \ -_-_-_- /* c'est-a-dire qu'elle subit une symetrie d'axe horizontal. Cela fut compris en */ \ -_-_-_- /* visualisant la droite precedente en mode 'Suh' (afin d'avoir peu de points...). */ \ -_-_-_- /* Le pas en 'u' et 'v' valait alors : */ \ -_-_-_- /* */ \ -_-_-_- /* pas = 0.19635 */ \ -_-_-_- /* */ \ -_-_-_- /* Les points de coordonnees multiples de : */ \ -_-_-_- /* */ \ -_-_-_- /* {3*pas,2*pas} = {0.589049,0.392699} */ \ -_-_-_- /* */ \ -_-_-_- /* devaient donc etre sur la droite puisque : */ \ -_-_-_- /* */ \ -_-_-_- /* (2*0.589049) - (3*0.392699) = 0 (a epsilon pres...). */ \ -_-_-_- /* */ \ -_-_-_- /* Mais en fait ils n'y sont pas a cause des 'MODFcs(...)' ci-dessus. Voici a titre */ \ -_-_-_- /* d'exemple les valeurs calculees ci-dessus pour les deux premiers points qui auraient */ \ -_-_-_- /* du appartenir a la droite : */ \ -_-_-_- /* */ \ -_-_-_- /* u=0.000000 v=0.000000 MODFcs(A.u)=+0.000000 MODFcs(B.v)=+0.000000 equation=0.000000 */ \ -_-_-_- /* u=0.589049 v=0.392699 MODFcs(A.u)=+1.178097 MODFcs(B.v)=-5.105088 equation=-3.926991 */ \ -_-_-_- /* */ \ -_-_-_- /* Ainsi, pour le deuxieme point, les deux produits 'A.u' et 'B.v' valent : */ \ -_-_-_- /* */ \ -_-_-_- /* A.u = +2*0.589049 = +1.178097 */ \ -_-_-_- /* B.v = -3*0.392699 = -1.178097 */ \ -_-_-_- /* */ \ -_-_-_- /* et sont donc egaux en valeur absolue. Mais il en est malheureusement autrement des */ \ -_-_-_- /* valeurs obtenues avec les procedures 'MODFcs(...)' car, en effet, dans le cas du */ \ -_-_-_- /* produit 'B.v', ce dernier est negatif et va donc etre ramene dans [0,2.pi] ; on a */ \ -_-_-_- /* ainsi : */ \ -_-_-_- /* */ \ -_-_-_- /* -(2.pi - 1.178097) = -5.105088 */ \ -_-_-_- /* */ \ -_-_-_- /* d'ou la symetrie annoncee. On notera enfin que ces symetries sont sans consequences */ \ -_-_-_- /* car, en effet, elles preservent les proprietes de la droite "repliee"... */ \ -_-_-_- /* */ \ -_-_-_- /* Autre remarque ; a cause des 'MODFcs(...)' les deux droites : */ \ -_-_-_- /* */ \ -_-_-_- /* A = +2 */ \ -_-_-_- /* B = -3 */ \ -_-_-_- /* C = 0 */ \ -_-_-_- /* */ \ -_-_-_- /* et : */ \ -_-_-_- /* */ \ -_-_-_- /* A = +1 */ \ -_-_-_- /* B = -3/2 */ \ -_-_-_- /* C = 0 */ \ -_-_-_- /* */ \ -_-_-_- /* ne sont pas equivalentes... */ \ -_-_-_- /* */ \ -_-_-_- /* */ \ -_-_-_- /* Le test sur 'visualiser_les_points_du_maillage_uv' a ete introduit le 20060814185659 */ \ -_-_-_- /* afin de permettre de ne tracer que la droite dans le plan {u,v}... */ \ -_-_-_- /* */ \ -_-_-_- /* */ \ -_-_-_- /* On notera le 20170129100240 qu'en toute generalite, la probabilite pour que la droite */ \ -_-_-_- /* dans le plan {u,v} passe par les noeux du maillage en {u,v} de ce plan est en fait assez */ \ -_-_-_- /* faible. Cela marche bien, par exemple, pour 'v $xiirs/SPHE.K1', mais dans beaucoup */ \ -_-_-_- /* d'autres cas, c'est moins evident : ce fut le cas en essayant de tracer cette droite */ \ -_-_-_- /* sur la surface 'v $xiirs/HELI.11' pour laquelle la proportion de points situes sur le */ \ -_-_-_- /* maillage (a "epsilon" pres) est tres faible ; ainsi, par exemple, avec : */ \ -_-_-_- /* */ \ -_-_-_- /* Eduv=0.001 */ \ -_-_-_- /* dpu=4 */ \ -_-_-_- /* dpv=4 */ \ -_-_-_- /* */ \ -_-_-_- /* il y a 198 points sur la droite, pour un total de 834880 points constituants le maillage. */ \ -_-_-_- /* */ \ -_-_-_- /* */ \ -_-_-_- /* On notera le 20170130111451 que si l'on souhaite, par exemple, une droite qui soit la */ \ -_-_-_- /* diagonale principale du domaine [Um,UM]x[Vm,VM], il faut prendre : */ \ -_-_-_- /* */ \ -_-_-_- /* Aduv = (VM)-(Vm))/((UM)-(Um)) */ \ -_-_-_- /* Bduv = -1 */ \ -_-_-_- /* Cduv = Vm */ \ -_-_-_- /* */ \ -_-_-_- Bblock \ -_-_-_- EGAL(u_effectif_translate \ -_-_-_- ,ADD2(u_effectif \ -_-_-_- ,MUL2(facteur_de_la_translation_de_u_effectif_lors_d_un_lister \ -_-_-_- ,SOUS(maximum_de_u_effectif,minimum_de_u_effectif) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(v_effectif_translate \ -_-_-_- ,ADD2(v_effectif \ -_-_-_- ,MUL2(facteur_de_la_translation_de_v_effectif_lors_d_un_lister \ -_-_-_- ,SOUS(maximum_de_v_effectif,minimum_de_v_effectif) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- \ -_-_-_- EGAL(c_est_le_calcul_de__cx__cy__cz,VRAI); \ -_-_-_- EGAL(cx,Fxyz(Fx(u_effectif,v_effectif))); \ -_-_-_- EGAL(cy,Fxyz(Fy(u_effectif,v_effectif))); \ -_-_-_- EGAL(cz,Fxyz(Fz(u_effectif,v_effectif))); \ -_-_-_- EGAL(c_est_le_calcul_de__cx__cy__cz,FAUX); \ -_-_-_- /* Generation du point courant de la surface... */ \ -_-_-_- /* */ \ -_-_-_- /* On notera qu'avant le 20041126090202, le calcul de {cx,cy,cz} figurait explicitement a */ \ -_-_-_- /* l'interieur des differentes 'sequence_de_generation'. Mais avec l'introduction de la */ \ -_-_-_- /* generation eventuelle des trois "projections" d'une surface, il est plus astucieux et */ \ -_-_-_- /* economique de faire cela avant l'appel de 'sequence_de_generation'... */ \ -_-_-_- \ -_-_-_- Test(IFET(IL_FAUT(generer_les_trois_projections_de_la_surface) \ -_-_-_- ,EST_VRAI(les_trois_projections_de_la_surface_doivent_etre_transformees) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- Bblock \ -_-_-_- DEFV(Float,INIT(cx_transformee \ -_-_-_- ,TRANSFORMATION_GEOMETRIQUE_3D_Fx(cx,cy,cz \ -_-_-_- ,ASD1(translation_de_l_origine,dx) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- DEFV(Float,INIT(cy_transformee \ -_-_-_- ,TRANSFORMATION_GEOMETRIQUE_3D_Fy(cx,cy,cz \ -_-_-_- ,ASD1(translation_de_l_origine,dy) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- DEFV(Float,INIT(cz_transformee \ -_-_-_- ,TRANSFORMATION_GEOMETRIQUE_3D_Fz(cx,cy,cz \ -_-_-_- ,ASD1(translation_de_l_origine,dz) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- \ -_-_-_- EGAL(cx,cx_transformee); \ -_-_-_- EGAL(cy,cy_transformee); \ -_-_-_- EGAL(cz,cz_transformee); \ -_-_-_- /* Dispositif introduit le 20090606103424 qui permet donc de transformer les projections */ \ -_-_-_- /* via les 'ROTATION_O?'s et 'TRANSLATION_O?'s... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IFET(IL_FAUT(generer_les_trois_projections_de_la_surface) \ -_-_-_- ,EST_VRAI(les_trois_projections_de_la_surface_sont_en_fait_celles_de_la_texture) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- Bblock \ -_-_-_- DEFV(Float,INIT(coordonnee_X_texture,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(coordonnee_Y_texture,FLOT__UNDEF)); \ -_-_-_- /* Coordonnees {X,Y} dans [0,1] d'acces a la texture (introduites le 20050820082930...). */ \ -_-_-_- DEFV(Float,INIT(texture_x,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(texture_y,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(texture_z,FLOT__UNDEF)); \ -_-_-_- /* Definition des trois textures. */ \ -_-_-_- \ -_-_-_- Test(EST_VRAI(les_trois_projections_de_la_texture_sont_mappees_sur_la_surface)) \ -_-_-_- Bblock \ -_-_-_- EGAL(coordonnee_X_texture,Projection_OX(cx,cy,cz)); \ -_-_-_- EGAL(coordonnee_Y_texture,Projection_OY(cx,cy,cz)); \ -_-_-_- /* Cas ou ce sont les distorsions de la texture mappee qui vont etre generees en tant */ \ -_-_-_- /* que "projection de la surface"... */ \ -_-_-_- /* */ \ -_-_-_- /* Pour resumer, soit donc {u,v} les coordonnees curvilignes courantes. Les coordonnees */ \ -_-_-_- /* tridimensionnelles {cx,cy,cz} sont donc : */ \ -_-_-_- /* */ \ -_-_-_- /* cx = F (u,v) */ \ -_-_-_- /* x */ \ -_-_-_- /* */ \ -_-_-_- /* cy = F (u,v) */ \ -_-_-_- /* y */ \ -_-_-_- /* */ \ -_-_-_- /* cz = F (u,v) */ \ -_-_-_- /* z */ \ -_-_-_- /* */ \ -_-_-_- /* Par projection, les coordonnees bidimensionnelles {px,py} sont alors : */ \ -_-_-_- /* */ \ -_-_-_- /* px = Projection_OX(cx,cy,cz) */ \ -_-_-_- /* py = Projection_OY(cx,cy,cz) */ \ -_-_-_- /* */ \ -_-_-_- /* Le point {u,v} de la projection sera alors marque par le niveau au point {px,py} de la */ \ -_-_-_- /* texture : */ \ -_-_-_- /* */ \ -_-_-_- /* PROJECTION(u,v) = TEXTURE(px,py) */ \ -_-_-_- /* */ \ -_-_-_- /* dans le cas 'EST_VRAI(les_trois_projections_de_la_texture_sont_mappees_sur_la_surface)'). */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- EGAL(coordonnee_X_texture,cx); \ -_-_-_- EGAL(coordonnee_Y_texture,cy); \ -_-_-_- /* Cas ou c'est la texture utilisee qui va etre generee en tant que "projection de la */ \ -_-_-_- /* surface" (ceci a ete introduit le 20050820082930...). */ \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- EGAL(texture_x \ -_-_-_- ,sgFFload_point_coordonnees_01(image_Texture_R \ -_-_-_- ,coordonnee_X_texture \ -_-_-_- ,coordonnee_Y_texture \ -_-_-_- ,textures_periodiser_X,textures_periodiser_Y \ -_-_-_- ,textures_symetriser_X,textures_symetriser_Y \ -_-_-_- ,textures_prolonger_X,textures_prolonger_Y \ -_-_-_- ,textures_niveau_hors_image \ -_-_-_- ,image_Texture_R__interpoler \ -_-_-_- ,image_Texture_R__use_interpolation_lineaire \ -_-_-_- ,image_Texture_R__eviter__discontinuites \ -_-_-_- ,image_Texture_R__epsilon_discontinuites \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(texture_y \ -_-_-_- ,sgFFload_point_coordonnees_01(image_Texture_V \ -_-_-_- ,coordonnee_X_texture \ -_-_-_- ,coordonnee_Y_texture \ -_-_-_- ,textures_periodiser_X,textures_periodiser_Y \ -_-_-_- ,textures_symetriser_X,textures_symetriser_Y \ -_-_-_- ,textures_prolonger_X,textures_prolonger_Y \ -_-_-_- ,textures_niveau_hors_image \ -_-_-_- ,image_Texture_V__interpoler \ -_-_-_- ,image_Texture_V__use_interpolation_lineaire \ -_-_-_- ,image_Texture_V__eviter__discontinuites \ -_-_-_- ,image_Texture_V__epsilon_discontinuites \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(texture_z \ -_-_-_- ,sgFFload_point_coordonnees_01(image_Texture_B \ -_-_-_- ,coordonnee_X_texture \ -_-_-_- ,coordonnee_Y_texture \ -_-_-_- ,textures_periodiser_X,textures_periodiser_Y \ -_-_-_- ,textures_symetriser_X,textures_symetriser_Y \ -_-_-_- ,textures_prolonger_X,textures_prolonger_Y \ -_-_-_- ,textures_niveau_hors_image \ -_-_-_- ,image_Texture_B__interpoler \ -_-_-_- ,image_Texture_B__use_interpolation_lineaire \ -_-_-_- ,image_Texture_B__eviter__discontinuites \ -_-_-_- ,image_Texture_B__epsilon_discontinuites \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- \ -_-_-_- EGAL(cx,texture_x); \ -_-_-_- EGAL(cy,texture_y); \ -_-_-_- EGAL(cz,texture_z); \ -_-_-_- /* Et on modifie {cx,cy,cz} pour simplifier les choses... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IL_FAUT(generer_les_trois_projections_de_la_surface)) \ -_-_-_- /* Cas ou il faut generer les trois projections (introduit le 20041126090603) : */ \ -_-_-_- Bblock \ -_-_-_- storeF_point_valide(cx \ -_-_-_- ,Projection_de_Fx \ -_-_-_- ,X_de_projection \ -_-_-_- ,Y_de_projection \ -_-_-_- ); \ -_-_-_- storeF_point_valide(cy \ -_-_-_- ,Projection_de_Fy \ -_-_-_- ,X_de_projection \ -_-_-_- ,Y_de_projection \ -_-_-_- ); \ -_-_-_- storeF_point_valide(cz \ -_-_-_- ,Projection_de_Fz \ -_-_-_- ,X_de_projection \ -_-_-_- ,Y_de_projection \ -_-_-_- ); \ -_-_-_- /* Generation des trois projections d'une surface tel que cela est defini et exploite */ \ -_-_-_- /* dans 'v $xrs/project2D.11$K P.R.O.J.E.C.T.O.R'. Ceci a ete introduit le 20041125111850. */ \ -_-_-_- /* */ \ -_-_-_- /* On notera que pour que cela ait un interet, il faut que : */ \ -_-_-_- /* */ \ -_-_-_- /* diviseur_du_pas_de_u = 1 (dpu=1) */ \ -_-_-_- /* diviseur_du_pas_de_v = 1 (dpv=1) */ \ -_-_-_- /* */ \ -_-_-_- /* maximum_de_u - minimum_de_u */ \ -_-_-_- /* pas_de_u = ----------------------------- */ \ -_-_-_- /* dimX */ \ -_-_-_- /* */ \ -_-_-_- /* maximum_de_v - minimum_de_v */ \ -_-_-_- /* pas_de_v = ----------------------------- */ \ -_-_-_- /* dimY */ \ -_-_-_- /* */ \ -_-_-_- /* afin de bien "remplir" les matrices {Proj_Fx,Proj_Fy,Proj_Fz}. */ \ -_-_-_- /* */ \ -_-_-_- /* Les 'storeF_point(...)'s ont ete remplaces par des 'storeF_point_valide(...)'s le */ \ -_-_-_- /* 20050114215322 pour des raisons de prudence... */ \ -_-_-_- /* */ \ -_-_-_- /* On notera le 20050202174415 que, par exemple, dans le cas de 'v $xrs/sphere.11$K', */ \ -_-_-_- /* il faudra utiliser : */ \ -_-_-_- /* */ \ -_-_-_- /* Mu=6.283185307179586 ($dpi) */ \ -_-_-_- /* PARAMETRE_R=1 */ \ -_-_-_- /* */ \ -_-_-_- /* si l'on souhaite reinjecter les trois champs "standard=FAUX" dans 'v $xrs/project2D.11$K' */ \ -_-_-_- /* et que n'apparaissent pas des artefacts ; dans ce dernier programme, il faudra alors */ \ -_-_-_- /* utiliser : */ \ -_-_-_- /* */ \ -_-_-_- /* mu=0.0 Mu=0.5 */ \ -_-_-_- /* mv=0.0 Mv=1.0 */ \ -_-_-_- /* */ \ -_-_-_- /* afin de respecter les symetries... */ \ -_-_-_- /* */ \ -_-_-_- /* L'utilisation des coordonnees entieres {X_de_projection,Y_de_projection} a ete introduite */ \ -_-_-_- /* le 20050908130630 pour eviter les "trous" dans les matrices de projection... */ \ -_-_-_- \ -_-_-_- storeI_point_valide(ADD2(loadI_point(validation_de_la_projection \ -_-_-_- ,X_de_projection \ -_-_-_- ,Y_de_projection \ -_-_-_- ) \ -_-_-_- ,I \ -_-_-_- ) \ -_-_-_- ,validation_de_la_projection \ -_-_-_- ,X_de_projection \ -_-_-_- ,Y_de_projection \ -_-_-_- ); \ -_-_-_- /* Marquage de tous les points {u,v} possibles... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- /* Cas ou il faut visualiser la surface : */ \ -_-_-_- BLOC(sequence_de_generation); \ -_-_-_- /* Generation specifique de l'image de la surface pour le point courant {u,v}. */ \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock \ -_-_-_- end_nouveau_block \ -_-_-_- Eblock \ -_-_-_- end_nouveau_block \ -_-_-_- Eblock /* Generation du point courant {u,v} introduit sous cette forme le 20221221111016... */ #ifdef NE_PAS_PERMETTRE_LA_DEFINITION_ARBITRAIRE_DES_COORDONNEES_U_ET_V /* Ceci fut introduit le 20221224170113 pour les programmes : */ /* */ /* $xrq/Hspherik.11$K */ /* $xrq/Hspherik.21$K */ /* $xrq/hydrogene.21$K */ /* $xrq/hydrogene.51$K */ /* */ /* car, en effet, il manquait beaucoup de choses dans le cas ou la procedure */ /* 'DEFINITION_ARBITRAIRE_DES_COORDONNEES_U_ET_V(...)' etait activee... */ - define DEFINITION_ARBITRAIRE_DES_COORDONNEES_U_ET_V(Fx,Fy,Fz,calcul_eventuel_point_courant,sequence_de_generation) \ -_-_-_- /* Mis sous cette forme le 20221224170113... */ \ -_-_-_- Bblock \ -_-_-_- Eblock #Aifdef NE_PAS_PERMETTRE_LA_DEFINITION_ARBITRAIRE_DES_COORDONNEES_U_ET_V - define index_definition_arbitraire \ -_-_-_- index_de_definition_arbitraire_des_coordonnees_u_v /* Afin de raccourcir certaines des lignes qui suivent... */ /* */ /* Le 20240519095641, le symbole 'index_de_definition_arbitraire' a ete remplace par */ /* 'index_definition_arbitraire' par compatibilite avec les autres fichiers : */ /* */ /* 'v $xrs/volumes.12.I index_definition_arbitraire', */ /* 'v $xrs/hyper_volumes.12.I index_definition_arbitraire', */ /* 'v $xrs/hyper_hyper_volumes.12.I index_definition_arbitraire'. */ /* */ - define DEFINITION_ARBITRAIRE_DES_COORDONNEES_U_ET_V(Fx,Fy,Fz,calcul_eventuel_point_courant,sequence_de_generation) \ -_-_-_- /* Mis sous cette forme le 20221224170113... */ \ -_-_-_- Bblock \ -_-_-_- begin_nouveau_block \ -_-_-_- Bblock \ -_-_-_- /* Je note le 20240517125211 que cette suite de 'Bblock's est destinee a ne pas changer */ \ -_-_-_- /* la tabulation de ce qui suit... */ \ -_-_-_- DEFINITION_DE__XY__de_projection; \ -_-_-_- DEFINITION_DE__echantillonnage_courant_de_uv; \ -_-_-_- DEFINITION_DE__XY__de_projection__ET_DEFINITION_DE__echantillonnage_courant_de_uv; \ -_-_-_- /* Ne servent qu'a permettre 'GENERATION_DU_POINT_uv_COURANT(...)' ci-apres... */ \ -_-_-_- \ -_-_-_- DEFV(Logical,INIT(recuperer_les_coordonnees_u_v,VRAI)); \ -_-_-_- \ -_-_-_- Test(IL_FAUT(generer_les_trois_projections_de_la_surface)) \ -_-_-_- /* Test introduit le 20221222080846... */ \ -_-_-_- Bblock \ -_-_-_- PRINT_ATTENTION("pas de projection de la surface lorsque les coordonnees {u,v} sont arbitraires"); \ -_-_-_- EGAL(generer_les_trois_projections_de_la_surface,FAUX); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Tant(IL_FAUT(recuperer_les_coordonnees_u_v)) \ -_-_-_- Bblock \ -_-_-_- DEFV(Float,INIT(u,ELEMENT_DU_FICHIER_COORDONNEES_u(index_definition_arbitraire))); \ -_-_-_- DEFV(Float,INIT(v,ELEMENT_DU_FICHIER_COORDONNEES_v(index_definition_arbitraire))); \ -_-_-_- \ -_-_-_- Test(IFET(IFNE(u,separateur_de_definition_arbitraire_des_coordonnees_u_v) \ -_-_-_- ,IFNE(v,separateur_de_definition_arbitraire_des_coordonnees_u_v) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- /* Test introduit le 20230217093513... */ \ -_-_-_- Bblock \ -_-_-_- Test(I3ET(IFNE_chaine(fichier_des_coordonnees_ROUGE,NOM_PIPE_Local) \ -_-_-_- ,IFNE_chaine(fichier_des_coordonnees_VERTE,NOM_PIPE_Local) \ -_-_-_- ,IFNE_chaine(fichier_des_coordonnees_BLEUE,NOM_PIPE_Local) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- /* Possibilite introduite le 20230125094726... */ \ -_-_-_- Bblock \ -_-_-_- EGAL(differentielle_ROUGE \ -_-_-_- ,ELEMENT_DU_FICHIER_COORDONNEES_ROUGE(index_definition_arbitraire) \ -_-_-_- ); \ -_-_-_- EGAL(differentielle_VERTE \ -_-_-_- ,ELEMENT_DU_FICHIER_COORDONNEES_VERTE(index_definition_arbitraire) \ -_-_-_- ); \ -_-_-_- EGAL(differentielle_BLEUE \ -_-_-_- ,ELEMENT_DU_FICHIER_COORDONNEES_BLEUE(index_definition_arbitraire) \ -_-_-_- ); \ -_-_-_- /* Les initialisations de 'GENERATION_D_UNE_IMAGE_DU_VOLUME_AVEC_DIFFERENCES____(...)' */ \ -_-_-_- /* sont donc ici "oubliees"... */ \ -_-_-_- \ -_-_-_- EGAL(utiliser_les_differentielles_ROUGE_VERTE_BLEUE,VRAI); \ -_-_-_- /* Afin de pouvoir definir {differentielle_x,differentielle_y,differentielle_z} */ \ -_-_-_- /* dans 'GENERATION_D_UNE_IMAGE_DU_VOLUME_AVEC_DIFFERENCES____(...)' */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IFNE_chaine(fichier_des_coordonnees_RAYON,NOM_PIPE_Local)) \ -_-_-_- Bblock \ -_-_-_- EGAL(rayon_de_visualisation \ -_-_-_- ,ELEMENT_DU_FICHIER_COORDONNEES_RAYON(index_definition_arbitraire) \ -_-_-_- ); \ -_-_-_- /* Introduit le 20240517140948... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IFNE_chaine(fichier_des_coordonnees_MASSE,NOM_PIPE_Local)) \ -_-_-_- Bblock \ -_-_-_- EGAL(masse_de_la_sphere_courante \ -_-_-_- ,ELEMENT_DU_FICHIER_COORDONNEES_MASSE(index_definition_arbitraire) \ -_-_-_- ); \ -_-_-_- /* Introduit le 20240519090955... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- GENERATION_DU_POINT_uv_COURANT(Fx,Fy,Fz,calcul_eventuel_point_courant,sequence_de_generation); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- EGAL(recuperer_les_coordonnees_u_v,FAUX); \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- INCR(index_definition_arbitraire,pas_de_parcours_d_un_fichier); \ -_-_-_- \ -_-_-_- Test(IFGT(index_definition_arbitraire,DERNIER_ELEMENT_D_UN_FICHIER)) \ -_-_-_- Bblock \ -_-_-_- EGAL(index_definition_arbitraire,PREMIER_ELEMENT_D_UN_FICHIER); \ -_-_-_- EGAL(recuperer_les_coordonnees_u_v,FAUX); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock \ -_-_-_- ETan \ -_-_-_- Eblock \ -_-_-_- end_nouveau_block \ -_-_-_- Eblock #Eifdef NE_PAS_PERMETTRE_LA_DEFINITION_ARBITRAIRE_DES_COORDONNEES_U_ET_V -define gGENERATION_D_UNE_IMAGE_DE_LA_SURFACE(Fx,Fy,Fz,calcul_eventuel_point_courant,sequence_de_generation) \ -_-_-_- Bblock \ -_-_-_- BDEFV(imageI,validation_de_la_projection); \ -_-_-_- /* Dispositif de validation de la projection introduit le 20050908115636 et mis ici */ \ -_-_-_- /* (et donc genere meme s'il n'y a pas de projection) le 20050909135931 afin de simplifier */ \ -_-_-_- /* et d'integrer le code de validation de la projection au calcul de celle-ci... */ \ -_-_-_- DEFINITION_DE__XY__de_projection; \ -_-_-_- /* Pour indexer les trois matrices de projection... */ \ -_-_-_- \ -_-_-_- DEFV(Float,INIT(differentielle_ROUGE,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(differentielle_VERTE,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(differentielle_BLEUE,FLOT__UNDEF)); \ -_-_-_- DEFV(Logical,INIT(utiliser_les_differentielles_ROUGE_VERTE_BLEUE,FAUX)); \ -_-_-_- /* Introduit le 20230124142028 car, en effet, les trois differentielles utiles */ \ -_-_-_- /* {differentielle_x,differentielle_y,differentielle_z} n'existent pas ici, etant */ \ -_-_-_- /* definies localement ulterieurement... */ \ -_-_-_- \ -_-_-_- DEFV(Float,INIT(minimum_de_u_effectif \ -_-_-_- ,COND(IL_FAUT(generer_les_trois_projections_de_la_surface) \ -_-_-_- ,MINIMUM_DE_u_LORS_D_UNE_PROJECTION \ -_-_-_- ,minimum_de_u \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- DEFV(Float,INIT(maximum_de_u_effectif \ -_-_-_- ,ADD2(COND(IL_FAUT(generer_les_trois_projections_de_la_surface) \ -_-_-_- ,MAXIMUM_DE_u_LORS_D_UNE_PROJECTION \ -_-_-_- ,maximum_de_u \ -_-_-_- ) \ -_-_-_- ,COND(IL_FAUT(majoration_du_maximum_des_coordonnees_u_v_____compatibilite_20160414) \ -_-_-_- ,FZERO \ -_-_-_- ,epsilon_de_majoration_du_maximum_des_coordonnees_u_v \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- DEFV(Float,INIT(minimum_de_v_effectif \ -_-_-_- ,COND(IL_FAUT(generer_les_trois_projections_de_la_surface) \ -_-_-_- ,MINIMUM_DE_v_LORS_D_UNE_PROJECTION \ -_-_-_- ,minimum_de_v \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- DEFV(Float,INIT(maximum_de_v_effectif \ -_-_-_- ,ADD2(COND(IL_FAUT(generer_les_trois_projections_de_la_surface) \ -_-_-_- ,MAXIMUM_DE_v_LORS_D_UNE_PROJECTION \ -_-_-_- ,maximum_de_v \ -_-_-_- ) \ -_-_-_- ,COND(IL_FAUT(majoration_du_maximum_des_coordonnees_u_v_____compatibilite_20160414) \ -_-_-_- ,FZERO \ -_-_-_- ,epsilon_de_majoration_du_maximum_des_coordonnees_u_v \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Ceci a ete introduit le 20050908130630 apres avoir note, lors de la generation de */ \ -_-_-_- /* l'image 'v $xiirs/PROJ.81', que la balayage en {u,v} destine a generer les trois */ \ -_-_-_- /* matrices de projection {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} laissait */ \ -_-_-_- /* des "trous" sous la forme d'une ligne (u=1) et une colonne (v=1) non atteinte. */ \ -_-_-_- /* La solution semble etre d'augmenter dans ce cas les maxima de 'u' et de 'v' et d'indexer */ \ -_-_-_- /* les trois matrices de projection en entier {X,Y}... */ \ -_-_-_- /* */ \ -_-_-_- /* 'minimum_de_u_effectif' et 'minimum_de_v_effectif' ont ete introduits le 20060306161232 */ \ -_-_-_- /* pour simplifier 'forcer_les_extrema_de_u_v_lors_de_la_projection_de_la_surface'... */ \ -_-_-_- /* */ \ -_-_-_- /* La modification du 20160414102502 vient de l'observation que les 'FDoIn(...)' concernant */ \ -_-_-_- /* {u,v} qui vont suivre n'atteignent pas toujours le maximum. Ainsi, par exemple : */ \ -_-_-_- /* */ \ -_-_-_- /* FDoIn(uv,-0.5,+0.5,0.050) ==> 'uv' atteint +0.5 */ \ -_-_-_- /* */ \ -_-_-_- /* alors que : */ \ -_-_-_- /* */ \ -_-_-_- /* FDoIn(uv,-0.5,+0.5,0.025) ==> 'uv' atteint +0.475000 */ \ -_-_-_- /* */ \ -_-_-_- /* (voir a ce propos 'v $xtc/test_for_flottant.01$c'). */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20160414145616 fut introduit l'epsilon. On notera au passage qu'il est different de */ \ -_-_-_- /* de celui de 'v $xrs/volumes.14$I mgEPSILON'... */ \ -_-_-_- DEFV(Float,INIT(pas_de_u_effectif,DIVI(pas_de_u,diviseur_du_pas_de_u))); \ -_-_-_- DEFV(Float,INIT(pas_de_v_effectif,DIVI(pas_de_v,diviseur_du_pas_de_v))); \ -_-_-_- /* Afin faciliter l'utilisation de l'echantillonnage, facilite introduite le 20021009100745. */ \ -_-_-_- \ -_-_-_- DEFINITION_DE__echantillonnage_courant_de_uv; \ -_-_-_- /* Afin de gerer l'echantillonnage de 'u' (introduit le 20021008095350 ; voir a ce */ \ -_-_-_- /* propos 'v $xrs/surfaces.14$I 20021008094407'). */ \ -_-_-_- /* */ \ -_-_-_- /* La translation a ete introduite le 20040330113728 afin de permettre, par sa variation */ \ -_-_-_- /* (0, 1, 2,...), de faire glisser la grille d'echantillonnage sur la surface... */ \ -_-_-_- \ -_-_-_- DEFV(Float,INIT(pas_de_u_de_differentiation,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(pas_de_v_de_differentiation,FLOT__UNDEF)); \ -_-_-_- EGAL(pas_de_u_de_differentiation \ -_-_-_- ,DIVI(COND(EST_VRAI(le_pas_de_u_de_differentiation_est_homothetique),pas_de_u_effectif,pas_de_u) \ -_-_-_- ,diviseur_de_differentiation_de_u \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(pas_de_v_de_differentiation \ -_-_-_- ,DIVI(COND(EST_VRAI(le_pas_de_v_de_differentiation_est_homothetique),pas_de_v_effectif,pas_de_v) \ -_-_-_- ,diviseur_de_differentiation_de_v \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Afin de faire une differentiation approchee (introduit le 20041107145321). On notera que */ \ -_-_-_- /* cela est definie systematiquement alors que ce n'est evidemment utile que dans la */ \ -_-_-_- /* procedure 'GENERATION_D_UNE_IMAGE_DE_LA_SURFACE_AVEC_DIFFERENCES____(...)'. */ \ -_-_-_- \ -_-_-_- Test(IL_FAUT(generer_les_trois_projections_de_la_surface)) \ -_-_-_- /* Cas ou il faut generer les trois projections (introduit le 20050909135931) : */ \ -_-_-_- Bblock \ -_-_-_- begin_image \ -_-_-_- Bblock \ -_-_-_- storeI_point(ZERO,validation_de_la_projection,X,Y); \ -_-_-_- /* A priori aucun point ne va etre atteint ci-apres... */ \ -_-_-_- Eblock \ -_-_-_- end_image \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IL_FAUT(tracer_une_droite_du_plan_uv)) \ -_-_-_- /* Test introduit le 20060817180753 et simplifie le 20170210154046... */ \ -_-_-_- Bblock \ -_-_-_- ACCES_AUX_IMAGES_FLOTTANTES(image_Droite_UV_Definition,nom_imageA_Droite_uv,ZERO_D_UNE_DROITE_DU_PLAN_UV); \ -_-_-_- /* Initialisation eventuelle et arbitraire de la droite (introduite le 20170210130509)... */ \ -_-_-_- /* Par defaut, si l'image n'existe pas, il y a compatibilite anterirure... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(I3ET(IL_FAUT(generer_les_trois_projections_de_la_surface) \ -_-_-_- ,IL_FAUT(tracer_une_droite_du_plan_uv) \ -_-_-_- ,IL_FAUT(visualiser_la_droite_tracee_dans_le_plan_uv) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- /* Test introduit le 20060817180753... */ \ -_-_-_- Bblock \ -_-_-_- CALi(IFinitialisation(image_Droite_UV_Calculee__,ZERO_D_UNE_DROITE_DU_PLAN_UV)); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IL_FAUT(definir_arbitrairement_les_coordonnees_u_v)) \ -_-_-_- /* Possibilite introduite le 20221221112338... */ \ -_-_-_- Bblock \ -_-_-_- DEFINITION_ARBITRAIRE_DES_COORDONNEES_U_ET_V(Fx,Fy,Fz,calcul_eventuel_point_courant,sequence_de_generation); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- DEFINITION_DE__FDoIn_uv \ -_-_-_- Bblock \ -_-_-_- /* Introduit le 20221221102504 pour de simples raisons "esthetiques"... */ \ -_-_-_- GENERATION_DU_POINT_uv_COURANT(Fx,Fy,Fz,calcul_eventuel_point_courant,sequence_de_generation); \ -_-_-_- /* Introduit sous cette forme le 20221221111016... */ \ -_-_-_- Eblock \ -_-_-_- DEFINITION_DE__EFDoIn_uv \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IL_FAUT(generer_les_trois_projections_de_la_surface)) \ -_-_-_- /* Cas ou il faut generer les trois projections (introduit le 20050909135931) : */ \ -_-_-_- Bblock \ -_-_-_- begin_image \ -_-_-_- Bblock \ -_-_-_- Test(IZEQ(loadI_point(validation_de_la_projection,X,Y))) \ -_-_-_- Bblock \ -_-_-_- PRINT_ERREUR("un point de la projection n'est pas atteint"); \ -_-_-_- CAL1(Prer2("il s'agit du point de coordonnees {u,v}={%f,%f}\n" \ -_-_-_- ,_____cNORMALISE_OX(X) \ -_-_-_- ,_____cNORMALISE_OY(Y) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock \ -_-_-_- end_image \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- EDEFV(imageI,validation_de_la_projection); \ -_-_-_- /* Dispositif de validation de la projection introduit le 20050908115636... */ \ -_-_-_- Eblock /* Calcul et visualisation generale de la surface pour un instant donne. */ -define LISTER_EVENTUELLEMENT_LES_COORDONNEES_u_v_DES_POINTS \ -_-_-_- Bblock \ -_-_-_- Test(IFET(IL_FAUT(lister_la_liste_des_points) \ -_-_-_- ,IL_FAUT(lister_les_coordonnees_u_v_des_points) \ -_-_-_- /* Ceci fut introduit le 20060410110714 car, en effet, a de nombreux endroits on teste */ \ -_-_-_- /* "^periode=" en sortie d'un programme de '$xrs' ('v $xiirv/$Fnota periode='). Il faut */ \ -_-_-_- /* que l'edition de {u,v} soit facultative et inhibee par defaut, puisque {u,v} sont */ \ -_-_-_- /* edites avant "periode=" pour la raison evoquee dans le commentaire suivant... */ \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- Bblock \ -_-_-_- Test(IFET(IZGT(rayon_de_visualisation) \ -_-_-_- ,IFOU(EST_VRAI(les_trois_les_differentielles_peuvent_etre_nulles) \ -_-_-_- ,IFET(EST_FAUX(les_trois_les_differentielles_peuvent_etre_nulles) \ -_-_-_- ,IFOU(IL_NE_FAUT_PAS(renormaliser_arbitrairement_derivees) \ -_-_-_- ,IFET(IL_FAUT(renormaliser_arbitrairement_derivees) \ -_-_-_- ,I3OU(IZNE(dcx) \ -_-_-_- ,IZNE(dcy) \ -_-_-_- ,IZNE(dcz) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- /* Ce test est identique a celui de 'v $xrv/champs_5.26$I 20091102125100' et a ete introduit */ \ -_-_-_- /* le 20091102123057 de facon a ne lister {u,v} que si l'on est bien dans les conditions */ \ -_-_-_- /* de listage des autres donnees type {X,Y,Z}... */ \ -_-_-_- Bblock \ -_-_-_- CAL2(Prin2(" U=%+.^^^ V=%+.^^^ " \ -_-_-_- ,u_effectif_translate \ -_-_-_- ,v_effectif_translate \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Ceci fut introduit le 20060410103842 afin de permettre de tracer les surfaces via */ \ -_-_-_- /* 'v $xrv/particule.10$K equidistance=' qui permet de garantir l'equidistance des */ \ -_-_-_- /* points sur une chaine de connexion contrairement a ce qui est fait ici pour la */ \ -_-_-_- /* gestion des coordonnees {u,v} qui sont echantillonnees regulierement dans l'espace */ \ -_-_-_- /* [u,v] et non pas dans l'espace physique [X,Y,Z]. On notera que la logique voudrait que */ \ -_-_-_- /* cette sequence soit appelee apres l'appel a 'memorisation_1_point_06(...)' mais cela est */ \ -_-_-_- /* impossible a cause de 'v $xrv/champs_5.11$I LISTER_LA_LISTE_DES_COULEURS_DES_POINTS' */ \ -_-_-_- /* qui emet un 'K_LF' a la fin ; la sortie de "u=... v=..." aurait donc lieu sur la ligne */ \ -_-_-_- /* suivante... */ \ -_-_-_- /* */ \ -_-_-_- /* Malheureusement l'usage de 'v $xrv/particule.10$K equidistance=' ne disposera pas les */ \ -_-_-_- /* points intermediaires des chaines de connexion selon les equations de la surface, mais */ \ -_-_-_- /* selon le schema d'interpolation utilise. L'apparence de la surface ne sera donc en */ \ -_-_-_- /* general pas correcte (phenomene decouvert le 20060410151148)... */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20090619091246, un espace fut introduit devant l'edition de "U=" afin d'homogeniser */ \ -_-_-_- /* le traitement des listes ainsi editees ('v $xiirs/.CAYA.E1.1.$U :U="'), l'extraction */ \ -_-_-_- /* de la coordonnee 'U' se faisant alors comme pour 'V', 'X', 'Y', 'Z',... et donc en */ \ -_-_-_- /* testant un espace devant et un "=" derriere... */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20091123123454, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock /* Listage des coordonnees {u,v} des points introduit le 20060410105510... */ -define GENERATION_D_UNE_IMAGE_DE_LA_SURFACE_SANS_DIFFERENTIATION(Fx,Fy,Fz,calcul_eventuel_point_courant) \ -_-_-_- Bblock \ -_-_-_- DEFV(Float,INIT(d_u,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(d_v,FLOT__UNDEF)); \ -_-_-_- /* Ces definitions n'ont comme seule utilite que d'eviter des problemes de compilation */ \ -_-_-_- /* suite a la definition de {d_u_effectif,d_v_effectif} le 20060117130150 dans la procedure */ \ -_-_-_- /* 'gGENERATION_D_UNE_IMAGE_DE_LA_SURFACE(...)'... */ \ -_-_-_- \ -_-_-_- gGENERATION_D_UNE_IMAGE_DE_LA_SURFACE \ -_-_-_- (Fx,Fy,Fz \ -_-_-_- ,BLOC(calcul_eventuel_point_courant) \ -_-_-_- ,BLOC(Bblock \ -_-_-_- GENERATION_DU_TEXTURAGE_DE_LA_SURFACE(dcx,dcy,dcz); \ -_-_-_- /* Calcul des textures en passant de {mu,Mu}x{mv,Mv} a {Xmin,Xmax}x{Ymin,Ymax}. */ \ -_-_-_- \ -_-_-_- RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; \ -_-_-_- /* On notera que cette recherche n'est pas conditionnee par 'editer_les_extrema', car les */ \ -_-_-_- /* extrema pourraient etre utilises pour la visualisation... */ \ -_-_-_- \ -_-_-_- BLOC(calcul_eventuel_point_courant); \ -_-_-_- /* Calculs eventuels d'informations specifiques au point courant... */ \ -_-_-_- \ -_-_-_- PERMUTATION_EVENTUELLE_DES_COORDONNEES_ET_DES_DIFFERENTIELLES; \ -_-_-_- /* Permutation eventuelle de {cx,cy,cz} et de {dcx,dcy,dcz} (introduit le 20050615083227). */ \ -_-_-_- \ -_-_-_- LISTER_EVENTUELLEMENT_LES_COORDONNEES_u_v_DES_POINTS; \ -_-_-_- /* Introduit le 20060410105510... */ \ -_-_-_- \ -_-_-_- CALS(memorisation_1_point_06(SOUS(cx,Xcentre_ESPACE) \ -_-_-_- ,SOUS(cy,Ycentre_ESPACE) \ -_-_-_- ,SOUS(cz,Zcentre_ESPACE) \ -_-_-_- ,dcx \ -_-_-_- ,dcy \ -_-_-_- ,dcz \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Memorisation du point courant. */ \ -_-_-_- Eblock \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- Eblock /* Calcul et visualisation de la surface pour un instant donne sans differentiation. */ -define MEMORISATION_DU_POINT_COURANT_ET_DE_SA_NORMALE_EVENTUELLE(calcul_eventuel_point_courant,calcul_eventuel_derivees_partielles) \ -_-_-_- Bblock \ -_-_-_- /* La possibilite 'prendre_la_valeur_absolue_des_differentielles' introduite le */ \ -_-_-_- /* 20060131120200 a ete transferee vers 'v $xrk/attractor.1C$I 20060201095118' le */ \ -_-_-_- /* 20060201094919 pour en augmenter la portee... */ \ -_-_-_- \ -_-_-_- RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; \ -_-_-_- /* On notera que cette recherche n'est pas conditionnee par 'editer_les_extrema', car les */ \ -_-_-_- /* extrema pourraient etre utilises pour la visualisation... */ \ -_-_-_- \ -_-_-_- BLOC(calcul_eventuel_point_courant); \ -_-_-_- /* Calculs eventuels d'informations specifiques au point courant... */ \ -_-_-_- \ -_-_-_- Test(IFOU(IL_NE_FAUT_PAS(visualiser_la_normale) \ -_-_-_- ,IFET(IL_FAUT(visualiser_la_normale) \ -_-_-_- ,IFOU(NON_DIVISIBLE(echantillonnage_courant_de_u,echantillonnage_de_u) \ -_-_-_- ,NON_DIVISIBLE(echantillonnage_courant_de_v,echantillonnage_de_v) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- /* La visualisation de la normale uniquement aux noeuds du maillage defini par */ \ -_-_-_- /* l'echantillonnage de {u,v} a ete introduit le 20021010120751. */ \ -_-_-_- Bblock \ -_-_-_- PERMUTATION_EVENTUELLE_DES_COORDONNEES_ET_DES_DIFFERENTIELLES; \ -_-_-_- /* Permutation eventuelle de {cx,cy,cz} et de {dcx,dcy,dcz} (introduit le 20050615083227). */ \ -_-_-_- \ -_-_-_- LISTER_EVENTUELLEMENT_LES_COORDONNEES_u_v_DES_POINTS; \ -_-_-_- /* Introduit le 20060410105510... */ \ -_-_-_- \ -_-_-_- CALS(memorisation_1_point_06(SOUS(cx,Xcentre_ESPACE) \ -_-_-_- ,SOUS(cy,Ycentre_ESPACE) \ -_-_-_- ,SOUS(cz,Zcentre_ESPACE) \ -_-_-_- ,dcx \ -_-_-_- ,dcy \ -_-_-_- ,dcz \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Memorisation du point courant. On notera que le coloriage pourrait aussi se faire a */ \ -_-_-_- /* a l'aide des derivees d'ordre superieur, et par exemple : */ \ -_-_-_- /* */ \ -_-_-_- /* EGAL(d2cx,d#d#Fx(u_effectif,v_effectif)); */ \ -_-_-_- /* EGAL(d2cy,d#d#Fy(u_effectif,v_effectif)); */ \ -_-_-_- /* EGAL(d2cz,d#d#Fz(u_effectif,v_effectif)); */ \ -_-_-_- /* */ \ -_-_-_- /* On fera alors attention a la fonction de passage des derivees aux couleurs qui utilise */ \ -_-_-_- /* les parametres du type 'd?min_ESPACE' et 'd?max_ESPACE' ; les valeurs de ces derniers */ \ -_-_-_- /* sont evaluees pour les derivees premieres. Un passage aux derivees d'ordre superieur */ \ -_-_-_- /* impliquerait une modification de ces parametres, ou bien de la dite fonction... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- DEFV(Float,INIT(EnTete_de_sauvegardM ## d_u,d_u_effectif)); \ -_-_-_- DEFV(Float,INIT(EnTete_de_sauvegardM ## d_v,d_v_effectif)); \ -_-_-_- DEFV(Float,INIT(EnTete_de_sauvegardM ## rayon_de_visualisation,rayon_de_visualisation)); \ -_-_-_- /* Sauvegarde de ce que l'on va modifier... */ \ -_-_-_- \ -_-_-_- DEFV(Float,INIT(dXdu,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(dXdv,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(dYdu,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(dYdv,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(dZdu,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(dZdv,FLOT__UNDEF)); \ -_-_-_- /* Afin de calculer les six derivees partielles... */ \ -_-_-_- DEFV(deltaF_3D,normale); \ -_-_-_- DEFV(Float,INIT(module_normale,FLOT__UNDEF)); \ -_-_-_- /* Normale au point courant et son module... */ \ -_-_-_- \ -_-_-_- DEFV(Float,INIT(Acx,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Acy,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Acz,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Adcx,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Adcy,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Adcz,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Arayon_de_visualisation,FLOT__UNDEF)); \ -_-_-_- /* Pour sauvegarder les caracteristiques du point 'A'. */ \ -_-_-_- \ -_-_-_- DEFV(Float,INIT(Bcx,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Bcy,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Bcz,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Bdcx,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Bdcy,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Bdcz,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(Brayon_de_visualisation,FLOT__UNDEF)); \ -_-_-_- /* Pour sauvegarder les caracteristiques du point 'B'. */ \ -_-_-_- \ -_-_-_- BLOC(calcul_eventuel_derivees_partielles); \ -_-_-_- /* Calcul des derivees partielles... */ \ -_-_-_- \ -_-_-_- INITIALISATION_ACCROISSEMENT_3D(normale \ -_-_-_- ,PvectX(dXdu,dYdu,dZdu \ -_-_-_- ,dXdv,dYdv,dZdv \ -_-_-_- ) \ -_-_-_- ,PvectY(dXdu,dYdu,dZdu \ -_-_-_- ,dXdv,dYdv,dZdv \ -_-_-_- ) \ -_-_-_- ,PvectZ(dXdu,dYdu,dZdu \ -_-_-_- ,dXdv,dYdv,dZdv \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Calcul de la normale : */ \ -_-_-_- /* */ \ -_-_-_- /* X(N)=(((dY/du)*(dZ/dv))-((dZ/du)*(dY/dv))), */ \ -_-_-_- /* Y(N)=(((dZ/du)*(dX/dv))-((dX/du)*(dZ/dv))), */ \ -_-_-_- /* Z(N)=(((dX/du)*(dY/dv))-((dY/du)*(dX/dv))). */ \ -_-_-_- /* */ \ -_-_-_- gNORMALISATION_ACCROISSEMENT_3D(normale,facteur_de_la_normale); \ -_-_-_- /* Et enfin, normalisation (j'ai introduit 'NORMALISATION_ACCROISSEMENT_3D(...)' le */ \ -_-_-_- /* 20021007135953, c'est-a-dire avec beaucoup de retard ; mais il a fallu pour cela */ \ -_-_-_- /* creer 'gNORMALISATION_ACCROISSEMENT_3D(...)' a cause de 'facteur_de_la_normale'). */ \ -_-_-_- \ -_-_-_- EGAL(Acx,NEUT(cx)); \ -_-_-_- EGAL(Acy,NEUT(cy)); \ -_-_-_- EGAL(Acz,NEUT(cz)); \ -_-_-_- EGAL(Adcx \ -_-_-_- ,NEUT(BAR4(dcx,FZERO,dXdu,niveau_ROUGE_pour_la_normale \ -_-_-_- ,ponderation1_ROUGE_pour_la_normale,ponderation2_ROUGE_pour_la_normale \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(Adcy \ -_-_-_- ,NEUT(BAR4(dcy,FZERO,dYdu,niveau_VERTE_pour_la_normale \ -_-_-_- ,ponderation1_VERTE_pour_la_normale,ponderation2_VERTE_pour_la_normale \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(Adcz \ -_-_-_- ,NEUT(BAR4(dcz,FZERO,dZdu,niveau_BLEUE_pour_la_normale \ -_-_-_- ,ponderation1_BLEUE_pour_la_normale,ponderation2_BLEUE_pour_la_normale \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(Arayon_de_visualisation \ -_-_-_- ,NEUT(rayon_de_visualisation) \ -_-_-_- ); \ -_-_-_- /* Memorisation du point 'A'. On notera le remplacement de 'BARY(...)' par 'BAR2(...)' */ \ -_-_-_- /* le 20060207104301 par symetrie avec l'introduction de 'BAR4(...)' ci-apres... */ \ -_-_-_- /* */ \ -_-_-_- /* Note sur le coloriage : en notant respectivement {p1,p2} les deux ponderations */ \ -_-_-_- /* {ponderation1_?????_pour_la_normale,ponderation2_?????_pour_la_normale}, on a les */ \ -_-_-_- /* quatre cas simples suivants : */ \ -_-_-_- /* */ \ -_-_-_- /* (p1=0,p2=0) : uniformement avec {dcx,dcy,dcz}, */ \ -_-_-_- /* (p1=0,p2=1) : 0, */ \ -_-_-_- /* (p1=1,p2=0) : par interpolation entre {dXdu,dYdu,dZdu} en 'A' et */ \ -_-_-_- /* {dXdv,dYdv,dZdv} en 'B', */ \ -_-_-_- /* (p1=1,p2=1) : uniformement avec les niveaux 'niveau_?????_pour_la_normale'. */ \ -_-_-_- /* */ \ -_-_-_- /* sachant que l'on peut utiliser aussi toutes valeurs intermediaires... */ \ -_-_-_- /* */ \ -_-_-_- /* On notera le 'FZERO' de 'BAR4(...)' destine a faire en sorte que les valeurs par defaut */ \ -_-_-_- /* des valeurs par defaut des ponderations ; en particulier, la compatibilite anterieure */ \ -_-_-_- /* se fait via la valeur '0' ou '1' de 'p1', avec 'p2=0'... */ \ -_-_-_- \ -_-_-_- EGAL(Bcx,ADD2(cx,ASD1(normale,dx))); \ -_-_-_- EGAL(Bcy,ADD2(cy,ASD1(normale,dy))); \ -_-_-_- EGAL(Bcz,ADD2(cz,ASD1(normale,dz))); \ -_-_-_- EGAL(Bdcx \ -_-_-_- ,MUL2(facteur_du_ROUGE_pour_la_normale \ -_-_-_- ,BAR4(dcx,FZERO,dXdv,niveau_ROUGE_pour_la_normale \ -_-_-_- ,ponderation1_ROUGE_pour_la_normale,ponderation2_ROUGE_pour_la_normale \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(Bdcy \ -_-_-_- ,MUL2(facteur_du_VERTE_pour_la_normale \ -_-_-_- ,BAR4(dcy,FZERO,dYdv,niveau_VERTE_pour_la_normale \ -_-_-_- ,ponderation1_VERTE_pour_la_normale,ponderation2_VERTE_pour_la_normale \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(Bdcz \ -_-_-_- ,MUL2(facteur_du_BLEUE_pour_la_normale \ -_-_-_- ,BAR4(dcz,FZERO,dZdv,niveau_BLEUE_pour_la_normale \ -_-_-_- ,ponderation1_BLEUE_pour_la_normale,ponderation2_BLEUE_pour_la_normale \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(Brayon_de_visualisation \ -_-_-_- ,MUL2(facteur_du_rayon_de_visualisation_pour_la_normale,rayon_de_visualisation) \ -_-_-_- ); \ -_-_-_- /* Memorisation du point 'B'... */ \ -_-_-_- \ -_-_-_- Repe(nombre_absolu_de_points_sur_une_normale) \ -_-_-_- Bblock \ -_-_-_- DEFV(Float,INIT(lambda \ -_-_-_- ,ADD2(COORDONNEE_BARYCENTRIQUE_MINIMALE \ -_-_-_- ,SCAL(SOUS(compteur_des_repetitions_du_Repe \ -_-_-_- ,PREMIERE_ITERATION_D_UN_Repe \ -_-_-_- ) \ -_-_-_- ,SOUS(nombre_absolu_de_points_sur_une_normale \ -_-_-_- ,PREMIERE_ITERATION_D_UN_Repe \ -_-_-_- ) \ -_-_-_- ,SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE \ -_-_-_- ,COORDONNEE_BARYCENTRIQUE_MINIMALE \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Definition de la coordonnee barycentrique d'interpolation des coordonnees et des */ \ -_-_-_- /* couleurs des points de l'espace. */ \ -_-_-_- \ -_-_-_- EGAL(cx,BARY(Acx,Bcx,lambda)); \ -_-_-_- EGAL(cy,BARY(Acy,Bcy,lambda)); \ -_-_-_- EGAL(cz,BARY(Acz,Bcz,lambda)); \ -_-_-_- /* Recuperation de la position du point courant (cx,cy,cz)... */ \ -_-_-_- EGAL(dcx,BARY(Adcx,Bdcx,lambda)); \ -_-_-_- EGAL(dcy,BARY(Adcy,Bdcy,lambda)); \ -_-_-_- EGAL(dcz,BARY(Adcz,Bdcz,lambda)); \ -_-_-_- /* Forcage arbitraire des derivees (dcx,dcy,dcz) au point courant. */ \ -_-_-_- EGAL(rayon_de_visualisation \ -_-_-_- ,BARY(Arayon_de_visualisation,Brayon_de_visualisation,lambda) \ -_-_-_- ); \ -_-_-_- /* Et calcul du rayon de visualisation... */ \ -_-_-_- \ -_-_-_- PERMUTATION_EVENTUELLE_DES_COORDONNEES_ET_DES_DIFFERENTIELLES; \ -_-_-_- /* Permutation eventuelle de {cx,cy,cz} et de {dcx,dcy,dcz} (introduit le 20050615083227). */ \ -_-_-_- \ -_-_-_- LISTER_EVENTUELLEMENT_LES_COORDONNEES_u_v_DES_POINTS; \ -_-_-_- /* Introduit le 20060410105510... */ \ -_-_-_- \ -_-_-_- CALS(memorisation_1_point_06(SOUS(cx,Xcentre_ESPACE) \ -_-_-_- ,SOUS(cy,Ycentre_ESPACE) \ -_-_-_- ,SOUS(cz,Zcentre_ESPACE) \ -_-_-_- ,dcx \ -_-_-_- ,dcy \ -_-_-_- ,dcz \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Memorisation du point courant de la normale... */ \ -_-_-_- Eblock \ -_-_-_- ERep \ -_-_-_- \ -_-_-_- EGAL(d_u_effectif,EnTete_de_sauvegardM ## d_u); \ -_-_-_- EGAL(d_v_effectif,EnTete_de_sauvegardM ## d_v); \ -_-_-_- EGAL(rayon_de_visualisation,EnTete_de_sauvegardM ## rayon_de_visualisation); \ -_-_-_- /* Et enfin restaurations necessaires... */ \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock /* Memorisation du point courant et eventuellement de sa normale. Ceci fut introduit le */ /* 20060130085630 pour 'v $xrs/project2D.11$K VISUALISATION_DE_LA_SURFACE_AVEC_DIFFERENCES' */ /* principalement... */ -define CALCUL_DE_dF_SUR_du____12(fonction) \ -_-_-_- DERIVATION_PARTIELLE(fonction(SOUS(u_effectif,pas_de_u_de_differentiation) \ -_-_-_- ,NEUT(v_effectif) \ -_-_-_- ) \ -_-_-_- ,fonction(ADD2(u_effectif,pas_de_u_de_differentiation) \ -_-_-_- ,NEUT(v_effectif) \ -_-_-_- ) \ -_-_-_- ,DOUB(pas_de_u_de_differentiation) \ -_-_-_- ) -define CALCUL_DE_dF_SUR____dv_12(fonction) \ -_-_-_- DERIVATION_PARTIELLE(fonction(NEUT(u_effectif) \ -_-_-_- ,SOUS(v_effectif,pas_de_v_de_differentiation) \ -_-_-_- ) \ -_-_-_- ,fonction(NEUT(u_effectif) \ -_-_-_- ,ADD2(v_effectif,pas_de_v_de_differentiation) \ -_-_-_- ) \ -_-_-_- ,DOUB(pas_de_v_de_differentiation) \ -_-_-_- ) -define CALCUL_DE_dF_SUR_du_dv_12(fonction) \ -_-_-_- DERIVATION_PARTIELLE(fonction(SOUS(u_effectif,pas_de_u_de_differentiation) \ -_-_-_- ,SOUS(v_effectif,pas_de_v_de_differentiation) \ -_-_-_- ) \ -_-_-_- ,fonction(ADD2(u_effectif,pas_de_u_de_differentiation) \ -_-_-_- ,ADD2(v_effectif,pas_de_v_de_differentiation) \ -_-_-_- ) \ -_-_-_- ,DOUB(GpytF2D(pas_de_u_de_differentiation,pas_de_v_de_differentiation)) \ -_-_-_- ) /* Pour calculer les derivees partielles par differences (introduit le 20041118144531). */ /* */ /* Le 20060130085630 les noms 'DIFFERENTIELLE_DES_FONCTIONS_F_PAR_RAPPORT_A_?_?_12(...)' */ /* ont ete raccourcis en 'CALCUL_DE_dF_SUR_??_??_12(...)' pour des raisons de mise en */ /* page ; on notera au passage que le '12' semble etre lie au nom du present fichier */ /* ('v $xrs/surfaces.12$I')... */ -define GENERATION_D_UNE_IMAGE_DE_LA_SURFACE_AVEC_DIFFERENCES____(Fx,Fy,Fz,calcul_eventuel_point_courant) \ -_-_-_- Bblock \ -_-_-_- gGENERATION_D_UNE_IMAGE_DE_LA_SURFACE \ -_-_-_- (Fx,Fy,Fz \ -_-_-_- ,BLOC(calcul_eventuel_point_courant) \ -_-_-_- ,BLOC(Bblock \ -_-_-_- DEFV(Float,INIT(differentielle_x,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(differentielle_y,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(differentielle_z,FLOT__UNDEF)); \ -_-_-_- /* Definition des trois differentielles. */ \ -_-_-_- DEFV(Float,INIT(valeur_de_dF_sur_du____12__Fx,CALCUL_DE_dF_SUR_du____12(Fx))); \ -_-_-_- DEFV(Float,INIT(valeur_de_dF_sur_du____12__Fy,CALCUL_DE_dF_SUR_du____12(Fy))); \ -_-_-_- DEFV(Float,INIT(valeur_de_dF_sur_du____12__Fz,CALCUL_DE_dF_SUR_du____12(Fz))); \ -_-_-_- DEFV(Float,INIT(valeur_de_dF_sur____dv_12__Fx,CALCUL_DE_dF_SUR____dv_12(Fx))); \ -_-_-_- DEFV(Float,INIT(valeur_de_dF_sur____dv_12__Fy,CALCUL_DE_dF_SUR____dv_12(Fy))); \ -_-_-_- DEFV(Float,INIT(valeur_de_dF_sur____dv_12__Fz,CALCUL_DE_dF_SUR____dv_12(Fz))); \ -_-_-_- DEFV(Float,INIT(valeur_de_dF_sur_du_dv_12__Fx,CALCUL_DE_dF_SUR_du_dv_12(Fx))); \ -_-_-_- DEFV(Float,INIT(valeur_de_dF_sur_du_dv_12__Fy,CALCUL_DE_dF_SUR_du_dv_12(Fy))); \ -_-_-_- DEFV(Float,INIT(valeur_de_dF_sur_du_dv_12__Fz,CALCUL_DE_dF_SUR_du_dv_12(Fz))); \ -_-_-_- /* Optimisation introduite le 20071204152647 lors des tentatives sur '$LACT18' pour faire */ \ -_-_-_- /* disparaitre le probleme : */ \ -_-_-_- /* */ \ -_-_-_- /* internal compiler error: in add_stack_var_conflict, at cfgexpand.c:264 */ \ -_-_-_- /* */ \ -_-_-_- /* lors de la compilation de 'v $xrs/CalabiYau.21$K'. Et bien oui, c'etait la solution a */ \ -_-_-_- /* ce probleme : il fallait simplifier les expressions generees... */ \ -_-_-_- DEFV(Float,INIT(texture_x,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(texture_y,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(texture_z,FLOT__UNDEF)); \ -_-_-_- /* Definition des trois textures. */ \ -_-_-_- \ -_-_-_- Test(IL_FAUT(utiliser_les_differentielles_ROUGE_VERTE_BLEUE)) \ -_-_-_- /* Possibilite introduite le 20230125094726... */ \ -_-_-_- Bblock \ -_-_-_- EGAL(differentielle_x,differentielle_ROUGE); \ -_-_-_- EGAL(differentielle_y,differentielle_VERTE); \ -_-_-_- EGAL(differentielle_z,differentielle_BLEUE); \ -_-_-_- \ -_-_-_- EGAL(utiliser_les_differentielles_ROUGE_VERTE_BLEUE,FAUX); \ -_-_-_- /* Ne sert a rien, mais c'est plus sur... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- EGAL(differentielle_x \ -_-_-_- ,LIZ14(ponderation_de__u_____dans_dx \ -_-_-_- ,COND(IL_FAUT(calcul_des_differentielles_avec_u_v_____compatibilite_2009110217) \ -_-_-_- ,u \ -_-_-_- ,u_effectif_translate \ -_-_-_- ) \ -_-_-_- ,ponderation_de__v_____dans_dx \ -_-_-_- ,COND(IL_FAUT(calcul_des_differentielles_avec_u_v_____compatibilite_2009110217) \ -_-_-_- ,v \ -_-_-_- ,v_effectif_translate \ -_-_-_- ) \ -_-_-_- ,ponderation_de_Fx_____dans_dx,cx \ -_-_-_- ,ponderation_de_Fx_u___dans_dx,valeur_de_dF_sur_du____12__Fx \ -_-_-_- ,ponderation_de_Fx___v_dans_dx,valeur_de_dF_sur____dv_12__Fx \ -_-_-_- ,ponderation_de_Fx_u_v_dans_dx,valeur_de_dF_sur_du_dv_12__Fx \ -_-_-_- ,ponderation_de_Fy_____dans_dx,cy \ -_-_-_- ,ponderation_de_Fy_u___dans_dx,valeur_de_dF_sur_du____12__Fy \ -_-_-_- ,ponderation_de_Fy___v_dans_dx,valeur_de_dF_sur____dv_12__Fy \ -_-_-_- ,ponderation_de_Fy_u_v_dans_dx,valeur_de_dF_sur_du_dv_12__Fy \ -_-_-_- ,ponderation_de_Fz_____dans_dx,cz \ -_-_-_- ,ponderation_de_Fz_u___dans_dx,valeur_de_dF_sur_du____12__Fz \ -_-_-_- ,ponderation_de_Fz___v_dans_dx,valeur_de_dF_sur____dv_12__Fz \ -_-_-_- ,ponderation_de_Fz_u_v_dans_dx,valeur_de_dF_sur_du_dv_12__Fz \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(differentielle_y \ -_-_-_- ,LIZ14(ponderation_de__u_____dans_dy \ -_-_-_- ,COND(IL_FAUT(calcul_des_differentielles_avec_u_v_____compatibilite_2009110217) \ -_-_-_- ,u \ -_-_-_- ,u_effectif_translate \ -_-_-_- ) \ -_-_-_- ,ponderation_de__v_____dans_dy \ -_-_-_- ,COND(IL_FAUT(calcul_des_differentielles_avec_u_v_____compatibilite_2009110217) \ -_-_-_- ,v \ -_-_-_- ,v_effectif_translate \ -_-_-_- ) \ -_-_-_- ,ponderation_de_Fx_____dans_dy,cx \ -_-_-_- ,ponderation_de_Fx_u___dans_dy,valeur_de_dF_sur_du____12__Fx \ -_-_-_- ,ponderation_de_Fx___v_dans_dy,valeur_de_dF_sur____dv_12__Fx \ -_-_-_- ,ponderation_de_Fx_u_v_dans_dy,valeur_de_dF_sur_du_dv_12__Fx \ -_-_-_- ,ponderation_de_Fy_____dans_dy,cy \ -_-_-_- ,ponderation_de_Fy_u___dans_dy,valeur_de_dF_sur_du____12__Fy \ -_-_-_- ,ponderation_de_Fy___v_dans_dy,valeur_de_dF_sur____dv_12__Fy \ -_-_-_- ,ponderation_de_Fy_u_v_dans_dy,valeur_de_dF_sur_du_dv_12__Fy \ -_-_-_- ,ponderation_de_Fz_____dans_dy,cz \ -_-_-_- ,ponderation_de_Fz_u___dans_dy,valeur_de_dF_sur_du____12__Fz \ -_-_-_- ,ponderation_de_Fz___v_dans_dy,valeur_de_dF_sur____dv_12__Fz \ -_-_-_- ,ponderation_de_Fz_u_v_dans_dy,valeur_de_dF_sur_du_dv_12__Fz \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- EGAL(differentielle_z \ -_-_-_- ,LIZ14(ponderation_de__u_____dans_dz \ -_-_-_- ,COND(IL_FAUT(calcul_des_differentielles_avec_u_v_____compatibilite_2009110217) \ -_-_-_- ,u \ -_-_-_- ,u_effectif_translate \ -_-_-_- ) \ -_-_-_- ,ponderation_de__v_____dans_dz \ -_-_-_- ,COND(IL_FAUT(calcul_des_differentielles_avec_u_v_____compatibilite_2009110217) \ -_-_-_- ,v \ -_-_-_- ,v_effectif_translate \ -_-_-_- ) \ -_-_-_- ,ponderation_de_Fx_____dans_dz,cx \ -_-_-_- ,ponderation_de_Fx_u___dans_dz,valeur_de_dF_sur_du____12__Fx \ -_-_-_- ,ponderation_de_Fx___v_dans_dz,valeur_de_dF_sur____dv_12__Fx \ -_-_-_- ,ponderation_de_Fx_u_v_dans_dz,valeur_de_dF_sur_du_dv_12__Fx \ -_-_-_- ,ponderation_de_Fy_____dans_dz,cy \ -_-_-_- ,ponderation_de_Fy_u___dans_dz,valeur_de_dF_sur_du____12__Fy \ -_-_-_- ,ponderation_de_Fy___v_dans_dz,valeur_de_dF_sur____dv_12__Fy \ -_-_-_- ,ponderation_de_Fy_u_v_dans_dz,valeur_de_dF_sur_du_dv_12__Fy \ -_-_-_- ,ponderation_de_Fz_____dans_dz,cz \ -_-_-_- ,ponderation_de_Fz_u___dans_dz,valeur_de_dF_sur_du____12__Fz \ -_-_-_- ,ponderation_de_Fz___v_dans_dz,valeur_de_dF_sur____dv_12__Fz \ -_-_-_- ,ponderation_de_Fz_u_v_dans_dz,valeur_de_dF_sur_du_dv_12__Fz \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Calcul des differentielles approchees. ATTENTION, le 20041110174426 je note lors de */ \ -_-_-_- /* la mise au point de 'v $xiirs/.PROJ.11.1.$U' que les 'ADD2(...)' et les 'SOUS(...)' */ \ -_-_-_- /* de la 'DERIVATION_PARTIELLE(...)' ci-dessus peuvent faire sortir des domaines de */ \ -_-_-_- /* definition des coordonnees {u,v}. Il faut donc bien faire attention aux problemes */ \ -_-_-_- /* de periodicite et de prolongement dans les cas ou, par exemple, l'une ou l'autre */ \ -_-_-_- /* des fonctions 'F?(...)' est definie via un champ bidimensionnel... */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20090606170823 fut pris en compte eventuellement {cx,cy,cz} lors de la mise au point */ \ -_-_-_- /* l'image 'v $xiirs/PROJ.c1'. */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20090724120555 les 'LIO14(...)'s qui ne se justifaient plus (puisque qu'il n'y a plus */ \ -_-_-_- /* de fonctions a evaluer ici...) furent remplaces par des 'LIN14(...)'s... */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20091102170618 {u,v} furent remplaces par {u_effectif_translate,v_effectif_translate} */ \ -_-_-_- /* plus logiques... */ \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- GENERATION_DU_TEXTURAGE_DE_LA_SURFACE(texture_x,texture_y,texture_z); \ -_-_-_- /* Calcul des textures en passant de {mu,Mu}x{mv,Mv} a {Xmin,Xmax}x{Ymin,Ymax}. */ \ -_-_-_- EGAL(dcx,BARY(differentielle_x,texture_x,ponderation_ROUGE_pour_dcx)); \ -_-_-_- EGAL(dcy,BARY(differentielle_y,texture_y,ponderation_VERTE_pour_dcy)); \ -_-_-_- EGAL(dcz,BARY(differentielle_z,texture_z,ponderation_BLEUE_pour_dcz)); \ -_-_-_- /* Calcul des couleurs utiles... */ \ -_-_-_- \ -_-_-_- MEMORISATION_DU_POINT_COURANT_ET_DE_SA_NORMALE_EVENTUELLE(BLOC(calcul_eventuel_point_courant) \ -_-_-_- ,BLOC(Bblock \ -_-_-_- EGAL(dXdu,CALCUL_DE_dF_SUR_du____12(Fx)); \ -_-_-_- EGAL(dYdu,CALCUL_DE_dF_SUR_du____12(Fy)); \ -_-_-_- EGAL(dZdu,CALCUL_DE_dF_SUR_du____12(Fz)); \ -_-_-_- /* Calcul des derivees partielles en 'u'. */ \ -_-_-_- EGAL(dXdv,CALCUL_DE_dF_SUR____dv_12(Fx)); \ -_-_-_- EGAL(dYdv,CALCUL_DE_dF_SUR____dv_12(Fy)); \ -_-_-_- EGAL(dZdv,CALCUL_DE_dF_SUR____dv_12(Fz)); \ -_-_-_- /* Calcul des derivees partielles en 'v'. */ \ -_-_-_- Eblock \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Memorisation du point courant et eventuellement de sa normale. Ceci fut introduit le */ \ -_-_-_- /* 20060130085630 pour 'v $xrs/project2D.11$K VISUALISATION_DE_LA_SURFACE_AVEC_DIFFERENCES' */ \ -_-_-_- /* principalement... */ \ -_-_-_- Eblock \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- Eblock /* Calcul et visualisation de la surface pour un instant donne avec calcul de differences */ /* finies (soit une approximation de la differentiation...). Cette procedure a ete */ /* introduite le 20041107143046 pour 'v $xrs/project2D.11$K'... */ -define GENERATION_D_UNE_IMAGE_DE_LA_SURFACE_AVEC_DIFFERENTIATION(Fx,Fy,Fz,calcul_eventuel_point_courant) \ -_-_-_- Bblock \ -_-_-_- gGENERATION_D_UNE_IMAGE_DE_LA_SURFACE \ -_-_-_- (Fx,Fy,Fz \ -_-_-_- ,BLOC(calcul_eventuel_point_courant) \ -_-_-_- ,BLOC(Bblock \ -_-_-_- DEFV(Float,INIT(differentielle_x,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(differentielle_y,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(differentielle_z,FLOT__UNDEF)); \ -_-_-_- /* Definition des trois differentielles. */ \ -_-_-_- DEFV(Float,INIT(texture_x,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(texture_y,FLOT__UNDEF)); \ -_-_-_- DEFV(Float,INIT(texture_z,FLOT__UNDEF)); \ -_-_-_- /* Definition des trois textures. */ \ -_-_-_- \ -_-_-_- Test(IL_FAUT(utiliser_les_differentielles_ROUGE_VERTE_BLEUE)) \ -_-_-_- /* Possibilite introduite le 20230125094726... */ \ -_-_-_- Bblock \ -_-_-_- EGAL(differentielle_x,differentielle_ROUGE); \ -_-_-_- EGAL(differentielle_y,differentielle_VERTE); \ -_-_-_- EGAL(differentielle_z,differentielle_BLEUE); \ -_-_-_- \ -_-_-_- EGAL(utiliser_les_differentielles_ROUGE_VERTE_BLEUE,FAUX); \ -_-_-_- /* Ne sert a rien, mais c'est plus sur... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- EGAL(c_est_le_calcul_de__differentielle_x__differentielle_y__differentielle_z,VRAI); \ -_-_-_- EGAL(differentielle_x,dFxyz(d#Fx(u_effectif,v_effectif))); \ -_-_-_- EGAL(differentielle_y,dFxyz(d#Fy(u_effectif,v_effectif))); \ -_-_-_- EGAL(differentielle_z,dFxyz(d#Fz(u_effectif,v_effectif))); \ -_-_-_- EGAL(c_est_le_calcul_de__differentielle_x__differentielle_y__differentielle_z,FAUX); \ -_-_-_- /* Calcul des differentielles exactes... */ \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- GENERATION_DU_TEXTURAGE_DE_LA_SURFACE(texture_x,texture_y,texture_z); \ -_-_-_- /* Calcul des textures en passant de {mu,Mu}x{mv,Mv} a {Xmin,Xmax}x{Ymin,Ymax}. */ \ -_-_-_- EGAL(dcx,BARY(differentielle_x,texture_x,ponderation_ROUGE_pour_dcx)); \ -_-_-_- EGAL(dcy,BARY(differentielle_y,texture_y,ponderation_VERTE_pour_dcy)); \ -_-_-_- EGAL(dcz,BARY(differentielle_z,texture_z,ponderation_BLEUE_pour_dcz)); \ -_-_-_- /* Calcul des couleurs utiles... */ \ -_-_-_- \ -_-_-_- MEMORISATION_DU_POINT_COURANT_ET_DE_SA_NORMALE_EVENTUELLE(BLOC(calcul_eventuel_point_courant) \ -_-_-_- ,BLOC(Bblock \ -_-_-_- EGAL(d_u_effectif,pas_de_u_effectif); \ -_-_-_- EGAL(d_v_effectif,FZERO); \ -_-_-_- /* Afin de calculer les derivees partielles en 'u'. */ \ -_-_-_- EGAL(c_est_le_calcul_de__dXdu__dYdu__dZdu \ -_-_-_- ,VRAI \ -_-_-_- ); \ -_-_-_- EGAL(dXdu \ -_-_-_- ,dFxyz(d#Fx(u_effectif,v_effectif)) \ -_-_-_- ); \ -_-_-_- EGAL(dYdu \ -_-_-_- ,dFxyz(d#Fy(u_effectif,v_effectif)) \ -_-_-_- ); \ -_-_-_- EGAL(dZdu \ -_-_-_- ,dFxyz(d#Fz(u_effectif,v_effectif)) \ -_-_-_- ); \ -_-_-_- EGAL(c_est_le_calcul_de__dXdu__dYdu__dZdu \ -_-_-_- ,FAUX \ -_-_-_- ); \ -_-_-_- /* Calcul des derivees partielles en 'u'. */ \ -_-_-_- \ -_-_-_- EGAL(d_u_effectif,FZERO); \ -_-_-_- EGAL(d_v_effectif,pas_de_v_effectif); \ -_-_-_- /* Afin de calculer les derivees partielles en 'v'. */ \ -_-_-_- EGAL(c_est_le_calcul_de__dXdv__dYdv__dZdv \ -_-_-_- ,VRAI \ -_-_-_- ); \ -_-_-_- EGAL(dXdv \ -_-_-_- ,dFxyz(d#Fx(u_effectif,v_effectif)) \ -_-_-_- ); \ -_-_-_- EGAL(dYdv \ -_-_-_- ,dFxyz(d#Fy(u_effectif,v_effectif)) \ -_-_-_- ); \ -_-_-_- EGAL(dZdv \ -_-_-_- ,dFxyz(d#Fz(u_effectif,v_effectif)) \ -_-_-_- ); \ -_-_-_- EGAL(c_est_le_calcul_de__dXdv__dYdv__dZdv \ -_-_-_- ,FAUX \ -_-_-_- ); \ -_-_-_- /* Calcul des derivees partielles en 'v'. */ \ -_-_-_- Eblock \ -_-_-_- ) \ -_-_-_- ); \ -_-_-_- /* Memorisation du point courant et eventuellement de sa normale. Ceci fut introduit le */ \ -_-_-_- /* 20060130085630 pour 'v $xrs/project2D.11$K VISUALISATION_DE_LA_SURFACE_AVEC_DIFFERENCES' */ \ -_-_-_- /* principalement... */ \ -_-_-_- Eblock \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- Eblock /* Calcul et visualisation de la surface pour un instant donne avec differentiation */ /* formelle. */ -define INITIALISATIONS_COMMUNES_DE_PROJECTION_DE_LA_SURFACE \ -_-_-_- Bblock \ -_-_-_- EGAL(nombre_de_periodes_de_la_simulation,UN); \ -_-_-_- /* Un seul "tour" suffit... */ \ -_-_-_- \ -_-_-_- EGAL(diviseur_du_pas_de_u,FU); \ -_-_-_- EGAL(diviseur_du_pas_de_v,FU); \ -_-_-_- \ -_-_-_- Test(IL_FAUT(forcer_les_extrema_de_u_v_lors_de_la_projection_de_la_surface)) \ -_-_-_- /* Test introduit le 20060306164217... */ \ -_-_-_- Bblock \ -_-_-_- EGAL(pas_de_u,DIVI(SOUS(maximum_de_u,minimum_de_u),FLOT(dimX))); \ -_-_-_- EGAL(pas_de_v,DIVI(SOUS(maximum_de_v,minimum_de_v),FLOT(dimY))); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- EGAL(pas_de_u,DIVI(SOUS(sauvegarde_de_maximum_de_u,sauvegarde_de_minimum_de_u),FLOT(dimX))); \ -_-_-_- EGAL(pas_de_v,DIVI(SOUS(sauvegarde_de_maximum_de_v,sauvegarde_de_minimum_de_v),FLOT(dimY))); \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- EGAL(echantillonnage_de_u,UN); \ -_-_-_- EGAL(echantillonnage_de_v,UN); \ -_-_-_- EGAL(translation_de_l_echantillonnage_de_u,ZERO); \ -_-_-_- EGAL(translation_de_l_echantillonnage_de_v,ZERO); \ -_-_-_- /* Generation des trois projections d'une surface tel que cela est defini et exploite */ \ -_-_-_- /* dans 'v $xrs/project2D.11$K P.R.O.J.E.C.T.O.R'. Ceci a ete introduit le 20041125111850. */ \ -_-_-_- /* */ \ -_-_-_- /* On notera que pour que cela ait un interet, il faut que : */ \ -_-_-_- /* */ \ -_-_-_- /* diviseur_du_pas_de_u = 1 (dpu=1) */ \ -_-_-_- /* diviseur_du_pas_de_v = 1 (dpv=1) */ \ -_-_-_- /* */ \ -_-_-_- /* maximum_de_u - minimum_de_u */ \ -_-_-_- /* pas_de_u = ----------------------------- */ \ -_-_-_- /* dimX */ \ -_-_-_- /* */ \ -_-_-_- /* maximum_de_v - minimum_de_v */ \ -_-_-_- /* pas_de_v = ----------------------------- */ \ -_-_-_- /* dimY */ \ -_-_-_- /* */ \ -_-_-_- /* afin de bien "remplir" les matrices {Proj_Fx,Proj_Fy,Proj_Fz}. */ \ -_-_-_- /* */ \ -_-_-_- /* La reinitialisation de l'echantillonnage de la surface a ete introduit le 20050114214615 */ \ -_-_-_- /* car cela manquait effectivement... */ \ -_-_-_- Eblock /* Initialisations communes a toutes les surfaces destinees a permettre la reinjection des */ /* trois pseudo-projections {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} dans */ /* 'v $xrs/project2D.11$K' (introduit sous forme de procedure le 20050203085348...). */ -define INITIALISATIONS_SPECIFIQUES_DE_PROJECTION_DE_LA_SURFACE(initialisations) \ -_-_-_- Bblock \ -_-_-_- Test(IL_FAUT(faire_les_initialisations_specifiques_de_projection_de_la_surface)) \ -_-_-_- /* Ce test fut introduit le 20060502142542 pour 'v $xrs/project2D.01$Z initialisations'... */ \ -_-_-_- Bblock \ -_-_-_- BLOC(initialisations;); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock /* Initialisations specifiques a cette surface destinees a permettre la reinjection des */ /* trois pseudo-projections {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} dans */ /* 'v $xrs/project2D.11$K' (introduit le 20050203103821)... */ -define NOM_PROJECTION(nom_imageProjectionFxyz,postfixe) \ -_-_-_- COND(IFEQ_chaine(nom_imageProjection,NOM_PIPE_Local) \ -_-_-_- ,nom_imageProjectionFxyz \ -_-_-_- ,chain_Aconcaten2_sauf_nom_pipe(nom_imageProjection \ -_-_-_- ,postfixe \ -_-_-_- ) \ -_-_-_- ) -define VISUALISATION_GENERALE_DE_LA_SURFACE(calcul_des_parametres,calcul_de_la_surface,Fx,Fy,Fz,Pxyz) \ -_-_-_- /* L'argument 'Pxyz' a ete introduit le 20050203103821... */ \ -_-_-_- Bblock \ -_-_-_- DEFV(Float,INIT(sauvegarde_de_minimum_de_u,minimum_de_u)); \ -_-_-_- DEFV(Float,INIT(sauvegarde_de_maximum_de_u,maximum_de_u)); \ -_-_-_- DEFV(Float,INIT(sauvegarde_de_minimum_de_v,minimum_de_v)); \ -_-_-_- DEFV(Float,INIT(sauvegarde_de_maximum_de_v,maximum_de_v)); \ -_-_-_- /* Introduit le 20060306161232 pour etre capable, au cas ou la projection de la surface */ \ -_-_-_- /* est demandee, d'utiliser les extrema de {u,v} introduit comme parametres et non pas les */ \ -_-_-_- /* extrema qui, par defaut, sont forces par la procedure 'Pxyz'. Historiquement, cela fut */ \ -_-_-_- /* introduit pour 'v $xrs/sphere.11$K' et l'image 'v $xiirs/PROJ.C1'... */ \ -_-_-_- BDEFV(imageF,Projection_de_Fx); \ -_-_-_- BDEFV(imageF,Projection_de_Fy); \ -_-_-_- BDEFV(imageF,Projection_de_Fz); \ -_-_-_- /* On notera que pour des raisons de simplicite, il faut definir les trois projections de */ \ -_-_-_- /* la surface meme si 'IL_NE_FAUT_PAS(generer_les_trois_projections_de_la_surface)'... */ \ -_-_-_- \ -_-_-_- Test(IFET(IL_FAUT(visualiser_la_droite_tracee_dans_le_plan_uv) \ -_-_-_- ,IL_NE_FAUT_PAS(generer_les_trois_projections_de_la_surface) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- /* Test introduit le 20170125154159 et deplace ici le 20170125155212... */ \ -_-_-_- Bblock \ -_-_-_- PRINT_ATTENTION("pas de visualisation de la droite du plan {u,v} en l'absence de projection de la surface"); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IL_FAUT(transformer_u_v)) \ -_-_-_- Bblock \ -_-_-_- ACCES_AUX_IMAGES_FLOTTANTES(image_Coordonnee_U,nom_transformation_u,transformer_u_v_niveau_hors_image); \ -_-_-_- ACCES_AUX_IMAGES_FLOTTANTES(image_Coordonnee_V,nom_transformation_v,transformer_u_v_niveau_hors_image); \ -_-_-_- /* Chargement eventuel des transformations de {u,v} (introduit le 20060117134939...). */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IL_FAUT(trouer_u_v)) \ -_-_-_- Bblock \ -_-_-_- ACCES_AUX_IMAGES_FLOTTANTES(image_Trous,nom_trouage_u_v,LA_SURFACE_EST_INTEGRE); \ -_-_-_- /* Chargement eventuel du "trouage" de {u,v} (introduit le 20060529141942...) tel que par */ \ -_-_-_- /* defaut il n'y ait pas de trous... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IFOU(IL_NE_FAUT_PAS(generer_les_trois_projections_de_la_surface) \ -_-_-_- ,IFET(IL_FAUT(generer_les_trois_projections_de_la_surface) \ -_-_-_- ,EST_VRAI(les_trois_projections_de_la_surface_sont_en_fait_celles_de_la_texture) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- /* Ce test a ete introduit le 20050713150047... */ \ -_-_-_- Bblock \ -_-_-_- ACCES_AUX_IMAGES(image_Texture_R,nom_textureR); \ -_-_-_- ACCES_AUX_IMAGES(image_Texture_V,nom_textureV); \ -_-_-_- ACCES_AUX_IMAGES(image_Texture_B,nom_textureB); \ -_-_-_- /* Chargement eventuel des textures utiles... */ \ -_-_-_- /* */ \ -_-_-_- /* Le passage de {ImageA1,ImageA2,ImageA3} a {IFmageA1,IFmageA2,IFmageA3} a eu lieu */ \ -_-_-_- /* le 20050715182842. Je note le 20071021094138 que c'est certainement cette modification */ \ -_-_-_- /* qui est responsable de la difference qui existe entre 'v $xiirs/CAYA.61.0129' et */ \ -_-_-_- /* 'v $xiirs/CAYA.A1.0129' par exemple, les differences de couleur venant fort probablement */ \ -_-_-_- /* de differences de textures ('v $xiirs/$Fnota 20071020113639')... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IL_FAUT(generer_les_trois_projections_de_la_surface)) \ -_-_-_- /* Cas ou il faut generer les trois projections (introduit le 20041126091042) : */ \ -_-_-_- Bblock \ -_-_-_- /* ATTENTION ; jusqu'au 20050628155918, l'ordre des deux initialisations suivantes etaient */ \ -_-_-_- /* etait l'inverse par erreur. 'INITIALISATIONS_SPECIFIQUES_DE_PROJECTION_DE_LA_SURFACE' */ \ -_-_-_- /* peut en effet modifier des parametres qui sont exploites (par exemple 'maximum_de_v') */ \ -_-_-_- /* par 'INITIALISATIONS_COMMUNES_DE_PROJECTION_DE_LA_SURFACE', d'ou l'ordre logique qui */ \ -_-_-_- /* suit... */ \ -_-_-_- INITIALISATIONS_SPECIFIQUES_DE_PROJECTION_DE_LA_SURFACE(Pxyz); \ -_-_-_- /* Introduit le 20050203085348 pour permettre la reinjection des trois pseudo-projections */ \ -_-_-_- /* {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} dans 'v $xrs/project2D.11$K' en */ \ -_-_-_- /* minimisant les adaptations utiles... */ \ -_-_-_- \ -_-_-_- INITIALISATIONS_COMMUNES_DE_PROJECTION_DE_LA_SURFACE; \ -_-_-_- /* Mise sous forme d'une procedure le 20050203085348 par symetrie avec ce qui fut introduit */ \ -_-_-_- /* a cette date avec 'INITIALISATIONS_SPECIFIQUES_DE_PROJECTION_DE_LA_SURFACE'... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- ACCES_AUX_IMAGES_FLOTTANTES(image_Rayon,nom_rayon,rayon_de_visualisation); \ -_-_-_- /* Chargement eventuel du champ rayon (introduit le 20041229174601)... */ \ -_-_-_- /* */ \ -_-_-_- /* On notera le passage de 'IFmageA1' a 'IFmageA4' le 20050715180458 dans le but de faire */ \ -_-_-_- /* des textures des images de type 'Float' {IFmageA1,IFmageA2,IFmageA3} si necessaire... */ \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- RE_INITIALISATION_DE_L_HORLOGE; \ -_-_-_- /* Depuis que le 19990512152305 a ete mis en place un : */ \ -_-_-_- /* */ \ -_-_-_- /* INCREMENTATION_DE_L_HORLOGE(dct); */ \ -_-_-_- /* */ \ -_-_-_- /* apres chaque image, l'initialisation de l'horloge ne doit plus etre faite pour chaque */ \ -_-_-_- /* image, mais une seul fois, au tout debut... */ \ -_-_-_- \ -_-_-_- Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation) \ -_-_-_- /* Le 20090408092756, j'ai voulu introduire ici 'KompParallele(...)' a la place de ce */ \ -_-_-_- /* 'Komp(...)'. En fait c'est plus delicat que prevu et ce en particulier a cause de la */ \ -_-_-_- /* variable 'numero_de_la_periode_courante' qui, via 'PASSAGE_A_L_IMAGE_SUIVANTE', est */ \ -_-_-_- /* incrementee. Elle est differente de 'numero_de_la_periode_courante_de_la_simulation', */ \ -_-_-_- /* malheureusement, et n'est donc pas geree de facon parallele comme le serait */ \ -_-_-_- /* 'numero_de_la_periode_courante_de_la_simulation' dans 'KompParallele(...)'... */ \ -_-_-_- Bblock \ -_-_-_- INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante); \ -_-_-_- /* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image. */ \ -_-_-_- \ -_-_-_- BLOC(calcul_des_parametres); \ -_-_-_- /* Calcul des parametres evoluant au cours de la simulation... */ \ -_-_-_- \ -_-_-_- BLOC(calcul_de_la_surface); \ -_-_-_- /* Calcul de la surface proprement dit... */ \ -_-_-_- \ -_-_-_- Test(IL_FAUT(generer_les_trois_projections_de_la_surface)) \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- GENERATION_D_UNE_IMAGE_ET_PASSAGE_A_LA_SUIVANTE(BLOC(VIDE;)); \ -_-_-_- /* Generation de l'image courante... */ \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- INCREMENTATION_DE_L_HORLOGE(dct); \ -_-_-_- /* Simulation d'un temps arbitraire (introduit le 19990512094356). */ \ -_-_-_- Eblock \ -_-_-_- EKom \ -_-_-_- \ -_-_-_- Test(IL_FAUT(generer_les_trois_projections_de_la_surface)) \ -_-_-_- /* Cas ou il faut generer les trois projections (introduit le 20041126091042) : */ \ -_-_-_- Bblock \ -_-_-_- Test(EST_VRAI(les_trois_projections_de_la_surface_sont_des_images_standards)) \ -_-_-_- /* Cas ou les trois projections sont "standards" (introduit le 20050115113048) : */ \ -_-_-_- Bblock \ -_-_-_- Test(IL_FAUT(conserver_le_zero_des_trois_projections_de_la_surface)) \ -_-_-_- /* Cas ou il faut conserver le zero des trois projections (introduit le 20050115115200) : */ \ -_-_-_- Bblock \ -_-_-_- CALS(Ifloat_std_avec_le_vrai_zero_et_renormalisation(Image_ROUGE,Projection_de_Fx)); \ -_-_-_- CALS(Ifloat_std_avec_le_vrai_zero_et_renormalisation(Image_VERTE,Projection_de_Fy)); \ -_-_-_- CALS(Ifloat_std_avec_le_vrai_zero_et_renormalisation(Image_BLEUE,Projection_de_Fz)); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- CALS(Ifloat_std_avec_renormalisation(Image_ROUGE,Projection_de_Fx)); \ -_-_-_- CALS(Ifloat_std_avec_renormalisation(Image_VERTE,Projection_de_Fy)); \ -_-_-_- CALS(Ifloat_std_avec_renormalisation(Image_BLEUE,Projection_de_Fz)); \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- CALi(Iupdate_image(NOM_PROJECTION(nom_imageProjectionFx,c_COORD_X),Image_ROUGE)); \ -_-_-_- CALi(Iupdate_image(NOM_PROJECTION(nom_imageProjectionFy,c_COORD_Y),Image_VERTE)); \ -_-_-_- CALi(Iupdate_image(NOM_PROJECTION(nom_imageProjectionFz,c_COORD_Z),Image_BLEUE)); \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- /* Cas ou les trois projections sont non "standards" : */ \ -_-_-_- CALi(IupdateF_image(NOM_PROJECTION(nom_imageProjectionFx,c_COORD_X),Projection_de_Fx)); \ -_-_-_- CALi(IupdateF_image(NOM_PROJECTION(nom_imageProjectionFy,c_COORD_Y),Projection_de_Fy)); \ -_-_-_- CALi(IupdateF_image(NOM_PROJECTION(nom_imageProjectionFz,c_COORD_Z),Projection_de_Fz)); \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- Test(IFET(IL_FAUT(tracer_une_droite_du_plan_uv) \ -_-_-_- ,IL_FAUT(visualiser_la_droite_tracee_dans_le_plan_uv) \ -_-_-_- ) \ -_-_-_- ) \ -_-_-_- /* Test introduit le 20060817180753... */ \ -_-_-_- Bblock \ -_-_-_- CALi(IupdateF_image(nom_imageR_Droite_uv,image_Droite_UV_Calculee__)); \ -_-_-_- /* Memorisation de la droite dans le plan {u,v}... */ \ -_-_-_- /* */ \ -_-_-_- /* Le 20170210130509, 'nom_imageDroite_uv' a ete remplace par 'nom_imageR_Droite_uv' suite */ \ -_-_-_- /* a l'introduction de 'nom_imageA_Droite_uv' a cette date... */ \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- Eblock \ -_-_-_- ATes \ -_-_-_- Bblock \ -_-_-_- EDITION_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; \ -_-_-_- /* Edition facultative des extrema des coordonnees. */ \ -_-_-_- Eblock \ -_-_-_- ETes \ -_-_-_- \ -_-_-_- EDEFV(imageF,Projection_de_Fz); \ -_-_-_- EDEFV(imageF,Projection_de_Fy); \ -_-_-_- EDEFV(imageF,Projection_de_Fx); \ -_-_-_- /* On notera que pour des raisons de simplicite, il faut definir les trois projections de */ \ -_-_-_- /* la surface meme si 'IL_NE_FAUT_PAS(generer_les_trois_projections_de_la_surface)'... */ \ -_-_-_- Eblock /* Calcul et visualisation de la surface avec evolution temporelle... */ -define VISUALISATION_DE_LA_SURFACE_SANS_DIFFERENTIATION(calcul_des_parametres,Fx,Fy,Fz,Pxyz,calcul_pc) \ -_-_-_- /* L'argument 'Pxyz' a ete introduit le 20050203103821... */ \ -_-_-_- /* jusqu'au 20010525121332 'calcul_pc' s'appelait 'calcul_eventuel_point_courant' et son */ \ -_-_-_- /* nom a ete reduit a cause de la longueur de la ligne qui le reference ci-apres... */ \ -_-_-_- Bblock \ -_-_-_- VISUALISATION_GENERALE_DE_LA_SURFACE(BLOC(calcul_des_parametres) \ -_-_-_- ,BLOC(Bblock \ -_-_-_- GENERATION_D_UNE_IMAGE_DE_LA_SURFACE_SANS_DIFFERENTIATION(Fx,Fy,Fz \ -_-_-_- ,BLOC(calcul_pc) \ -_-_-_- ); \ -_-_-_- Eblock \ -_-_-_- ) \ -_-_-_- ,Fx,Fy,Fz \ -_-_-_- ,Pxyz \ -_-_-_- ); \ -_-_-_- Eblock /* Calcul sans differentiation et visualisation de la surface avec evolution temporelle... */ -define VISUALISATION_DE_LA_SURFACE_AVEC_DIFFERENCES____(calcul_des_parametres,Fx,Fy,Fz,Pxyz,calcul_pc) \ -_-_-_- /* L'argument 'Pxyz' a ete introduit le 20050203103821... */ \ -_-_-_- /* jusqu'au 20010525121332 'calcul_pc' s'appelait 'calcul_eventuel_point_courant' et son */ \ -_-_-_- /* nom a ete reduit a cause de la longueur de la ligne qui le reference ci-apres... */ \ -_-_-_- Bblock \ -_-_-_- VISUALISATION_GENERALE_DE_LA_SURFACE(BLOC(calcul_des_parametres) \ -_-_-_- ,BLOC(Bblock \ -_-_-_- GENERATION_D_UNE_IMAGE_DE_LA_SURFACE_AVEC_DIFFERENCES____(Fx,Fy,Fz \ -_-_-_- ,BLOC(calcul_pc) \ -_-_-_- ); \ -_-_-_- Eblock \ -_-_-_- ) \ -_-_-_- ,Fx,Fy,Fz \ -_-_-_- ,Pxyz \ -_-_-_- ); \ -_-_-_- Eblock /* Calcul avec evaluation de differences finies (une approximation de la differentiation) */ /* et visualisation de la surface avec evolution temporelle. Cette procedure a ete */ /* introduite le 20041107143046 pour 'v $xrs/project2D.11$K'... */ -define VISUALISATION_DE_LA_SURFACE_AVEC_DIFFERENTIATION(calcul_des_parametres,Fx,Fy,Fz,Pxyz,calcul_pc) \ -_-_-_- /* L'argument 'Pxyz' a ete introduit le 20050203103821... */ \ -_-_-_- /* jusqu'au 20010525121332 'calcul_pc' s'appelait 'calcul_eventuel_point_courant' et son */ \ -_-_-_- /* nom a ete reduit a cause de la longueur de la ligne qui le reference ci-apres... */ \ -_-_-_- Bblock \ -_-_-_- VISUALISATION_GENERALE_DE_LA_SURFACE(BLOC(calcul_des_parametres) \ -_-_-_- ,BLOC(Bblock \ -_-_-_- GENERATION_D_UNE_IMAGE_DE_LA_SURFACE_AVEC_DIFFERENTIATION(Fx,Fy,Fz \ -_-_-_- ,BLOC(calcul_pc) \ -_-_-_- ); \ -_-_-_- Eblock \ -_-_-_- ) \ -_-_-_- ,Fx,Fy,Fz \ -_-_-_- ,Pxyz \ -_-_-_- ); \ -_-_-_- Eblock /* Calcul avec differentiation et visualisation de la surface avec evolution temporelle... */