_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* R E P R E S E N T A T I O N D E S C O U R B E S D E L ' E S P A C E : */ /* */ /* */ /* Definition : */ /* */ /* Dans ce fichier se trouvent toutes */ /* les fonctions necessaires a la re- */ /* presentation des courbes dans */ /* l'espace a trois dimensions. */ /* */ /* */ /* Author of '$ximf/courbes.1$FON' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19890000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D O N N E E S D E T R A N S F O R M A T I O N G E O M E T R I Q U E 3 D : */ /* */ /*************************************************************************************************************************************/ #define TRANSFORMATION_Fx(fx,fy,fz) \ TRANSFORMATION_GEOMETRIQUE_3D_Fx(fx,fy,fz,NE_PAS_TRANSLATER_LORS_DE_TRANSFORMATION_GEOMETRIQUE_3D_Fxyz) #define TRANSFORMATION_Fy(fx,fy,fz) \ TRANSFORMATION_GEOMETRIQUE_3D_Fy(fx,fy,fz,NE_PAS_TRANSLATER_LORS_DE_TRANSFORMATION_GEOMETRIQUE_3D_Fxyz) #define TRANSFORMATION_Fz(fx,fy,fz) \ TRANSFORMATION_GEOMETRIQUE_3D_Fz(fx,fy,fz,NE_PAS_TRANSLATER_LORS_DE_TRANSFORMATION_GEOMETRIQUE_3D_Fxyz) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E G R A D E D E S N I V E A U X L E L O N G D ' U N A R C D E C U B I Q U E S : */ /* */ /*************************************************************************************************************************************/ #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ DEFV(Common,DEFV(Logical,_____PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01)); /* Introduit le 20030316101534. */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ DEFV(Common,DEFV(Logical,_____PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02)); /* Introduit le 20030316101534. */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 /* Common,DEFV(Fonction,) : degrade arcs3 cubiques */ BFonctionP DEFV(Common,DEFV(genere_p,SINT(fonction_neutre_____degrade_des_arcs_de_cubiques_____niveau_de_NOIR_du_degrade_des_arcs_de_cubiques ,NOIR ) ) ); /* Niveau minimal utilise par 'fonction_interpolation_degrade_des_arcs_de_cubiques()'. */ DEFV(Local,DEFV(Float,INIT(coordonnee_barycentrique_cubique,FLOT__UNDEF))); /* Coordonnee barycentrique dans [0,1] de parcours d'un arc de cubique initialisee sur le */ /* point de depart (t=0) ; on rappelle que 'coordonnee_barycentrique_cubique' est maintenant */ /* une variable globale (et non plus locale a la fonction courante) afin que l'APPLY */ /* 'degrade_des_arcs_de_cubiques' puisse fonctionner... */ DEFV(Common,DEFV(FonctionP,fAPPLY_____fonction_neutre_____degrade_des_arcs_de_cubiques(niveau))) /* Le 20101222201835 "fAPPLY_____" a ete ajoute pour 'v $xcg/LArgTypFo$vv$Z 20101222210652'. */ DEFV(Argument,DEFV(genere_p,niveau)); /* Niveau a laisser intact. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(NEUT(niveau)); Eblock EFonctionP BFonctionP DEFV(Common,DEFV(FonctionP,fAPPLY_____fonction_interpolation_____degrade_des_arcs_de_cubiques(niveau))) /* Le 20101222201835 "fAPPLY_____" a ete ajoute pour 'v $xcg/LArgTypFo$vv$Z 20101222210652'. */ DEFV(Argument,DEFV(genere_p,niveau)); /* Niveau maximum, l'interpolation ayant lieu entre 'NOIR' et 'niveau' suivant la */ /* coordonnee barycentrique 'coordonnee_barycentrique_cubique'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(BARY(fonction_neutre_____degrade_des_arcs_de_cubiques_____niveau_de_NOIR_du_degrade_des_arcs_de_cubiques ,niveau ,coordonnee_barycentrique_cubique ) ); Eblock EFonctionP BPointeurFonctionP DEFINITION_D_UN_APPLY(degrade_des_arcs_de_cubiques,PointeurFonctionP,fonction_neutre); /* Common,DEFV(Fonction,) : degrade arcs3. */ /* definition de l'apply relatif au degrade des arcs de cubiques. */ /* */ /* Le passage de 'genere_p' a 'FonctionP' a eu lieu le 20040619110203 afin de permettre, en */ /* 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', le traitement de */ /* l'argument d'une telle fonction par 'v $xcc/cpp$Z 20040618143320'. */ /* */ /* Le 20101222150807, "Common,DEFV(Fonction,) :" a remplace "Common :" errone... */ EPointeurFonctionP /* Ceci a ete introduit le 20051125212707 ('v $xcc/cpp$Z .xccp.PASSE_4.NomF')... */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 /* Common,DEFV(Fonction,) : degrade arcs3 cubiques. */ #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 /* Common,DEFV(Fonction,) : degrade arcs3 cubiques. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E N O R M A L I S A T I O N , P R O J E C T I O N E T N O R M A L I S A T I O N : */ /* */ /*************************************************************************************************************************************/ #define NProjection_OX(x,y,z) \ F__cDENORMALISE_OX(Projection_OX(_____cNORMALISE_OX(x) \ ,_____cNORMALISE_OY(y) \ ,_____cNORMALISE_OZ(z) \ ) \ ) \ /* Denormalisation, projection et normalisation selon l'axe 'OX'. */ #define NProjection_OY(x,y,z) \ F__cDENORMALISE_OY(Projection_OY(_____cNORMALISE_OX(x) \ ,_____cNORMALISE_OY(y) \ ,_____cNORMALISE_OZ(z) \ ) \ ) \ /* Denormalisation, projection et normalisation selon l'axe 'OY'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' U N D I S Q U E C E N T R E : */ /* */ /*************************************************************************************************************************************/ #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ DEFV(Common,DEFV(Logical,_____PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01)); #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ DEFV(Common,DEFV(Logical,_____PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01)); #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #define RAYON_OX_DU_DISQUE \ TRMU(_lDENORMALISE_OX(rayon_du_point)) \ /* Rayon effectif "le long" de 'OX'... */ #define RAYON_OY_DU_DISQUE \ TRMU(_lDENORMALISE_OY(rayon_du_point)) \ /* Rayon effectif "le long" de 'OY'... */ #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 # define TRACE_D_UN_DISQUE_CENTRE(niveau_du_disque) \ Bblock \ INITIALISATION_POINT_3D(centreI_courant \ ,COXA(ARRONDI_DES_CUBIQUES(NProjection_OX(COXR(ASD1(pointF_courant,x)) \ ,COYR(ASD1(pointF_courant,y)) \ ,COZR(ASD1(pointF_courant,z)) \ ) \ ) \ ) \ ,COYA(ARRONDI_DES_CUBIQUES(NProjection_OY(COXR(ASD1(pointF_courant,x)) \ ,COYR(ASD1(pointF_courant,y)) \ ,COZR(ASD1(pointF_courant,z)) \ ) \ ) \ ) \ ,COZA(ARRONDI_DES_CUBIQUES(COZR(ASD1(pointF_courant,z)))) \ ); \ /* Definition du centre courant du disque representatif du point dans l'espace */ \ /* tridimensionnel de projection... */ \ begin_colonneQ(DoIn \ ,SOUS(ASD1(centreI_courant,y) \ ,RAYON_OY_DU_DISQUE \ ) \ ,ADD2(ASD1(centreI_courant,y) \ ,RAYON_OY_DU_DISQUE \ ) \ ,pasY \ ) \ Bblock \ begin_ligneQ(DoIn \ ,SOUS(ASD1(centreI_courant,x) \ ,RAYON_OX_DU_DISQUE \ ) \ ,ADD2(ASD1(centreI_courant,x) \ ,RAYON_OX_DU_DISQUE \ ) \ ,pasX \ ) \ Bblock \ Test(IFLE(disI2D(ASD1(centreI_courant,x),ASD1(centreI_courant,y) \ ,X,Y \ ) \ ,MUL2(RAYON_OX_DU_DISQUE \ ,RAYON_OY_DU_DISQUE \ ) \ ) \ ) \ Bblock \ store_point_ND(niveau_du_disque \ ,imageAR \ ,X,Y,_____cNORMALISE_OZ(ASD1(centreI_courant,z)) \ ,dimension_de_la_generation \ ); \ /* Generation des points intermediaires avec interpolation lineaire pour les niveaux, */ \ /* et interpolation cubique pour les coordonnees en 2D ou en 3D suivant l'option... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ end_ligneQ(EDoI) \ Eblock \ end_colonneQ(EDoI) \ Eblock #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 # define PLUS_PETIT_ACCROISSEMENT_DE_LA_COORDONNEE_BARYCENTRIQUE \ gEPSILON \ /* Plus petit accroissement autorise pour la coordonnee barycentrique... */ # define TRACE_D_UN_DISQUE_CENTRE(niveau_du_disque,TPaccroissement_de_X,TPaccroissement_de_Y,c_est_un_point_isole) \ Bblock \ DEFV(Logical,INIT(il_y_a_un_trou,FAUX)); \ /* Indicateur precisant si l'on est en presence d'un trou ('VRAI') dans le trace de l'arc */ \ /* ou pas ('FAUX', etat initial) ; lorsqu'il y a un trou, il faut revenir en arriere, et */ \ /* et ce grace a la coordonnee barycentrique precedente, et a son accroissement que l'on */ \ /* reduit de moitie... */ \ DEFV(genere_p,INIT(niveau_au_bord,NIVEAU_UNDEF)); \ /* Definition du niveau sur le disque a la plus grande distance de la tangente a l'arc. */ \ DEFV(Float,INIT(longueur_du_vecteur_accroissement,FLOT__UNDEF)); \ /* Longueur du vecteur accroissement des deux composantes projetees. */ \ DEFV(Float,INIT(distance_a_l_axe,FLOT__UNDEF)); \ /* Distance du point courant du disque a l'axe de l'arc defini par le centre du disque */ \ /* et la tangente... */ \ \ Test(EST_VRAI(c_est_un_point_isole)) \ Bblock \ EGAL(niveau_au_bord,niveau_du_disque); \ /* Lorsque les trois accroissements des coordonnees sont nuls, c'est que l'on trace un */ \ /* point isole ; la tangente n'existe pas ; on trace donc un disque uniforme. */ \ Eblock \ ATes \ Bblock \ EGAL(niveau_au_bord,GENP(TRNP(NIVA(MUL2(affaiblissement_au_bord,FLOT(NIVR(niveau_du_disque))))))); \ /* Lorsque au moins l'un des trois accroissements n'est pas nul, c'est que l'on trace un */ \ /* arc ; la tangente est alors connue, on peut donc calculer la distance du point courant */ \ /* a l'axe de la cubique defini par le centre du disque et la tangente... */ \ EGAL(longueur_du_vecteur_accroissement \ ,GpytF2D(TPaccroissement_de_X \ ,TPaccroissement_de_Y \ ) \ ); \ /* Longueur du vecteur accroissement des deux coordonnees lorsque la tangente existe... */ \ /* */ \ /* La procedure 'GpytF2D(...)' a ete introduite le 20021120102642. */ \ \ Test(IZLE(longueur_du_vecteur_accroissement)) \ Bblock \ PRINT_ERREUR("l'accroissement est negatif ou nul"); \ EGAL(longueur_du_vecteur_accroissement,FU); \ /* Pour eviter des divisions par 0... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ \ INITIALISATION_POINT_3D(centreI_courant \ ,COXA(ARRONDI_DES_CUBIQUES(NProjection_OX(COXR(ASD1(pointF_courant,x)) \ ,COYR(ASD1(pointF_courant,y)) \ ,COZR(ASD1(pointF_courant,z)) \ ) \ ) \ ) \ ,COYA(ARRONDI_DES_CUBIQUES(NProjection_OY(COXR(ASD1(pointF_courant,x)) \ ,COYR(ASD1(pointF_courant,y)) \ ,COZR(ASD1(pointF_courant,z)) \ ) \ ) \ ) \ ,COZA(ARRONDI_DES_CUBIQUES(COZR(ASD1(pointF_courant,z)))) \ ); \ /* Definition du centre courant du disque representatif du point dans l'espace */ \ /* tridimensionnel de projection... */ \ \ Test(EST_FAUX(c_est_un_point_isole)) \ Bblock \ Test(EST_VRAI(c_est_le_premier_centre)) \ Bblock \ Eblock \ ATes \ Bblock \ /* Cas des centres suivants ; on valide la distance entre deux centres successifs, mais */ \ /* uniquement sur les coordonnees ecran 'X' et 'Y' : */ \ Test(IFOU(IFGT(SOUA(ASD1(centreI_courant,x),ASD1(centreI_precedent,x)),PasX) \ ,IFGT(SOUA(ASD1(centreI_courant,y),ASD1(centreI_precedent,y)),PasY) \ ) \ ) \ Bblock \ EGAL(il_y_a_un_trou,VRAI); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ \ Test(EST_FAUX(il_y_a_un_trou)) \ Bblock \ EGAL(coordonnee_barycentrique_precedente_cubique,coordonnee_barycentrique_cubique); \ /* Lorsqu'il n'y a pas de trou, on memorise la coordonnee barycentrique... */ \ Eblock \ ATes \ Bblock \ EGAL(coordonnee_barycentrique_cubique,coordonnee_barycentrique_precedente_cubique); \ EGAL(d_coordonnee_barycentrique_cubique,MOIT(d_precedent_coordonnee_barycentrique_cubique)); \ /* Lorsqu'un trou est detecte dans l'arc de cubique, on revient sur la coordonnee */ \ /* barycentrique anterieure et son accroissement que l'on reduit de moitie ; a noter que */ \ /* cette dichotomie pourra de nouveau avoir lieu au passage suivant par ici... */ \ \ Test(IFLE(d_coordonnee_barycentrique_cubique \ ,PLUS_PETIT_ACCROISSEMENT_DE_LA_COORDONNEE_BARYCENTRIQUE \ ) \ ) \ Bblock \ PRINT_ERREUR("la dichotomie amene a un mauvais accroissement de la coordonnee barycentrique"); \ CAL1(Prer1("coordonnee barycentrique=%g\n",coordonnee_barycentrique_cubique)); \ CAL1(Prer3("centre precedent = (%d,%d,%d)\n" \ ,ASD1(centreI_precedent,x) \ ,ASD1(centreI_precedent,y) \ ,ASD1(centreI_precedent,z) \ ) \ ); \ CAL1(Prer3("centre courant = (%d,%d,%d)\n" \ ,ASD1(centreI_courant,x) \ ,ASD1(centreI_courant,y) \ ,ASD1(centreI_courant,z) \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ \ EGAL(d_precedent_coordonnee_barycentrique_cubique,d_coordonnee_barycentrique_cubique); \ /* L'accroissement precedent est remis a jour en permanence, et ce afin de permettre un */ \ /* "recul" de plus en plus pres de la coordonnee barycentrique precedente, qui elle ne */ \ /* ne change jamais (du moins tant qu'on est dans un meme trou)... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFET(EST_FAUX(il_y_a_un_trou) \ ,IFOU(EST_VRAI(c_est_le_premier_centre) \ ,IFOU(IFNE(ASD1(centreI_courant,x),ASD1(centreI_precedent,x)) \ ,IFNE(ASD1(centreI_courant,y),ASD1(centreI_precedent,y)) \ ) \ ) \ ) \ ) \ Bblock \ /* Le trace du disque courant n'a lieu que s'il differe du precedent, et surtout s'il n'y */ \ /* a pas eu de trous... */ \ begin_colonneQ(DoIn \ ,SOUS(ASD1(centreI_courant,y) \ ,RAYON_OY_DU_DISQUE \ ) \ ,ADD2(ASD1(centreI_courant,y) \ ,RAYON_OY_DU_DISQUE \ ) \ ,pasY \ ) \ Bblock \ begin_ligneQ(DoIn \ ,SOUS(ASD1(centreI_courant,x) \ ,RAYON_OX_DU_DISQUE \ ) \ ,ADD2(ASD1(centreI_courant,x) \ ,RAYON_OX_DU_DISQUE \ ) \ ,pasX \ ) \ Bblock \ Test(IFLE(disI2D(ASD1(centreI_courant,x),ASD1(centreI_courant,y) \ ,X,Y \ ) \ ,MUL2(RAYON_OX_DU_DISQUE \ ,RAYON_OY_DU_DISQUE \ ) \ ) \ ) \ Bblock \ Test(IFNE(niveau_au_bord,niveau_du_disque)) \ Bblock \ EGAL(distance_a_l_axe \ ,DIVI(RACX(EXP2(DET2(FLOT(SOUS(X,ASD1(centreI_courant,x))) \ ,FLOT(SOUS(Y,ASD1(centreI_courant,y))) \ ,TPaccroissement_de_X \ ,TPaccroissement_de_Y \ ) \ ) \ ) \ ,longueur_du_vecteur_accroissement \ ) \ ); \ /* Distance du point courant du disque a l'axe de l'arc defini par le centre du disque */ \ /* et la tangente... */ \ EGAL(distance_a_l_axe \ ,DIVI(ARRO(distance_a_l_axe) \ ,FLOT(CHOI(RAYON_OX_DU_DISQUE \ ,RAYON_OY_DU_DISQUE \ ) \ ) \ ) \ ); \ EGAL(distance_a_l_axe \ ,TRON(distance_a_l_axe \ ,COORDONNEE_BARYCENTRIQUE_MINIMALE \ ,COORDONNEE_BARYCENTRIQUE_MAXIMALE \ ) \ ); \ /* Puis que l'on renormalise par rapport au rayon du disque ; au centre, elle vaut 0, alors */ \ /* qu'au bord le plus eloigne de l'axe, elle vaut 1. On notera le 'ARRO()' qui fait */ \ /* qu'on ne considere que la partie entiere de la distance afin de se placer sur la grille */ \ /* des points de l'image... */ \ Eblock \ ATes \ Bblock \ EGAL(distance_a_l_axe,COORDONNEE_BARYCENTRIQUE_MINIMALE); \ /* Dans le cas ou l'on trace un disque uniforme (par exemple un point isole), on considere */ \ /* que la distance a l'axe est nulle afin de tracer tous les points avec le niveau du */ \ /* centre... */ \ Eblock \ ETes \ \ store_point_ND(TRON(APPLY(degrade_des_arcs_de_cubiques \ ,GENP(NIVA(BARY(FLOT(NIVR(niveau_du_disque)) \ ,FLOT(NIVR(niveau_au_bord)) \ ,distance_a_l_axe \ ) \ ) \ ) \ ) \ ,NOIR_PLANCHER_SUBSTITUTION \ ,BLANC \ ) \ ,imageAR \ ,X,Y,_____cNORMALISE_OZ(ASD1(centreI_courant,z)) \ ,dimension_de_la_generation \ ); \ /* Generation des points intermediaires avec interpolation lineaire pour les niveaux, */ \ /* et interpolation cubique pour les coordonnees en 2D ou en 3D suivant l'option... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ end_ligneQ(EDoI) \ Eblock \ end_colonneQ(EDoI) \ \ TRANSFERT_POINT_3D(centreI_precedent,centreI_courant); \ /* Lorsqu'il n'y a pas de trou et que les centres courant et precedent sont differents, */ \ /* on memorise le centre courant comme futur centre precedent. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(EST_FAUX(c_est_un_point_isole)) \ Bblock \ Test(EST_VRAI(c_est_le_premier_centre)) \ Bblock \ EGAL(c_est_le_premier_centre,FAUX); \ /* Cas du premier centre... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V I S U A L I S A T I O N D ' U N A R C D E C U B I Q U E */ /* D E F I N I P A R D E U X P O I N T S E T D E U X D E R I V E E S : */ /* */ /* */ /* Definition de la construction d'un arc de cubique defini par 2 points (PO,PE) et 2 derivees (dO,dE) : */ /* */ /* Y ^ dE */ /* | / */ /* | / */ /* fE |........................+*PE */ /* | + @/. */ /* | dO + @/ . */ /* | \ + @ . */ /* | \ + @ . */ /* fO |........*+ @ . */ /* | PO.\@ @ . */ /* | . \@ @ . */ /* | . @@ . */ /* | . . */ /* |------------------------------------------------------> */ /* O t=0 t=1 X (ou 't' designe la coordonnee barycentrique) */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 # define NOMBRE_DE_POINTS \ DOUB(nombre_de_points) \ /* On double le nombre de points traces afin d'eviter les trous rencontres en particulier */ \ /* lorsque l'arc s'eloigne beaucoup d'une ligne droite ; on notera de plus, que par */ \ /* definition (a cause de 'LENG'), 'nombre_de_points' est strictement positif, et donc */ \ /* 'TRMU(NOMBRE_DE_POINTS)' ci-dessous ne peut etre nul... */ # define COORDONNEE_BARYCENTRIQUE_CUBIQUE \ DIVI(FLOT(TRMU(numero_du_point_courant)) \ ,FLOT(TRMU(NOMBRE_DE_POINTS)) \ ) \ /* Definition de la coordonnee barycentrique dans [0,1] de parcours d'un arc de cubique. */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 # define COORDONNEE_BARYCENTRIQUE_CUBIQUE \ coordonnee_barycentrique_cubique # define d_COORDONNEE_BARYCENTRIQUE_CUBIQUE \ d_FVARIABLES_DE_DERIVATION /* Definition de la coordonnee barycentrique dans [0,1] de parcours d'un arc de cubique */ /* et de sa derivee (introduite le 20101222103947)... */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #define INTERPOLATION_LINEAIRE_D_UN_ARC_DE_CUBIQUE(fonction_origine,fonction_extremite) \ INTERPOLATION_LINEAIRE(fonction_origine \ ,fonction_extremite \ ,COORDONNEE_BARYCENTRIQUE_CUBIQUE \ ) \ /* Fonction d'interpolation lineaire (des niveaux) le long d'un arc de cubique... */ #define INTERPOLATION_CUBIQUE_D_UN_ARC_DE_CUBIQUE(fonction_origine,derivee_origine,fonction_extremite,derivee_extremite) \ INTERPOLATION_CUBIQUE(fonction_origine,derivee_origine \ ,fonction_extremite,derivee_extremite \ ,COORDONNEE_BARYCENTRIQUE_CUBIQUE \ ) \ /* Fonction d'interpolation cubique (des coordonnees tri-dimensionnelles) le long */ \ /* d'un arc de cubique... */ #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 # define d_INTERPOLATION_CUBIQUE_D_UN_ARC_DE_CUBIQUE(Forg,d_Forg,dForg,d_dForg,Fext,d_Fext,dFext,d_dFext) \ d1_INTERPOLATION_CUBIQUE(Forg,d_Forg \ ,dForg,d_dForg \ ,Fext,d_Fext \ ,dFext,d_dFext \ ,COORDONNEE_BARYCENTRIQUE_CUBIQUE,d_COORDONNEE_BARYCENTRIQUE_CUBIQUE \ ) \ /* Derivee de la fonction d'interpolation cubique (des coordonnees tri-dimensionnelles) */ \ /* le long d'un arc de cubique... */ \ /* */ \ /* La derivation formelle a ete introduite le 20101222103947 et a ete validee le */ \ /* 20101224090212 verifiant que l'ancienne et la nouvelle methodes donnent exactement */ \ /* les memes resultats (ce qui est le cas !)... */ \ /* */ \ /* On notera le 20101222180623 que l'on ne peut ecrire ci-dessus des choses du type : */ \ /* */ \ /* d`fonction_origine */ \ /* */ \ /* pour atteindre la derivee de 'fonction_origine' car, en effet, en fait les arguments */ \ /* du type 'fonction_origine' sont en fait du type 'FLOT(ASD1(pointI_origine,x))' et alors */ \ /* un "d_" se trouve concatene devant le 'FLOT(...)'. */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #define VALIDATION_DES_DERIVEES_CUBIQUES(derivee) \ FRA8(derivee) \ /* Facteur de reduction des derivees afin d'assurer leur validation par rapport aux */ \ /* valeurs de la fonction a l'origine et a l'extremite... */ #define ARRONDI_DES_CUBIQUES(valeur) \ INTE(valeur) \ /* Fonction d'arrondi (flottante --> entier) des differentes valeurs... */ #define DISTANCE_DES_CUBIQUES(x,y) \ MAX2(ABSO(x),ABSO(y)) \ /* Permet de calculer une distance entre deux points definis en relatif par un vecteur */ \ /* de coordonnees {x,y} ; cette distance peut etre euclidienne ou pas... */ DEFV(Common,DEFV(FonctionP,POINTERp(Ivisualisation_arc_de_cubique_2P2D(imageAR ,ARGUMENT_POINTERs(pointF_origine) ,ARGUMENT_POINTERs(derivee_a_l_origine) ,niveau_a_l_origine ,ARGUMENT_POINTERs(pointF_extremite) ,ARGUMENT_POINTERs(derivee_a_l_extremite) ,niveau_a_l_extremite ,rayon_du_point ,affaiblissement_au_bord ,dimension_de_la_generation ) ) ) ) DEFV(Argument,DEFV(image,imageAR)); /* Image Argument et Resultat, dans laquelle on genere la surface. */ DEFV(Argument,DEFV(pointF_3D,POINTERs(pointF_origine))); /* Point origine de l'arc de cubique (correspondant a la valeur 0 de la coordonnee */ /* barycentrique), */ DEFV(Argument,DEFV(deltaF_3D,POINTERs(derivee_a_l_origine))); /* Definition du vecteur derivee a l'origine de l'arc de cubique. */ DEFV(Argument,DEFV(genere_p,niveau_a_l_origine)); /* Niveau du point origine de l'arc de courbe ; on notera que les deux niveaux (a */ /* l'origine et a l'extremite) ne peuvent etre recuperes dans 'imageAR' car en effet */ /* on genere une image tri-dimensionnelle, et il se peut que plusieurs points de meme */ /* coordonnees {X,Y} se superposent actuellement avec des 'Z' differents... */ DEFV(Argument,DEFV(pointF_3D,POINTERs(pointF_extremite))); /* Point extremite de l'arc de cubique (correspondant a la valeur 1 de la coordonnee */ /* barycentrique), */ DEFV(Argument,DEFV(deltaF_3D,POINTERs(derivee_a_l_extremite))); /* Definition du vecteur derivee a l'extremite de l'arc de cubique. */ DEFV(Argument,DEFV(genere_p,niveau_a_l_extremite)); /* Niveau du point extremite de l'arc de courbe ; on notera que les deux niveaux (a */ /* l'origine et a l'extremite) ne peuvent etre recuperes dans 'imageAR' car en effet */ /* on genere une image tri-dimensionnelle, et il se peut que plusieurs points de meme */ /* coordonnees {X,Y} se superposent actuellement avec des 'Z' differents... */ DEFV(Argument,DEFV(Float,rayon_du_point)); /* Rayon a donner a un point ; 'DENORMALISATION(UN)' donnera un seul point... */ DEFV(Argument,DEFV(Float,affaiblissement_au_bord)); /* Definit dans [0,1] l'affaiblissement des niveaux des points du disque par rapport */ /* a celui du centre quand on s'en eloigne. */ DEFV(Argument,DEFV(Positive,dimension_de_la_generation)); /* Vaut 'TRI_DIMENSIONNEL' ou 'BI_DIMENSIONNEL' et indique donc si l'on doit (3D) ou */ /* ou pas utiliser le 'Z-Buffer'... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(pointI_3D,pointI_origine); DEFV(pointF_3D,d_pointI_origine); /* Point origine de l'arc de cubique (correspondant a la valeur 0 de la coordonnee */ /* barycentrique) exprime par rapport a [Xmin,Ymin][Ymin,Ymax][Zmin,Zmax]. */ DEFV(deltaF_3D,Tderivee_a_l_origine); DEFV(deltaF_3D,d_Tderivee_a_l_origine); /* Definition du vecteur derivee a l'origine de l'arc de cubique apres 'TRANSFORMATION'. */ DEFV(pointI_3D,pointI_extremite); DEFV(pointF_3D,d_pointI_extremite); /* Point extremite de l'arc de cubique (correspondant a la valeur 1 de la coordonnee */ /* barycentrique) exprime par rapport a [Xmin,Ymin][Ymin,Ymax][Zmin,Zmax]. */ DEFV(deltaF_3D,Tderivee_a_l_extremite); DEFV(deltaF_3D,d_Tderivee_a_l_extremite); /* Definition du vecteur derivee a l'extremite de l'arc de cubique apres 'TRANSFORMATION'. */ #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 DEFV(Positive,INIT(nombre_de_points,UNDEF)); /* Nombre de points a marquer sur l'arc de cubique pour aller du point origine au */ /* point extremite. */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 DEFV(Float,INIT(coordonnee_barycentrique_precedente_cubique,FLOT__UNDEF)); /* Coordonnee barycentrique precedente dans [0,1] de parcours d'un arc de cubique */ /* initialisee sur le point de depart (t=0). */ DEFV(Float,INIT(d_precedent_coordonnee_barycentrique_cubique,FLOT__UNDEF)); /* Accroissement precedent de la coordonnee barycentrique pour un increment des deux */ /* coordonnees projetees 'X' et 'Y' egal a 0 ou 1... */ DEFV(Float,INIT(d_coordonnee_barycentrique_cubique,FLOT__UNDEF)); /* Accroissement de la coordonnee barycentrique pour un increment des deux coordonnees */ /* projetees 'X' et 'Y' egal a 0 ou 1... */ DEFV(Float,INIT(accroissement_de_la_coordonnee_X,FLOT__UNDEF)); DEFV(Float,INIT(Taccroissement_de_la_coordonnee_X,FLOT__UNDEF)); /* Accroissement de la coordonnee 'X' pour un accroissement de la coordonnee barycentrique, */ /* avant et apres application de la matrice de transformation tri-dimensionnelle... */ DEFV(Float,INIT(accroissement_de_la_coordonnee_Y,FLOT__UNDEF)); DEFV(Float,INIT(Taccroissement_de_la_coordonnee_Y,FLOT__UNDEF)); /* Accroissement de la coordonnee 'Y' pour un accroissement de la coordonnee barycentrique, */ /* avant et apres application de la matrice de transformation tri-dimensionnelle... */ DEFV(Float,INIT(accroissement_de_la_coordonnee_Z,FLOT__UNDEF)); DEFV(Float,INIT(Taccroissement_de_la_coordonnee_Z,FLOT__UNDEF)); /* Accroissement de la coordonnee 'Z' pour un accroissement de la coordonnee barycentrique, */ /* avant et apres application de la matrice de transformation tri-dimensionnelle... */ DEFV(Float,INIT(TPaccroissement_de_la_coordonnee_X,FLOT__UNDEF)); /* Accroissement de la coordonnee 'X' pour un accroissement de la coordonnee barycentrique, */ /* avant et apres application de la matrice de transformation tri-dimensionnelle et enfin */ /* projection bi-dimensionnelle... */ DEFV(Float,INIT(TPaccroissement_de_la_coordonnee_Y,FLOT__UNDEF)); /* Accroissement de la coordonnee 'Y' pour un accroissement de la coordonnee barycentrique, */ /* avant et apres application de la matrice de transformation tri-dimensionnelle et enfin */ /* projection bi-dimensionnelle... */ DEFV(Float,INIT(d_distance,FLOT__UNDEF)); /* Calcul de 'dL' (distance entre deux points correspondants aux calculs */ /* des derivees 'dX', 'dY' et 'dZ'. */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 DEFV(pointF_3D,pointF_courant); /* Point courant lors de l'interpolation sur l'arc de cubique (en flottant). */ DEFV(Logical,INIT(c_est_le_premier_centre,VRAI)); /* Indique s'il s'agit ('VRAI') ou pas ('FAUX') du premier centre... */ DEFV(pointI_3D,centreI_precedent); /* Centre du disque precedent lors de l'interpolation sur l'arc de cubique, lorsqu'il */ /* existe (voir 'c_est_le_premier_centre')... */ DEFV(pointI_3D,centreI_courant); /* Centre du disque courant lors du trace de l'arc de cubique. */ /*..............................................................................................................................*/ TesF(I3OU(IFOU(IFGT(ABSO(VALIDATION_DES_DERIVEES_CUBIQUES(ASI1(derivee_a_l_origine,dx))) ,SOUA(ASI1(pointF_extremite,x),ASI1(pointF_origine,x)) ) ,IFGT(ABSO(VALIDATION_DES_DERIVEES_CUBIQUES(ASI1(derivee_a_l_extremite,dx))) ,SOUA(ASI1(pointF_extremite,x),ASI1(pointF_origine,x)) ) ) ,IFOU(IFGT(ABSO(VALIDATION_DES_DERIVEES_CUBIQUES(ASI1(derivee_a_l_origine,dy))) ,SOUA(ASI1(pointF_extremite,y),ASI1(pointF_origine,y)) ) ,IFGT(ABSO(VALIDATION_DES_DERIVEES_CUBIQUES(ASI1(derivee_a_l_extremite,dy))) ,SOUA(ASI1(pointF_extremite,y),ASI1(pointF_origine,y)) ) ) ,IFOU(IFGT(ABSO(VALIDATION_DES_DERIVEES_CUBIQUES(ASI1(derivee_a_l_origine,dz))) SOUA(ASI1(pointF_extremite,z),ASI1(pointF_origine,z)) ) ,IFGT(ABSO(VALIDATION_DES_DERIVEES_CUBIQUES(ASI1(derivee_a_l_extremite,dz))) ,SOUA(ASI1(pointF_extremite,z),ASI1(pointF_origine,z)) ) ) ) ) Bblock PRINT_ERREUR("les derivees sont trop grandes par rapport aux valeurs de la fonction"); CAL1(Prer6("origine : X = %g Y = %g Z = %g dX=%g dY=%g dZ=%g\n" ,ASI1(pointF_origine,x),ASI1(pointF_origine,y),ASI1(pointF_origine,z) ,ASI1(derivee_a_l_origine,dx),ASI1(derivee_a_l_origine,dy),ASI1(derivee_a_l_origine,dz) ) ); CAL1(Prer6("extremite : X = %g Y = %g Z = %g dX=%g dY=%g dZ=%g\n" ,ASI1(pointF_extremite,x),ASI1(pointF_extremite,y),ASI1(pointF_extremite,z) ,ASI1(derivee_a_l_extremite,dx),ASI1(derivee_a_l_extremite,dy),ASI1(derivee_a_l_extremite,dz) ) ); Eblock ATes Bblock Eblock ETes #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 EGAL(coordonnee_barycentrique_cubique,COORDONNEE_BARYCENTRIQUE_MINIMALE); /* Coordonnee barycentrique dans [0,1] de parcours d'un arc de cubique initialisee sur le */ /* point de depart (t=0) ; on rappelle que 'coordonnee_barycentrique_cubique' est maintenant */ /* une variable globale (et non plus locale a la fonction courante) afin que l'APPLY */ /* 'degrade_des_arcs_de_cubiques' puisse fonctionner... */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 INITIALISATION_TRANSFORMATION; /* Au cas ou la transformation geometrique tri-dimensionnelle ne serait */ /* pas initialisee, on le fait sur la transformation unite. */ INITIALISATION_POINT_3D(pointI_origine ,TRANSFORMATION_Fx(F__cDENORMALISE_OX(ASI1(pointF_origine,x)) ,F__cDENORMALISE_OY(ASI1(pointF_origine,y)) ,F__cDENORMALISE_OZ(ASI1(pointF_origine,z)) ) ,TRANSFORMATION_Fy(F__cDENORMALISE_OX(ASI1(pointF_origine,x)) ,F__cDENORMALISE_OY(ASI1(pointF_origine,y)) ,F__cDENORMALISE_OZ(ASI1(pointF_origine,z)) ) ,TRANSFORMATION_Fz(F__cDENORMALISE_OX(ASI1(pointF_origine,x)) ,F__cDENORMALISE_OY(ASI1(pointF_origine,y)) ,F__cDENORMALISE_OZ(ASI1(pointF_origine,z)) ) ); INITIALISATION_POINT_3D(d_pointI_origine ,d_FVARIABLES_MUETTES,d_FVARIABLES_MUETTES,d_FVARIABLES_MUETTES ); /* Normalisation du point origine et 'TRANSFORMATION'. */ INITIALISATION_ACCROISSEMENT_3D(Tderivee_a_l_origine ,TRANSFORMATION_Fx(F__lDENORMALISE_OX(ASI1(derivee_a_l_origine,dx)) ,F__lDENORMALISE_OY(ASI1(derivee_a_l_origine,dy)) ,F__lDENORMALISE_OZ(ASI1(derivee_a_l_origine,dz)) ) ,TRANSFORMATION_Fy(F__lDENORMALISE_OX(ASI1(derivee_a_l_origine,dx)) ,F__lDENORMALISE_OY(ASI1(derivee_a_l_origine,dy)) ,F__lDENORMALISE_OZ(ASI1(derivee_a_l_origine,dz)) ) ,TRANSFORMATION_Fz(F__lDENORMALISE_OX(ASI1(derivee_a_l_origine,dx)) ,F__lDENORMALISE_OY(ASI1(derivee_a_l_origine,dy)) ,F__lDENORMALISE_OZ(ASI1(derivee_a_l_origine,dz)) ) ); INITIALISATION_ACCROISSEMENT_3D(d_Tderivee_a_l_origine ,d_FVARIABLES_MUETTES,d_FVARIABLES_MUETTES,d_FVARIABLES_MUETTES ); /* 'TRANSFORMATION' de la derivee a l'origine. */ INITIALISATION_POINT_3D(pointI_extremite ,TRANSFORMATION_Fx(F__cDENORMALISE_OX(ASI1(pointF_extremite,x)) ,F__cDENORMALISE_OY(ASI1(pointF_extremite,y)) ,F__cDENORMALISE_OZ(ASI1(pointF_extremite,z)) ) ,TRANSFORMATION_Fy(F__cDENORMALISE_OX(ASI1(pointF_extremite,x)) ,F__cDENORMALISE_OY(ASI1(pointF_extremite,y)) ,F__cDENORMALISE_OZ(ASI1(pointF_extremite,z)) ) ,TRANSFORMATION_Fz(F__cDENORMALISE_OX(ASI1(pointF_extremite,x)) ,F__cDENORMALISE_OY(ASI1(pointF_extremite,y)) ,F__cDENORMALISE_OZ(ASI1(pointF_extremite,z)) ) ); INITIALISATION_POINT_3D(d_pointI_extremite ,d_FVARIABLES_MUETTES,d_FVARIABLES_MUETTES,d_FVARIABLES_MUETTES ); /* Normalisation du point extremite et 'TRANSFORMATION'. */ INITIALISATION_ACCROISSEMENT_3D(Tderivee_a_l_extremite ,TRANSFORMATION_Fx(F__lDENORMALISE_OX(ASI1(derivee_a_l_extremite,dx)) ,F__lDENORMALISE_OY(ASI1(derivee_a_l_extremite,dy)) ,F__lDENORMALISE_OZ(ASI1(derivee_a_l_extremite,dz)) ) ,TRANSFORMATION_Fy(F__lDENORMALISE_OX(ASI1(derivee_a_l_extremite,dx)) ,F__lDENORMALISE_OY(ASI1(derivee_a_l_extremite,dy)) ,F__lDENORMALISE_OZ(ASI1(derivee_a_l_extremite,dz)) ) ,TRANSFORMATION_Fz(F__lDENORMALISE_OX(ASI1(derivee_a_l_extremite,dx)) ,F__lDENORMALISE_OY(ASI1(derivee_a_l_extremite,dy)) ,F__lDENORMALISE_OZ(ASI1(derivee_a_l_extremite,dz)) ) ); INITIALISATION_ACCROISSEMENT_3D(d_Tderivee_a_l_extremite ,d_FVARIABLES_MUETTES,d_FVARIABLES_MUETTES,d_FVARIABLES_MUETTES ); /* 'TRANSFORMATION' de la derivee a l'extremite. */ #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 EGAL(nombre_de_points ,ADD3(LENG(ASD1(pointI_origine,x),ASD1(pointI_extremite,x)) ,LENG(ASD1(pointI_origine,y),ASD1(pointI_extremite,y)) ,LENG(ASD1(pointI_origine,z),ASD1(pointI_extremite,z)) ) ); /* Nombre de points a marquer sur l'arc de cubique pour aller du point origine au */ /* point extremite ; on notera, qu'en general, cette valeur est exageree, d'autant */ /* plus qu'apres on passe par 'NOMBRE_DE_POINTS' qui double encore cette valeur... */ Test(IFGT(nombre_de_points,UN)) Bblock Komp(numero_du_point_courant,NOMBRE_DE_POINTS) Bblock #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 Test(I3OU(IFNE(ASD1(pointI_origine,x),ASD1(pointI_extremite,x)) ,IFNE(ASD1(pointI_origine,y),ASD1(pointI_extremite,y)) ,IFNE(ASD1(pointI_origine,z),ASD1(pointI_extremite,z)) ) ) Bblock Tant(IFLE(coordonnee_barycentrique_cubique,COORDONNEE_BARYCENTRIQUE_MAXIMALE)) Bblock #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 INITIALISATION_POINT_3D(pointF_courant ,INTERPOLATION_CUBIQUE_D_UN_ARC_DE_CUBIQUE(FLOT(ASD1(pointI_origine,x)) ,ASD1(Tderivee_a_l_origine,dx) ,FLOT(ASD1(pointI_extremite,x)) ,ASD1(Tderivee_a_l_extremite,dx) ) ,INTERPOLATION_CUBIQUE_D_UN_ARC_DE_CUBIQUE(FLOT(ASD1(pointI_origine,y)) ,ASD1(Tderivee_a_l_origine,dy) ,FLOT(ASD1(pointI_extremite,y)) ,ASD1(Tderivee_a_l_extremite,dy) ) ,INTERPOLATION_CUBIQUE_D_UN_ARC_DE_CUBIQUE(FLOT(ASD1(pointI_origine,z)) ,ASD1(Tderivee_a_l_origine,dz) ,FLOT(ASD1(pointI_extremite,z)) ,ASD1(Tderivee_a_l_extremite,dz) ) ); /* Definition en flottant du point courant de l'arc de cubique dans l'espace */ /* tridimensionnel. */ #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 /* Accroissement des trois coordonnees 'X' et 'Y' : */ /* */ /* on passe de : {X,Y,Z} a {X+dX,Y+dY,Z+dZ}, soit : */ /* */ /* X = X(t), */ /* Y = Y(t), */ /* Z = Z(t), */ /* */ /* d'ou : */ /* */ /* dX = X'(t).dt, */ /* dY = Y'(t).dt, */ /* dZ = Z'(t).dt, */ /* */ /* ce qui donnera une distance (non obligatoirement euclidienne) de deplacement dL */ /* une fois projete : */ /* */ /* dL = DISTANCE(ProjOX[dX,dY,dZ],ProjOY[dX,dY,dZ]) */ /* */ /* dL = DISTANCE(ProjOX[X'(t).dt,Y'(t).dt,Z'(t).dt],ProjOY[X'(t).dt,Y'(t).dt,Z'(t).dt]) */ /* */ /* comme l'on souhaite (pour assurer la continuite du trace) que dL <= 1, on en deduit, */ /* en supposant la fonction 'DISTANCE' lineaire par rapport a 'dt' : */ /* */ /* 1 = dt.DISTANCE(ProjOX[X'(t),Y'(t),Z'(t)],ProjOY[X'(t),Y'(t),Z'(t)]) */ /* */ EGAL(accroissement_de_la_coordonnee_X ,d_INTERPOLATION_CUBIQUE_D_UN_ARC_DE_CUBIQUE(FLOT(ASD1(pointI_origine,x)) ,ASD1(d_pointI_origine,x) ,ASD1(Tderivee_a_l_origine,dx) ,ASD1(d_Tderivee_a_l_origine,dx) ,FLOT(ASD1(pointI_extremite,x)) ,ASD1(d_pointI_extremite,x) ,ASD1(Tderivee_a_l_extremite,dx) ,ASD1(d_Tderivee_a_l_extremite,dx) ) ); /* Calcul de 'dX'. */ EGAL(accroissement_de_la_coordonnee_Y ,d_INTERPOLATION_CUBIQUE_D_UN_ARC_DE_CUBIQUE(FLOT(ASD1(pointI_origine,y)) ,ASD1(d_pointI_origine,y) ,ASD1(Tderivee_a_l_origine,dy) ,ASD1(d_Tderivee_a_l_origine,dy) ,FLOT(ASD1(pointI_extremite,y)) ,ASD1(d_pointI_extremite,y) ,ASD1(Tderivee_a_l_extremite,dy) ,ASD1(d_Tderivee_a_l_extremite,dy) ) ); /* Calcul de 'dY'. */ EGAL(accroissement_de_la_coordonnee_Z ,d_INTERPOLATION_CUBIQUE_D_UN_ARC_DE_CUBIQUE(FLOT(ASD1(pointI_origine,z)) ,ASD1(d_pointI_origine,z) ,ASD1(Tderivee_a_l_origine,dz) ,ASD1(d_Tderivee_a_l_origine,dz) ,FLOT(ASD1(pointI_extremite,z)) ,ASD1(d_pointI_extremite,z) ,ASD1(Tderivee_a_l_extremite,dz) ,ASD1(d_Tderivee_a_l_extremite,dz) ) ); /* Calcul de 'dZ'. */ EGAL(Taccroissement_de_la_coordonnee_X ,TRANSFORMATION_Fx(accroissement_de_la_coordonnee_X ,accroissement_de_la_coordonnee_Y ,accroissement_de_la_coordonnee_Z ) ); /* Transformation tri-dimensionnelle de 'dX'. */ EGAL(Taccroissement_de_la_coordonnee_Y ,TRANSFORMATION_Fy(accroissement_de_la_coordonnee_X ,accroissement_de_la_coordonnee_Y ,accroissement_de_la_coordonnee_Z ) ); /* Transformation tri-dimensionnelle de 'dY'. */ EGAL(Taccroissement_de_la_coordonnee_Z ,TRANSFORMATION_Fz(accroissement_de_la_coordonnee_X ,accroissement_de_la_coordonnee_Y ,accroissement_de_la_coordonnee_Z ) ); /* Transformation tri-dimensionnelle de 'dZ'. */ EGAL(TPaccroissement_de_la_coordonnee_X ,NProjection_OX(Taccroissement_de_la_coordonnee_X ,Taccroissement_de_la_coordonnee_Y ,Taccroissement_de_la_coordonnee_Z ) ); EGAL(TPaccroissement_de_la_coordonnee_Y ,NProjection_OY(Taccroissement_de_la_coordonnee_X ,Taccroissement_de_la_coordonnee_Y ,Taccroissement_de_la_coordonnee_Z ) ); /* Projection du vecteur accroissement des coordonnees, ce qui donnera entre autre chose, */ /* l'axe courant de l'arc de cubique utilise pour le trace en degrade... */ EGAL(d_distance ,DISTANCE_DES_CUBIQUES(TPaccroissement_de_la_coordonnee_X ,TPaccroissement_de_la_coordonnee_Y ) ); /* Calcul de 'dL' (distance entre deux points correspondants aux calculs */ /* des derivees 'dX', 'dY' et 'dZ' apres transformation tri-dimensionnelle. */ EGAL(d_coordonnee_barycentrique_cubique ,fDIVZ(FLOT(INTER_POINT) ,MAX2(d_distance,FLOT(INTER_POINT)) ) ); /* Increment de la coordonnee barycentrique tel que les deux coordonnees 'X', 'Y' */ /* projetees ne varient pas de plus d'une unite. Nota : cette operation est faite en */ /* deux temps afin de ne pas surcharger le pre-processeur et le compilateur... */ /* */ /* Le 20071201110254 'DIVZ(...)' fut remplace tardivement par 'fDIVZ(...)'... */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 TRACE_D_UN_DISQUE_CENTRE(GENP(NIVA(ARRI(INTERPOLATION_LINEAIRE_D_UN_ARC_DE_CUBIQUE(FLOT(NIVR(niveau_a_l_origine)) ,FLOT(NIVR(niveau_a_l_extremite)) ) ) ) ) ); /* Trace d'un disque materialisant le point courant de l'arc de cubique. */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 TRACE_D_UN_DISQUE_CENTRE(GENP(NIVA(ARRI(INTERPOLATION_LINEAIRE_D_UN_ARC_DE_CUBIQUE(FLOT(NIVR(niveau_a_l_origine)) ,FLOT(NIVR(niveau_a_l_extremite)) ) ) ) ) ,TPaccroissement_de_la_coordonnee_X ,TPaccroissement_de_la_coordonnee_Y ,FAUX ); /* Trace d'un disque materialisant le point courant de l'arc de cubique... */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 Eblock EKom #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 Test(IFOU(IZLE(d_coordonnee_barycentrique_cubique) ,IFGT(d_coordonnee_barycentrique_cubique,AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES) ) ) Bblock PRINT_ERREUR("l'increment de la coordonnee barycentrique est incorrect"); CAL1(Prer1("il vaut : %g\n",d_coordonnee_barycentrique_cubique)); CAL1(Prer1("dX = %g\n",Taccroissement_de_la_coordonnee_X)); CAL1(Prer1("dY = %g\n",Taccroissement_de_la_coordonnee_Y)); CAL1(Prer1("dZ = %g\n",Taccroissement_de_la_coordonnee_Z)); EGAL(d_coordonnee_barycentrique_cubique,COORDONNEE_BARYCENTRIQUE_CENTRALE); /* Et on prend une valeur arbitraire et moyenne... */ Eblock ATes Bblock Eblock ETes Test(IFLT(coordonnee_barycentrique_cubique,COORDONNEE_BARYCENTRIQUE_MAXIMALE)) Bblock EGAL(d_coordonnee_barycentrique_cubique ,MIN2(d_coordonnee_barycentrique_cubique ,SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE,coordonnee_barycentrique_cubique) ) ); /* Lorsque la coordonnee barycentrique n'a pas atteint sa valeur maximale, on peut etre */ /* amene a tronquer son increment afin d'etre sur qu'au moins une fois elle vaudra */ /* son maximum (afin de tracer le dernier point), et qu'aussi la boucle 'Tant' soit alors */ /* faite encore une fois (la derniere...). */ Eblock ATes Bblock /* Lorsque la coordonnee barycentrique a deja atteint sa valeur maximale, son accroissement */ /* est conserve tel qu'il fut calcule afin que la boucle 'Tant' s'arrete la... */ Eblock ETes INCR(coordonnee_barycentrique_cubique,d_coordonnee_barycentrique_cubique); /* Accroissement de la coordonnee barycentrique d'un increment tel que les trois */ /* coordonnees 'X', 'Y' et 'Z' ne varient pas de plus d'une unite... */ Eblock ETan #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 Test(I3OU(IFNE(ASD1(centreI_courant,x) ,COXA(ARRONDI_DES_CUBIQUES(NProjection_OX(COXR(ASD1(pointI_extremite,x)) ,COYR(ASD1(pointI_extremite,y)) ,COZR(ASD1(pointI_extremite,z)) ) ) ) ) ,IFNE(ASD1(centreI_courant,y) ,COYA(ARRONDI_DES_CUBIQUES(NProjection_OY(COXR(ASD1(pointI_extremite,x)) ,COYR(ASD1(pointI_extremite,y)) ,COZR(ASD1(pointI_extremite,z)) ) ) ) ) ,IFNE(ASD1(centreI_courant,z) ,COZA(ARRONDI_DES_CUBIQUES(COZR(ASD1(pointI_extremite,z)))) ) ) ) Bblock PRINT_ERREUR("le point extremite n'est pas atteint"); CAL1(Prer3("point courant = (%d,%d,%d) - projete\n" ,ASD1(centreI_courant,x) ,ASD1(centreI_courant,y) ,ASD1(centreI_courant,z) ) ); CAL1(Prer3("extremite = (%d,%d,%d) - non projete\n" ,ASD1(pointI_extremite,x) ,ASD1(pointI_extremite,y) ,ASD1(pointI_extremite,z) ) ); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 INITIALISATION_POINT_3D(pointF_courant ,FLOT(CHOI(ASD1(pointI_origine,x),ASD1(pointI_extremite,x))) ,FLOT(CHOI(ASD1(pointI_origine,y),ASD1(pointI_extremite,y))) ,FLOT(CHOI(ASD1(pointI_origine,z),ASD1(pointI_extremite,z))) ); TRACE_D_UN_DISQUE_CENTRE(CHOI(niveau_a_l_origine ,niveau_a_l_extremite ) ,FLOT__UNDEF ,FLOT__UNDEF ,VRAI ); /* Trace d'un disque unique correspondant au cas ou les points 'origine' et */ /* 'extremite' sont confondus (les accroissements des coordonnees, et donc la tangente */ /* a l'arc de cubique sont alors indefinies). */ #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 Eblock ETes RETI(imageAR); Eblock #undef DISTANCE_DES_CUBIQUES #undef ARRONDI_DES_CUBIQUES #undef VALIDATION_DES_DERIVEES_CUBIQUES #undef INTERPOLATION_CUBIQUE_D_UN_ARC_DE_CUBIQUE #undef INTERPOLATION_LINEAIRE_D_UN_ARC_DE_CUBIQUE #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 # undef d_INTERPOLATION_CUBIQUE_D_UN_ARC_DE_CUBIQUE # undef d_COORDONNEE_BARYCENTRIQUE_CUBIQUE #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 # undef COORDONNEE_BARYCENTRIQUE_CUBIQUE #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 # undef COORDONNEE_BARYCENTRIQUE_CUBIQUE #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 # undef NOMBRE_DE_POINTS #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 EFonctionP #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 # undef TRACE_D_UN_DISQUE_CENTRE # undef PLUS_PETIT_ACCROISSEMENT_DE_LA_COORDONNEE_BARYCENTRIQUE #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_02 #ifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 # undef TRACE_D_UN_DISQUE_CENTRE #Aifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #Eifdef PARCOURS_DES_ARCS_DE_CUBIQUES_VERSION_01 #undef RAYON_OY_DU_DISQUE #undef RAYON_OX_DU_DISQUE #undef NProjection_OY #undef NProjection_OX #undef TRANSFORMATION_Fz #undef TRANSFORMATION_Fy #undef TRANSFORMATION_Fx /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V I S U A L I S A T I O N D ' U N A R C D E C U B I Q U E */ /* D E F I N I P A R D E U X P O I N T S E T D E U X D E R I V E E S */ /* A V E C U N E T E N S I O N V A R I A B L E D E L ' A R C : */ /* */ /* */ /* Definition de la construction d'un arc de cubique defini par 2 points (PO,PE) et 2 derivees (dO,dE) : */ /* */ /* Y ^ dE */ /* | / */ /* | / */ /* fE |........................+*PE */ /* | + 3/. */ /* | dO + 2 3/ . */ /* | \ + 1 2 3 . (les chiffres '3', '2' et '1' designent */ /* | \ + 1 2 3 . trois arcs de tension croissante) */ /* fO |........*+ 1 2 3 . */ /* | PO.\3 2 2 3 . */ /* | . \3 3 . */ /* | . 33 . */ /* | . . */ /* |------------------------------------------------------> */ /* O t=0 t=1 X (ou 't' designe la coordonnee barycentrique) */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Ivisualisation_arc_de_cubique_2P2D_avec_tension(imageAR ,ARGUMENT_POINTERs(pointF_origine) ,ARGUMENT_POINTERs(derivee_a_l_origine) ,niveau_a_l_origine ,ARGUMENT_POINTERs(pointF_extremite) ,ARGUMENT_POINTERs(derivee_a_l_extremite) ,niveau_a_l_extremite ,tension_de_l_arc ,rayon_du_point ,affaiblissement_au_bord ,dimension_de_la_generation ) ) ) ) DEFV(Argument,DEFV(image,imageAR)); /* Image Argument et Resultat, dans laquelle on genere la surface. */ DEFV(Argument,DEFV(pointF_3D,POINTERs(pointF_origine))); /* Point origine de l'arc de cubique (correspondant a la valeur 0 de la coordonnee */ /* barycentrique), */ DEFV(Argument,DEFV(deltaF_3D,POINTERs(derivee_a_l_origine))); /* Definition du vecteur derivee a l'origine de l'arc de cubique. */ DEFV(Argument,DEFV(genere_p,niveau_a_l_origine)); /* Niveau du point origine de l'arc de courbe ; on notera que les deux niveaux (a */ /* l'origine et a l'extremite) ne peuvent etre recuperes dans 'imageAR' car en effet */ /* on genere une image tri-dimensionnelle, et il se peut que plusieurs points de meme */ /* coordonnees {X,Y} se superposent actuellement avec des 'Z' differents... */ DEFV(Argument,DEFV(pointF_3D,POINTERs(pointF_extremite))); /* Point extremite de l'arc de cubique (correspondant a la valeur 1 de la coordonnee */ /* barycentrique), */ DEFV(Argument,DEFV(deltaF_3D,POINTERs(derivee_a_l_extremite))); /* Definition du vecteur derivee a l'extremite de l'arc de cubique. */ DEFV(Argument,DEFV(genere_p,niveau_a_l_extremite)); /* Niveau du point extremite de l'arc de courbe ; on notera que les deux niveaux (a */ /* l'origine et a l'extremite) ne peuvent etre recuperes dans 'imageAR' car en effet */ /* on genere une image tri-dimensionnelle, et il se peut que plusieurs points de meme */ /* coordonnees {X,Y} se superposent actuellement avec des 'Z' differents... */ DEFV(Argument,DEFV(Float,tension_de_l_arc)); /* Ce parametre definit la tension de l'arc ; en general, il sera dans [0,1], mais en */ /* tout etat de cause, plus il est petit (proche de 0), plus l'arc sera proche d'une */ /* d'une droite, et plus il sera grand (proche de 1), plus l'arc sera "tordu"... */ DEFV(Argument,DEFV(Float,rayon_du_point)); /* Rayon a donner a un point ; 'DENORMALISATION(UN)' donnera un seul point... */ DEFV(Argument,DEFV(Float,affaiblissement_au_bord)); /* Definit dans [0,1] l'affaiblissement des niveaux des points du disque par rapport */ /* a celui du centre quand on s'en eloigne. */ DEFV(Argument,DEFV(Positive,dimension_de_la_generation)); /* Vaut 'TRI_DIMENSIONNEL' ou 'BI_DIMENSIONNEL' et indique donc si l'on doit (3D) ou */ /* ou pas utiliser le 'Z-Buffer'... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(deltaF_3D,derivee_tendue_a_l_origine); /* Definition du vecteur derivee a l'origine de l'arc de cubique, apres application de */ /* la tension argument, */ DEFV(deltaF_3D,derivee_tendue_a_l_extremite); /* Definition du vecteur derivee a l'extremite de l'arc de cubique, apres application de */ /* la tension argument. */ /*..............................................................................................................................*/ INITIALISATION_ACCROISSEMENT_3D(derivee_tendue_a_l_origine ,MUL2(tension_de_l_arc,ASI1(derivee_a_l_origine,dx)) ,MUL2(tension_de_l_arc,ASI1(derivee_a_l_origine,dy)) ,MUL2(tension_de_l_arc,ASI1(derivee_a_l_origine,dz)) ); /* Application de la tension de l'arc a son origine, */ INITIALISATION_ACCROISSEMENT_3D(derivee_tendue_a_l_extremite ,MUL2(tension_de_l_arc,ASI1(derivee_a_l_extremite,dx)) ,MUL2(tension_de_l_arc,ASI1(derivee_a_l_extremite,dy)) ,MUL2(tension_de_l_arc,ASI1(derivee_a_l_extremite,dz)) ); /* Application de la tension de l'arc a son extremite. */ CALS(Ivisualisation_arc_de_cubique_2P2D(imageAR ,pointF_origine ,ADRESSE(derivee_tendue_a_l_origine) ,niveau_a_l_origine ,pointF_extremite ,ADRESSE(derivee_tendue_a_l_extremite) ,niveau_a_l_extremite ,rayon_du_point ,affaiblissement_au_bord ,dimension_de_la_generation ) ); /* Trace de l'arc de cubique de tension donnee... */ RETI(imageAR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V I S U A L I S A T I O N D ' U N A R C D E C U B I Q U E */ /* D E F I N I P A R Q U A T R E P O I N T S : */ /* */ /* */ /* Definition de la construction d'un arc de cubique defini par 4 points (P1,P2,P3,P4) : */ /* */ /* P1* */ /* % \ */ /* % */ /* % \ */ /* % */ /* % \ *P4 */ /* % /% */ /* % \ % */ /* % / % */ /* Y ^ % \ % dE=P4-P2 */ /* | % / % / */ /* | % \% / */ /* fE |....%......../...........*PE=P3 */ /* | % + @/. */ /* | dO=P3-P1 + @/ . */ /* | \@ + @ . */ /* | \@/ + @ . */ /* fO |........*+ @ . */ /* | PO=P2.\@ @ . */ /* | . \@ @ . */ /* | . @@ . */ /* | . . */ /* |------------------------------------------------------> */ /* O t=0 t=1 X (ou 't' designe la coordonnee barycentrique) */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Ivisualisation_arc_de_cubique_4P(imageAR ,ARGUMENT_POINTERs(pointF_P1) ,ARGUMENT_POINTERs(pointF_P2) ,niveau_au_point_P2 ,ARGUMENT_POINTERs(pointF_P3) ,niveau_au_point_P3 ,ARGUMENT_POINTERs(pointF_P4) ,rayon_du_point ,affaiblissement_au_bord ,dimension_de_la_generation ) ) ) ) DEFV(Argument,DEFV(image,imageAR)); /* Image Argument et Resultat, dans laquelle on genere la surface. */ DEFV(Argument,DEFV(pointF_3D,POINTERs(pointF_P1))); /* Premier point definissant l'arc de cubique. */ DEFV(Argument,DEFV(pointF_3D,POINTERs(pointF_P2))); /* Deuxieme point definissant l'arc de cubique. */ DEFV(Argument,DEFV(genere_p,niveau_au_point_P2)); /* Niveau du point origine de l'arc de courbe ; on notera que les deux niveaux (a */ /* l'origine et a l'extremite) ne peuvent etre recuperes dans 'imageAR' car en effet */ /* on genere une image tri-dimensionnelle, et il se peut que plusieurs points de meme */ /* coordonnees {X,Y} se superposent actuellement avec des 'Z' differents... */ DEFV(Argument,DEFV(pointF_3D,POINTERs(pointF_P3))); /* Troisieme point definissant l'arc de cubique. */ DEFV(Argument,DEFV(genere_p,niveau_au_point_P3)); /* Niveau du point extremite de l'arc de courbe ; on notera que les deux niveaux (a */ /* l'origine et a l'extremite) ne peuvent etre recuperes dans 'imageAR' car en effet */ /* on genere une image tri-dimensionnelle, et il se peut que plusieurs points de meme */ /* coordonnees {X,Y} se superposent actuellement avec des 'Z' differents... */ DEFV(Argument,DEFV(pointF_3D,POINTERs(pointF_P4))); /* Quatrieme point definissant l'arc de cubique. */ DEFV(Argument,DEFV(Float,rayon_du_point)); /* Rayon a donner a un point ; 'DENORMALISATION(UN)' donnera un seul point... */ DEFV(Argument,DEFV(Float,affaiblissement_au_bord)); /* Definit dans [0,1] l'affaiblissement des niveaux des points du disque par rapport */ /* a celui du centre quand on s'en eloigne. */ DEFV(Argument,DEFV(Positive,dimension_de_la_generation)); /* Vaut 'TRI_DIMENSIONNEL' ou 'BI_DIMENSIONNEL' et indique donc si l'on doit (3D) ou */ /* ou pas utiliser le 'Z-Buffer'... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(deltaF_3D,derivee_a_l_origine); /* Definition du vecteur derivee a l'origine de l'arc de cubique. */ DEFV(deltaF_3D,derivee_a_l_extremite); /* Definition du vecteur derivee a l'extremite de l'arc de cubique. */ /*..............................................................................................................................*/ INITIALISATION_ACCROISSEMENT_3D(derivee_a_l_origine ,DEFINITION_DES_DERIVEES(ASI1(pointF_P1,x),ASI1(pointF_P3,x)) ,DEFINITION_DES_DERIVEES(ASI1(pointF_P1,y),ASI1(pointF_P3,y)) ,DEFINITION_DES_DERIVEES(ASI1(pointF_P1,z),ASI1(pointF_P3,z)) ); /* Definition de la derivee a l'origine. */ INITIALISATION_ACCROISSEMENT_3D(derivee_a_l_extremite ,DEFINITION_DES_DERIVEES(ASI1(pointF_P2,x),ASI1(pointF_P4,x)) ,DEFINITION_DES_DERIVEES(ASI1(pointF_P2,y),ASI1(pointF_P4,y)) ,DEFINITION_DES_DERIVEES(ASI1(pointF_P2,z),ASI1(pointF_P4,z)) ); /* Definition de la derivee a l'extremite. */ CALS(Ivisualisation_arc_de_cubique_2P2D(imageAR ,pointF_P2 ,ADRESSE(derivee_a_l_origine) ,niveau_au_point_P2 ,pointF_P3 ,ADRESSE(derivee_a_l_extremite) ,niveau_au_point_P3 ,rayon_du_point ,affaiblissement_au_bord ,dimension_de_la_generation ) ); /* Trace de l'arc de cubique... */ RETI(imageAR); Eblock EFonctionP _______________________________________________________________________________________________________________________________________