_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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

_______________________________________________________________________________________________________________________________________



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.