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