/*************************************************************************************************************************************/
/* */
/* F O N C T I O N S M A T H E M A T I Q U E S D E B A S E S O U S F O R M E D E " D E F I N E S " : */
/* */
/* */
/* Definition : */
/* */
/* Dans ce fichier, se trouvent les */
/* fonctions de base utilisees en */
/* mathematiques, et particulier le */
/* produit scalaire. */
/* */
/* */
/* Author of '$ximd/operator.1$FON' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 19870000000000). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T S C A L A I R E G E N E R A L D E Q U A T R E P O I N T S 1 D : */
/* */
/*************************************************************************************************************************************/
#define produit_scalaire_general_I1D(x11,x12,x21,x22) \
produit_scalaire_general_F1D(x11,x12,x21,x22) \
/* Produit scalaire "entier" a l'origine "0" (introduit le 20040328104842 "par symetrie" */ \
/* avec les dimensions superieures...). */
#define produit_scalaire_general_F1D(x11,x12,x21,x22) \
MUL2(SOUS(x12,x11) \
,SOUS(x22,x21) \
) \
/* Introduit le 20040328104842 "par symetrie" avec les dimensions superieures... */
#define ps0F1D(x12,x22) \
produit_scalaire_general_F1D(FXorigine \
,x12 \
,FXorigine \
,x22 \
) \
/* Produit scalaire "flottant" a l'origine "0" (introduit le 20080708112901). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T S C A L A I R E G E N E R A L D E Q U A T R E P O I N T S 2 D : */
/* */
/* */
/* Notations : */
/* */
/* En vue d'assurer la liaison entre */
/* 'produit_scalaire_general_F2/3D' et */
/* 'prsF2/3D', on notera les points de */
/* la facon suivante : */
/* */
/* */
/* A1 */
/* 11 --------------------------- 12 */
/* */
/* origine extremite */
/* */
/* 21 --------------------------- 22 */
/* A2 | \ */
/* | \ */
/* | numero du point (1=origine, 2=extremite), */
/* | */
/* | */
/* numero du vecteur (1=A1, 2=A2). */
/* */
/* */
/*************************************************************************************************************************************/
#define produit_scalaire_general_I2D(x11,y11,x12,y12,x21,y21,x22,y22) \
produit_scalaire_general_F2D(x11,y11,x12,y12,x21,y21,x22,y22) \
/* Produit scalaire "entier" a l'origine "0". */
#define produit_scalaire_general_F2D(x11,y11,x12,y12,x21,y21,x22,y22) \
ADD2(produit_scalaire_general_F1D(x11,x12,x21,x22) \
,produit_scalaire_general_F1D(y11,y12,y21,y22) \
)
#define ps0F2D(x12,y12,x22,y22) \
produit_scalaire_general_F2D(FXorigine,FYorigine \
,x12,y12 \
,FXorigine,FYorigine \
,x22,y22 \
) \
/* Produit scalaire "flottant" a l'origine "0" (introduit le 20080708112901). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T S C A L A I R E G E N E R A L D E Q U A T R E P O I N T S 3 D : */
/* */
/*************************************************************************************************************************************/
#define produit_scalaire_general_I3D(x11,y11,z11,x12,y12,z12,x21,y21,z21,x22,y22,z22) \
produit_scalaire_general_F3D(x11,y11,z11,x12,y12,z12,x21,y21,z21,x22,y22,z22) \
/* Produit scalaire "entier" a l'origine "0". */
#define produit_scalaire_general_F3D(x11,y11,z11,x12,y12,z12,x21,y21,z21,x22,y22,z22) \
ADD2(produit_scalaire_general_F2D(x11,y11,x12,y12,x21,y21,x22,y22) \
,produit_scalaire_general_F1D(z11,z12,z21,z22) \
)
#define ps0F3D(x12,y12,z12,x22,y22,z22) \
produit_scalaire_general_F3D(FXorigine,FYorigine,FZorigine \
,x12,y12,z12 \
,FXorigine,FYorigine,FZorigine \
,x22,y22,z22 \
) \
/* Produit scalaire "flottant" a l'origine "0" (introduit le 20080708112901). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T S C A L A I R E G E N E R A L D E Q U A T R E P O I N T S 4 D : */
/* */
/*************************************************************************************************************************************/
#define produit_scalaire_general_I4D(x11,y11,z11,t11,x12,y12,z12,t12,x21,y21,z21,t21,x22,y22,z22,t22) \
produit_scalaire_general_F4D(x11,y11,z11,t11,x12,y12,z12,t12,x21,y21,z21,t21,x22,y22,z22,t22) \
/* Produit scalaire "entier" a l'origine "0". */
#define produit_scalaire_general_F4D(x11,y11,z11,t11,x12,y12,z12,t12,x21,y21,z21,t21,x22,y22,z22,t22) \
ADD2(produit_scalaire_general_F3D(x11,y11,z11,x12,y12,z12,x21,y21,z21,x22,y22,z22) \
,produit_scalaire_general_F1D(t11,t12,t21,t22) \
)
#define ps0F4D(x12,y12,z12,t12,x22,y22,z22,t22) \
produit_scalaire_general_F4D(FXorigine,FYorigine,FZorigine,FTorigine \
,x12,y12,z12,t12 \
,FXorigine,FYorigine,FZorigine,FTorigine \
,x22,y22,z22,t22 \
) \
/* Produit scalaire "flottant" a l'origine "0" (introduit le 20080708112901). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I S T A N C E ( E T S O N C A R R E ) D E D E U X P O I N T S 1 D : */
/* */
/*************************************************************************************************************************************/
#define disI1D(x1,x2) \
disF1D(x1,x2)
#define RdisI1D(x1,x2) \
RACX(disI1D(x1,x2))
/* Distance euclidienne "entiere" (introduit le 20040328105656). */
#define disF1D(x1,x2) \
produit_scalaire_general_F1D(x1,x2,x1,x2)
#define RdisF1D(x1,x2) \
RACX(disF1D(x1,x2))
/* Distance euclidienne "flottante" (introduit le 20040328105656). */
#define gpdisF1D(p1,ACCES1,p2,ACCES2) \
produit_scalaire_general_F1D(ACCES1(p1,x) \
,ACCES2(p2,x) \
,ACCES1(p1,x) \
,ACCES2(p2,x) \
)
#define RgpdisF1D(p1,ACCES1,p2,ACCES2) \
RACX(gpdisF1D(p1,ACCES1,p2,ACCES2))
#define pdisF1D(p1,p2) \
gpdisF1D(p1,ASD1,p2,ASD1)
#define RpdisF1D(p1,p2) \
RACX(pdisF1D(p1,p2))
/* Distance euclidienne "flottante" entre deux points (introduite le 20120530093728). */
#define AXdisF1D(x1,x2) \
SOUA(x1,x2)
#define AIdisF1D(x1,x2) \
AXdisF1D(x1,x2)
#define ASdisF1D(x1,x2) \
AXdisF1D(x1,x2)
#define ACdisF1D(x1,x2) \
AXdisF1D(x1,x2)
#define AMdisF1D(x1,x2) \
AXdisF1D(x1,x2)
/* Distance dite par "valeur Absolue Inferieure", par "valeur Absolue Superieure", du */
/* "Chauffeur de taxi" ou enfin par "valeur Absolue Multipliee" (introduit le */
/* 20040328105656). */
/* */
/* La "valeur Absolue Multipliee" fut introduite le 20070715105646 meme si elle a peu */
/* d'interet mathematique... */
/* */
/* Le 20070716162214 fut introduit 'AXdisF1D(...)' pour permettre une definition plus */
/* generale des fonctions 'A?disF1D(...)'... */
#define UdisF1D(x1,x2,Ponderation_R_,Ponderation_AI,Ponderation_AS,Ponderation_AC,Ponderation_AM) \
LIO5(Ponderation_R_,RdisF1D(x1,x2) \
,Ponderation_AI,AIdisF1D(x1,x2) \
,Ponderation_AS,ASdisF1D(x1,x2) \
,Ponderation_AC,ACdisF1D(x1,x2) \
,Ponderation_AM,AMdisF1D(x1,x2) \
,FZERO \
) \
/* Distance dite "Universelle" cumulant toutes les distances possibles (elle fut introduite */ \
/* le 20071025105113). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I S T A N C E ( E T S O N C A R R E ) D E D E U X P O I N T S 2 D : */
/* */
/*************************************************************************************************************************************/
#define disI2D(x1,y1,x2,y2) \
disF2D(x1,y1,x2,y2)
#define RdisI2D(x1,y1,x2,y2) \
RACX(disI2D(x1,y1,x2,y2))
/* Distance euclidienne "entiere". */
#define disF2D(x1,y1,x2,y2) \
produit_scalaire_general_F2D(x1,y1,x2,y2,x1,y1,x2,y2)
#define RdisF2D(x1,y1,x2,y2) \
RACX(disF2D(x1,y1,x2,y2))
/* Distance euclidienne "flottante". */
#define gpdisF2D(p1,ACCES1,p2,ACCES2) \
produit_scalaire_general_F2D(ACCES1(p1,x),ACCES1(p1,y) \
,ACCES2(p2,x),ACCES2(p2,y) \
,ACCES1(p1,x),ACCES1(p1,y) \
,ACCES2(p2,x),ACCES2(p2,y) \
)
#define RgpdisF2D(p1,ACCES1,p2,ACCES2) \
RACX(gpdisF2D(p1,ACCES1,p2,ACCES2))
#define pdisF2D(p1,p2) \
gpdisF2D(p1,ASD1,p2,ASD1)
#define RpdisF2D(p1,p2) \
RACX(pdisF2D(p1,p2))
/* Distance euclidienne "flottante" entre deux points (introduite le 20120530093728). */
#define AIdisF2D(x1,y1,x2,y2) \
MIN2(AIdisF1D(x1,x2),AIdisF1D(y1,y2))
#define ASdisF2D(x1,y1,x2,y2) \
MAX2(ASdisF1D(x1,x2),ASdisF1D(y1,y2))
#define ACdisF2D(x1,y1,x2,y2) \
ADD2(ACdisF1D(x1,x2),ACdisF1D(y1,y2))
#define AMdisF2D(x1,y1,x2,y2) \
MUL2(AMdisF1D(x1,x2),AMdisF1D(y1,y2))
/* Distance dite par "valeur Absolue Inferieure", par "valeur Absolue Superieure", du */
/* "Chauffeur de taxi" ou enfin par "valeur Absolue Multipliee" (introduit le */
/* 20040328105656). */
/* */
/* La "valeur Absolue Multipliee" fut introduite le 20070715105646 meme si elle a peu */
/* d'interet mathematique... */
#define UdisF2D(x1,y1,x2,y2,Ponderation_R_,Ponderation_AI,Ponderation_AS,Ponderation_AC,Ponderation_AM) \
LIO5(Ponderation_R_,RdisF2D(x1,y1,x2,y2) \
,Ponderation_AI,AIdisF2D(x1,y1,x2,y2) \
,Ponderation_AS,ASdisF2D(x1,y1,x2,y2) \
,Ponderation_AC,ACdisF2D(x1,y1,x2,y2) \
,Ponderation_AM,AMdisF2D(x1,y1,x2,y2) \
,FZERO \
) \
/* Distance dite "Universelle" cumulant toutes les distances possibles (elle fut introduite */ \
/* le 20071025105113). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I S T A N C E ( E T S O N C A R R E ) D E D E U X P O I N T S 3 D : */
/* */
/*************************************************************************************************************************************/
#define disI3D(x1,y1,z1,x2,y2,z2) \
disF3D(x1,y1,z1,x2,y2,z2)
#define RdisI3D(x1,y1,z1,x2,y2,z2) \
RACX(disI3D(x1,y1,z1,x2,y2,z2))
/* Distance euclidienne "entiere". */
#define disF3D(x1,y1,z1,x2,y2,z2) \
produit_scalaire_general_F3D(x1,y1,z1,x2,y2,z2,x1,y1,z1,x2,y2,z2)
#define RdisF3D(x1,y1,z1,x2,y2,z2) \
RACX(disF3D(x1,y1,z1,x2,y2,z2))
/* Distance euclidienne "flottante". */
#define gpdisF3D(p1,ACCES1,p2,ACCES2) \
produit_scalaire_general_F3D(ACCES1(p1,x),ACCES1(p1,y),ACCES1(p1,z) \
,ACCES2(p2,x),ACCES2(p2,y),ACCES2(p2,z) \
,ACCES1(p1,x),ACCES1(p1,y),ACCES1(p1,z) \
,ACCES2(p2,x),ACCES2(p2,y),ACCES2(p2,z) \
)
#define RgpdisF3D(p1,ACCES1,p2,ACCES2) \
RACX(gpdisF3D(p1,ACCES1,p2,ACCES2))
#define pdisF3D(p1,p2) \
gpdisF3D(p1,ASD1,p2,ASD1)
#define RpdisF3D(p1,p2) \
RACX(pdisF3D(p1,p2))
/* Distance euclidienne "flottante" entre deux points (introduite le 20120530093728). */
#define AIdisF3D(x1,y1,z1,x2,y2,z2) \
MIN2(AIdisF2D(x1,y1,x2,y2),AIdisF1D(z1,z2))
#define ASdisF3D(x1,y1,z1,x2,y2,z2) \
MAX2(ASdisF2D(x1,y1,x2,y2),ASdisF1D(z1,z2))
#define ACdisF3D(x1,y1,z1,x2,y2,z2) \
ADD2(ACdisF2D(x1,y1,x2,y2),ACdisF1D(z1,z2))
#define AMdisF3D(x1,y1,z1,x2,y2,z2) \
MUL2(AMdisF2D(x1,y1,x2,y2),AMdisF1D(z1,z2))
/* Distance dite par "valeur Absolue Inferieure", par "valeur Absolue Superieure", du */
/* "Chauffeur de taxi" ou enfin par "valeur Absolue Multipliee" (introduit le */
/* 20040328105656). */
/* */
/* La "valeur Absolue Multipliee" fut introduite le 20070715105646 meme si elle a peu */
/* d'interet mathematique... */
#define UdisF3D(x1,y1,z1,x2,y2,z2,Ponderation_R_,Ponderation_AI,Ponderation_AS,Ponderation_AC,Ponderation_AM) \
LIO5(Ponderation_R_,RdisF3D(x1,y1,z1,x2,y2,z2) \
,Ponderation_AI,AIdisF3D(x1,y1,z1,x2,y2,z2) \
,Ponderation_AS,ASdisF3D(x1,y1,z1,x2,y2,z2) \
,Ponderation_AC,ACdisF3D(x1,y1,z1,x2,y2,z2) \
,Ponderation_AM,AMdisF3D(x1,y1,z1,x2,y2,z2) \
,FZERO \
) \
/* Distance dite "Universelle" cumulant toutes les distances possibles (elle fut introduite */ \
/* le 20071025105113). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I S T A N C E ( E T S O N C A R R E ) D E D E U X P O I N T S 4 D : */
/* */
/*************************************************************************************************************************************/
#define disI4D(x1,y1,z1,t1,x2,y2,z2,t2) \
disF4D(x1,y1,z1,t1,x2,y2,z2,t2)
#define RdisI4D(x1,y1,z1,t1,x2,y2,z2,t2) \
RACX(disI4D(x1,y1,z1,t1,x2,y2,z2,t2))
/* Distance euclidienne "entiere". */
#define disF4D(x1,y1,z1,t1,x2,y2,z2,t2) \
produit_scalaire_general_F4D(x1,y1,z1,t1,x2,y2,z2,t2,x1,y1,z1,t1,x2,y2,z2,t2)
#define RdisF4D(x1,y1,z1,t1,x2,y2,z2,t2) \
RACX(disF4D(x1,y1,z1,t1,x2,y2,z2,t2))
/* Distance euclidienne "flottante". */
#define AIdisF4D(x1,y1,z1,t1,x2,y2,z2,t2) \
MIN2(AIdisF3D(x1,y1,z1,x2,y2,z2),AIdisF1D(t1,t2))
#define ASdisF4D(x1,y1,z1,t1,x2,y2,z2,t2) \
MAX2(ASdisF3D(x1,y1,z1,x2,y2,z2),ASdisF1D(t1,t2))
#define ACdisF4D(x1,y1,z1,t1,x2,y2,z2,t2) \
ADD2(ACdisF3D(x1,y1,z1,x2,y2,z2),ACdisF1D(t1,t2))
#define AMdisF4D(x1,y1,z1,t1,x2,y2,z2,t2) \
MUL2(AMdisF3D(x1,y1,z1,x2,y2,z2),AMdisF1D(t1,t2))
/* Distance dite par "valeur Absolue Inferieure", par "valeur Absolue Superieure", du */
/* "Chauffeur de taxi" ou enfin par "valeur Absolue Multipliee" (introduit le */
/* 20040328105656). */
/* */
/* La "valeur Absolue Multipliee" fut introduite le 20070715105646 meme si elle a peu */
/* d'interet mathematique... */
#define UdisF4D(x1,y1,z1,t1,x2,y2,z2,t2,Ponderation_R_,Ponderation_AI,Ponderation_AS,Ponderation_AC,Ponderation_AM) \
LIO5(Ponderation_R_,RdisF4D(x1,y1,z1,t1,x2,y2,z2,t2) \
,Ponderation_AI,AIdisF4D(x1,y1,z1,t1,x2,y2,z2,t2) \
,Ponderation_AS,ASdisF4D(x1,y1,z1,t1,x2,y2,z2,t2) \
,Ponderation_AC,ACdisF4D(x1,y1,z1,t1,x2,y2,z2,t2) \
,Ponderation_AM,AMdisF4D(x1,y1,z1,t1,x2,y2,z2,t2) \
,FZERO \
) \
/* Distance dite "Universelle" cumulant toutes les distances possibles (elle fut introduite */ \
/* le 20071025105113). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I S T A N C E ( E T S O N C A R R E ) D E D E U X P O I N T S 5 D E T A U - D E L A : */
/* */
/*************************************************************************************************************************************/
#define disF5D(X1a,X2a,X3a,X4a,X5a,X1b,X2b,X3b,X4b,X5b) \
ADD2(disF1D(X1a,X1b) \
,disF4D(X2a,X3a,X4a,X5a \
,X2b,X3b,X4b,X5b \
) \
)
#define RdisF5D(X1a,X2a,X3a,X4a,X5a,X1b,X2b,X3b,X4b,X5b) \
RACX(disF5D(X1a,X2a,X3a,X4a,X5a \
,X1b,X2b,X3b,X4b,X5b \
) \
)
/* Distance euclidienne "flottante" 5D introduite le 20110810144451... */
#define disF6D(X1a,X2a,X3a,X4a,X5a,X6a,X1b,X2b,X3b,X4b,X5b,X6b) \
ADD2(disF1D(X1a,X1b) \
,disF5D(X2a,X3a,X4a,X5a,X6a \
,X2b,X3b,X4b,X5b,X6b \
) \
)
#define RdisF6D(X1a,X2a,X3a,X4a,X5a,X6a,X1b,X2b,X3b,X4b,X5b,X6b) \
RACX(disF6D(X1a,X2a,X3a,X4a,X5a,X6a \
,X1b,X2b,X3b,X4b,X5b,X6b \
) \
)
/* Distance euclidienne "flottante" 6D introduite le 20110810144451... */
#define disF7D(X1a,X2a,X3a,X4a,X5a,X6a,X7a,X1b,X2b,X3b,X4b,X5b,X6b,X7b) \
ADD2(disF1D(X1a,X1b) \
,disF6D(X2a,X3a,X4a,X5a,X6a,X7a \
,X2b,X3b,X4b,X5b,X6b,X7b \
) \
)
#define RdisF7D(X1a,X2a,X3a,X4a,X5a,X6a,X7a,X1b,X2b,X3b,X4b,X5b,X6b,X7b) \
RACX(disF7D(X1a,X2a,X3a,X4a,X5a,X6a,X7a \
,X1b,X2b,X3b,X4b,X5b,X6b,X7b \
) \
)
/* Distance euclidienne "flottante" 7D introduite le 20110810144451... */
#define disF8D(X1a,X2a,X3a,X4a,X5a,X6a,X7a,X8a,X1b,X2b,X3b,X4b,X5b,X6b,X7b,X8b) \
ADD2(disF1D(X1a,X1b) \
,disF7D(X2a,X3a,X4a,X5a,X6a,X7a,X8a \
,X2b,X3b,X4b,X5b,X6b,X7b,X8b \
) \
)
#define RdisF8D(X1a,X2a,X3a,X4a,X5a,X6a,X7a,X8a,X1b,X2b,X3b,X4b,X5b,X6b,X7b,X8b) \
RACX(disF8D(X1a,X2a,X3a,X4a,X5a,X6a,X7a,X8a \
,X1b,X2b,X3b,X4b,X5b,X6b,X7b,X8b \
) \
)
/* Distance euclidienne "flottante" 8D introduite le 20110810144451... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P E N T E S D U S E G M E N T E N T R E D E U X P O I N T S 1 D : */
/* */
/*************************************************************************************************************************************/
#define PenteX_normalisee_1D(x1,x2) \
DIVZ(SOUS(x2,x1),RdisF1D(x1,x2))
/* Pentes du segment entre deux points 1D (introduites le 20180702095929...). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P E N T E S D U S E G M E N T E N T R E D E U X P O I N T S 2 D : */
/* */
/*************************************************************************************************************************************/
#define PenteX_normalisee_2D(x1,y1,x2,y2) \
DIVZ(SOUS(x2,x1),RdisF2D(x1,y1,x2,y2))
#define PenteY_normalisee_2D(x1,y1,x2,y2) \
DIVZ(SOUS(y2,y1),RdisF2D(x1,y1,x2,y2))
/* Pentes du segment entre deux points 2D (introduites le 20180702095929...). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P E N T E S D U S E G M E N T E N T R E D E U X P O I N T S 3 D : */
/* */
/*************************************************************************************************************************************/
#define PenteX_normalisee_3D(x1,y1,z1,x2,y2,z2) \
DIVZ(SOUS(x2,x1),RdisF3D(x1,y1,z1,x2,y2,z2))
#define PenteY_normalisee_3D(x1,y1,z1,x2,y2,z2) \
DIVZ(SOUS(y2,y1),RdisF3D(x1,y1,z1,x2,y2,z2))
#define PenteZ_normalisee_3D(x1,y1,z1,x2,y2,z2) \
DIVZ(SOUS(z2,z1),RdisF3D(x1,y1,z1,x2,y2,z2))
/* Pentes du segment entre deux points 3D (introduites le 20180702095929...). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I D E N T I T E D E D E U X P O I N T S 1 D : */
/* */
/*************************************************************************************************************************************/
#define IFEQ_Rpoints1D_a_peu_pres(x1,x2,epsilon) \
IFLE(RdisF1D(x1,x2),epsilon)
#define IFEQ_Upoints1D_a_peu_pres(x1,x2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFLE(UdisF1D(x1,x2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM),epsilon)
/* Test d'identite approximatif introduit le 20150617082140... */
#define IFNE_Rpoints1D_a_peu_pres(x1,x2,epsilon) \
NOTL(IFEQ_Rpoints1D_a_peu_pres(x1,x2,epsilon))
#define IFNE_Upoints1D_a_peu_pres(x1,x2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
NOTL(IFEQ_Upoints1D_a_peu_pres(x1,x2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM))
/* Test de non identite approximatif introduit le 20150617082140... */
#define IFEQ_Rpoints1D(x1,x2) \
IFEQ_Rpoints1D_a_peu_pres(x1,x2,FZERO)
#define IFEQ_Upoints1D(x1,x2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFEQ_Upoints1D_a_peu_pres(x1,x2,FZERO,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM)
/* Test d'identite exact introduit le 20150617105748... */
#define IFNE_Rpoints1D(x1,x2) \
IFNE_Rpoints1D_a_peu_pres(x1,x2,FZERO)
#define IFNE_Upoints1D(x1,x2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFNE_Upoints1D_a_peu_pres(x1,x2,FZERO,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM)
/* Test de non identite exact introduit le 20150617105748... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I D E N T I T E D E D E U X P O I N T S 2 D : */
/* */
/*************************************************************************************************************************************/
#define IFEQ_Rpoints2D_a_peu_pres(x1,y1,x2,y2,epsilon) \
IFLE(RdisF2D(x1,y1,x2,y2),epsilon)
#define IFEQ_Upoints2D_a_peu_pres(x1,y1,x2,y2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFLE(UdisF2D(x1,y1,x2,y2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM),epsilon)
/* Test d'identite approximatif introduit le 20150617082140... */
#define IFNE_Rpoints2D_a_peu_pres(x1,y1,x2,y2,epsilon) \
NOTL(IFEQ_Rpoints2D_a_peu_pres(x1,y1,x2,y2,epsilon))
#define IFNE_Upoints2D_a_peu_pres(x1,y1,x2,y2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
NOTL(IFEQ_Upoints2D_a_peu_pres(x1,y1,x2,y2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM))
/* Test de non identite approximatif introduit le 20150617082140... */
#define IFEQ_Rpoints2D(x1,y1,x2,y2) \
IFEQ_Rpoints2D_a_peu_pres(x1,y1,x2,y2,FZERO)
#define IFEQ_Upoints2D(x1,y1,x2,y2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFEQ_Upoints2D_a_peu_pres(x1,y1,x2,y2,FZERO,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM)
/* Test d'identite exact introduit le 20150617105748... */
#define IFNE_Rpoints2D(x1,y1,x2,y2) \
IFNE_Rpoints2D_a_peu_pres(x1,y1,x2,y2,FZERO)
#define IFNE_Upoints2D(x1,y1,x2,y2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFNE_Upoints2D_a_peu_pres(x1,y1,x2,y2,FZERO,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM)
/* Test de non identite exact introduit le 20150617105748... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I D E N T I T E D E D E U X P O I N T S 3 D : */
/* */
/*************************************************************************************************************************************/
#define IFEQ_Rpoints3D_a_peu_pres(x1,y1,z1,x2,y2,z2,epsilon) \
IFLE(RdisF3D(x1,y1,z1,x2,y2,z2),epsilon)
#define IFEQ_Upoints3D_a_peu_pres(x1,y1,z1,x2,y2,z2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFLE(UdisF3D(x1,y1,z1,x2,y2,z2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM),epsilon)
/* Test d'identite approximatif introduit le 20150617082140... */
#define IFNE_Rpoints3D_a_peu_pres(x1,y1,z1,x2,y2,z2,epsilon) \
NOTL(IFEQ_Rpoints3D_a_peu_pres(x1,y1,z1,x2,y2,z2,epsilon))
#define IFNE_Upoints3D_a_peu_pres(x1,y1,z1,x2,y2,z2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
NOTL(IFEQ_Upoints3D_a_peu_pres(x1,y1,z1,x2,y2,z2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM))
/* Test de non identite approximatif introduit le 20150617082140... */
#define IFEQ_Rpoints3D(x1,y1,z1,x2,y2,z2) \
IFEQ_Rpoints3D_a_peu_pres(x1,y1,z1,x2,y2,z2,FZERO)
#define IFEQ_Upoints3D(x1,y1,z1,x2,y2,z2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFEQ_Upoints3D_a_peu_pres(x1,y1,z1,x2,y2,z2,FZERO,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM)
/* Test d'identite exact introduit le 20150617105748... */
#define IFNE_Rpoints3D(x1,y1,z1,x2,y2,z2) \
IFNE_Rpoints3D_a_peu_pres(x1,y1,z1,x2,y2,z2,FZERO)
#define IFNE_Upoints3D(x1,y1,z1,x2,y2,z2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFNE_Upoints3D_a_peu_pres(x1,y1,z1,x2,y2,z2,FZERO,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM)
/* Test de non identite exact introduit le 20150617105748... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I D E N T I T E D E D E U X P O I N T S 4 D : */
/* */
/*************************************************************************************************************************************/
#define IFEQ_Rpoints4D_a_peu_pres(x1,y1,z1,t1,x2,y2,z2,t2,epsilon) \
IFLE(RdisF4D(x1,y1,z1,t1,x2,y2,z2,t2),epsilon)
#define IFEQ_Upoints4D_a_peu_pres(x1,y1,z1,t1,x2,y2,z2,t2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFLE(UdisF4D(x1,y1,z1,t1,x2,y2,z2,t2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM),epsilon)
/* Test d'identite approximatif introduit le 20150617082140... */
#define IFNE_Rpoints4D_a_peu_pres(x1,y1,z1,t1,x2,y2,z2,t2,epsilon) \
NOTL(IFEQ_Rpoints4D_a_peu_pres(x1,y1,z1,t1,x2,y2,z2,t2,epsilon))
#define IFNE_Upoints4D_a_peu_pres(x1,y1,z1,t1,x2,y2,z2,t2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
NOTL(IFEQ_Upoints4D_a_peu_pres(x1,y1,z1,t1,x2,y2,z2,t2,epsilon,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM))
/* Test de non identite approximatif introduit le 20150617082140... */
#define IFEQ_Rpoints4D(x1,y1,z1,t1,x2,y2,z2,t2) \
IFEQ_Rpoints4D_a_peu_pres(x1,y1,z1,t1,x2,y2,z2,t2,FZERO)
#define IFEQ_Upoints4D(x1,y1,z1,t1,x2,y2,z2,t2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFEQ_Upoints4D_a_peu_pres(x1,y1,z1,t1,x2,y2,z2,t2,FZERO,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM)
/* Test d'identite exact introduit le 20150617105748... */
#define IFNE_Rpoints4D(x1,y1,z1,t1,x2,y2,z2,t2) \
IFNE_Rpoints4D_a_peu_pres(x1,y1,z1,t1,x2,y2,z2,t2,FZERO)
#define IFNE_Upoints4D(x1,y1,z1,t1,x2,y2,z2,t2,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM) \
IFNE_Upoints4D_a_peu_pres(x1,y1,z1,t1,x2,y2,z2,t2,FZERO,Ponder_R_,Ponder_AI,Ponder_AS,Ponder_AC,Ponder_AM)
/* Test de non identite exact introduit le 20150617105748... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T S C A L A I R E D E D E U X V E C T E U R S 1 D : */
/* */
/*************************************************************************************************************************************/
#define prsI1D(vectorA1,vectorA2) \
prsF1D(vectorA1,vectorA2)
#define prsF1D(vectorA1,vectorA2) \
produit_scalaire_general_F1D(ASD2(vectorA1,origine,x) \
,ASD2(vectorA1,extremite,x) \
,ASD2(vectorA2,origine,x) \
,ASD2(vectorA2,extremite,x) \
)
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T S C A L A I R E D E D E U X V E C T E U R S 2 D : */
/* */
/*************************************************************************************************************************************/
#define prsI2D(vectorA1,vectorA2) \
prsF2D(vectorA1,vectorA2)
#define prsF2D(vectorA1,vectorA2) \
produit_scalaire_general_F2D(ASD2(vectorA1,origine,x),ASD2(vectorA1,origine,y) \
,ASD2(vectorA1,extremite,x),ASD2(vectorA1,extremite,y) \
,ASD2(vectorA2,origine,x),ASD2(vectorA2,origine,y) \
,ASD2(vectorA2,extremite,x),ASD2(vectorA2,extremite,y) \
)
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T S C A L A I R E D E D E U X V E C T E U R S 3 D : */
/* */
/*************************************************************************************************************************************/
#define prsI3D(vectorA1,vectorA2) \
prsF3D(vectorA1,vectorA2)
#define prsF3D(vectorA1,vectorA2) \
produit_scalaire_general_F3D(ASD2(vectorA1,origine,x),ASD2(vectorA1,origine,y),ASD2(vectorA1,origine,z) \
,ASD2(vectorA1,extremite,x),ASD2(vectorA1,extremite,y),ASD2(vectorA1,extremite,z) \
,ASD2(vectorA2,origine,x),ASD2(vectorA2,origine,y),ASD2(vectorA2,origine,z) \
,ASD2(vectorA2,extremite,x),ASD2(vectorA2,extremite,y),ASD2(vectorA2,extremite,z) \
)
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* N O R M E D ' U N V E C T E U R 1 D : */
/* */
/*************************************************************************************************************************************/
#define normI1D(vectorA) \
RACX(FLOT(prsI1D(vectorA,vectorA)))
#define normF1D(vectorA) \
RACX(prsF1D(vectorA,vectorA))
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* N O R M E D ' U N V E C T E U R 2 D : */
/* */
/*************************************************************************************************************************************/
#define normI2D(vectorA) \
RACX(FLOT(prsI2D(vectorA,vectorA)))
#define normF2D(vectorA) \
RACX(prsF2D(vectorA,vectorA))
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* N O R M E D ' U N V E C T E U R 3 D : */
/* */
/*************************************************************************************************************************************/
#define normI3D(vectorA) \
RACX(FLOT(prsI3D(vectorA,vectorA)))
#define normF3D(vectorA) \
RACX(prsF3D(vectorA,vectorA))
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T H E O R E M E D E P Y T H A G O R E E T L O N G U E U R D ' U N V E C T E U R 1 D : */
/* */
/*************************************************************************************************************************************/
#define pytI1D(delta) \
pytF1D(delta)
#define longI1D(delta) \
RACX(pytI1D(delta))
-define GpytF1D(x) \
-_-_-_- ABSO(x)
/* "Theoreme de Pythagore" general introduit le 20040328105656. */
#define pytF1D(delta) \
prdF1D(delta,delta)
#define longF1D(delta) \
RACX(pytF1D(delta))
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T H E O R E M E D E P Y T H A G O R E E T L O N G U E U R D ' U N V E C T E U R 2 D : */
/* */
/*************************************************************************************************************************************/
#define pytI2D(delta) \
pytF2D(delta)
#define longI2D(delta) \
RACX(pytI2D(delta))
-define GpytF2D(x,y) \
-_-_-_- RACX(ADD2(EXP2(x),EXP2(y)))
/* "Theoreme de Pythagore" general introduit le 20021120101208. */
#define ANGLE_QUELCONQUE \
FZERO
#define COSINUS_CARRE_PLUS_SINUS_CARRE \
GpytF2D(COSX(ANGLE_QUELCONQUE),SINX(ANGLE_QUELCONQUE))
/* Introduit le 20161228094015 pour 'v $xrs/helicoide.11$I COSINUS_CARRE_PLUS_SINUS_CARRE'. */
#define pytF2D(delta) \
prdF2D(delta,delta)
#define longF2D(delta) \
RACX(pytF2D(delta))
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T H E O R E M E D E P Y T H A G O R E E T L O N G U E U R D ' U N V E C T E U R 3 D : */
/* */
/*************************************************************************************************************************************/
#define pytI3D(delta) \
pytF3D(delta)
#define longI3D(delta) \
RACX(pytI3D(delta))
-define GpytF3D(x,y,z) \
-_-_-_- RACX(ADD3(EXP2(x),EXP2(y),EXP2(z)))
/* "Theoreme de Pythagore" general introduit le 20021120101208. */
#define pytF3D(delta) \
prdF3D(delta,delta)
#define longF3D(delta) \
RACX(pytF3D(delta))
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T H E O R E M E D E P Y T H A G O R E 4 D : */
/* */
/*************************************************************************************************************************************/
-define GpytF4D(x,y,z,t) \
-_-_-_- RACX(ADD4(EXP2(x),EXP2(y),EXP2(z),EXP2(t)))
/* "Theoreme de Pythagore" general introduit le 20230210100148. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T H E O R E M E D E P Y T H A G O R E 8 D : */
/* */
/*************************************************************************************************************************************/
-define GpytF8D(x1,x2,x3,x4,x5,x6,x7,x8) \
-_-_-_- RACX(ADD8(EXP2(x1),EXP2(x2),EXP2(x3),EXP2(x4),EXP2(x5),EXP2(x6),EXP2(x7),EXP2(x8)))
/* "Theoreme de Pythagore" general introduit le 20230225122831. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T D E D E U X D E P L A C E M E N T S 1 D : */
/* */
/*************************************************************************************************************************************/
#define prdI1D(deltaA1,deltaA2) \
prdF1D(deltaA1,deltaA2)
#define prdF1D(deltaA1,deltaA2) \
MUL2(ASD1(deltaA1,dx),ASD1(deltaA2,dx))
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T D E D E U X D E P L A C E M E N T S 2 D : */
/* */
/*************************************************************************************************************************************/
#define prdI2D(deltaA1,deltaA2) \
prdF2D(deltaA1,deltaA2)
#define prdF2D(deltaA1,deltaA2) \
ADD2(prdF1D(deltaA1,deltaA2) \
,MUL2(ASD1(deltaA1,dy),ASD1(deltaA2,dy)) \
)
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T D E D E U X D E P L A C E M E N T S 3 D : */
/* */
/*************************************************************************************************************************************/
#define prdI3D(deltaA1,deltaA2) \
prdF3D(deltaA1,deltaA2)
#define prdF3D(deltaA1,deltaA2) \
ADD2(prdF2D(deltaA1,deltaA2) \
,MUL2(ASD1(deltaA1,dz),ASD1(deltaA2,dz)) \
)
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R E S O L U T I O N D E L ' E Q U A T I O N D U S E C O N D D E G R E : */
/* */
/*************************************************************************************************************************************/
#define DISCRIMINANT2(a,b,c) \
SOUS(EXP2(b),GRO4(MUL2(a,c))) \
/* Calcul du discriminant : */ \
/* */ \
/* 2 */ \
/* b - 4ac */ \
/* */ \
/* de l'equation du second degre. */ \
/* */ \
/* Le nom 'DISCRIMINANT2=(...)' a ete change en 'DISCRIMINANT2(...)' le 20110325112639 */ \
/* ce qui rappelle donc le degre (2) de l'equation... */
#define RDISCRIMINANT2(a,b,c) \
RACX(DISCRIMINANT2(a,b,c)) \
/* Calcul de la racine carree du discriminant de l'equation du second degre. */ \
/* */ \
/* Le nom 'RDISCRIMINANT2=(...)' a ete change en 'RDISCRIMINANT2(...)' le 20110325112639 */ \
/* ce qui rappelle donc le degre (2) de l'equation... */
#define RACINES_REELLES_DE_L_EQUATION_DU_SECOND_DEGRE(a,b,c,operateur) \
DIVI(operateur(NEGA(b),RDISCRIMINANT2(a,b,c)),GRO2(a))
#define RACINE_REELLE_n_DE_L_EQUATION_DU_SECOND_DEGRE(a,b,c) \
RACINES_REELLES_DE_L_EQUATION_DU_SECOND_DEGRE(a,b,c,SOUS)
#define RACINE_REELLE_p_DE_L_EQUATION_DU_SECOND_DEGRE(a,b,c) \
RACINES_REELLES_DE_L_EQUATION_DU_SECOND_DEGRE(a,b,c,ADD2)
/* Calcul des racines reelles de l'equation du second degre. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D ' U N D E T E R M I N A N T 1 x 1 : */
/* */
/*************************************************************************************************************************************/
#define DET1(a11) \
NEUT(a11) \
/* Calcul du determinant : */ \
/* */ \
/* | a11 | */ \
/* */
#define mDET1(matrice) \
DET1(ASD2(matrice,cx,cx) \
) \
/* Calcul du determinant d'une matrice 1D (introduit le 20051107145459). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D ' U N D E T E R M I N A N T 2 x 2 : */
/* */
/*************************************************************************************************************************************/
#define DET2(a11,a12,a21,a22) \
NEUT(ADD2(MUL2(NEUT(a11),DET1(a22)) \
,MUL2(NEGA(a12),DET1(a21)) \
) \
) \
/* Calcul du determinant : */ \
/* */ \
/* | a11 a12 | */ \
/* | | */ \
/* | a21 a22 | */ \
/* */
#define mDET2(matrice) \
DET3(ASD2(matrice,cx,cx),ASD2(matrice,cx,cy) \
,ASD2(matrice,cy,cx),ASD2(matrice,cy,cy) \
) \
/* Calcul du determinant d'une matrice 2D (introduit le 20051107145459). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D ' U N D E T E R M I N A N T 3 x 3 : */
/* */
/*************************************************************************************************************************************/
#define DET3(a11,a12,a13,a21,a22,a23,a31,a32,a33) \
NEUT(ADD3(MUL2(NEUT(a11),DET2(a22,a23,a32,a33)) \
,MUL2(NEGA(a12),DET2(a21,a23,a31,a33)) \
,MUL2(NEUT(a13),DET2(a21,a22,a31,a32)) \
) \
) \
/* Calcul du determinant : */ \
/* */ \
/* | a11 a12 a13 | */ \
/* | | */ \
/* | a21 a22 a23 | */ \
/* | | */ \
/* | a31 a32 a33 | */ \
/* */
#define mDET3(matrice) \
DET3(ASD2(matrice,cx,cx),ASD2(matrice,cx,cy),ASD2(matrice,cx,cz) \
,ASD2(matrice,cy,cx),ASD2(matrice,cy,cy),ASD2(matrice,cy,cz) \
,ASD2(matrice,cz,cx),ASD2(matrice,cz,cy),ASD2(matrice,cz,cz) \
) \
/* Calcul du determinant d'une matrice 3D (introduit le 20051107145459). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D ' U N D E T E R M I N A N T 4 x 4 : */
/* */
/*************************************************************************************************************************************/
#define DET4(a11,a12,a13,a14,a21,a22,a23,a24,a31,a32,a33,a34,a41,a42,a43,a44) \
NEUT(ADD4(MUL2(NEUT(a11),DET3(a22,a23,a24,a32,a33,a34,a42,a43,a44)) \
,MUL2(NEGA(a12),DET3(a21,a23,a24,a31,a33,a34,a41,a43,a44)) \
,MUL2(NEUT(a13),DET3(a21,a22,a24,a31,a32,a34,a41,a42,a44)) \
,MUL2(NEGA(a14),DET3(a21,a22,a23,a31,a32,a33,a41,a42,a43)) \
) \
) \
/* Calcul du determinant : */ \
/* */ \
/* | a11 a12 a13 a14 | */ \
/* | | */ \
/* | a21 a22 a23 a24 | */ \
/* | | */ \
/* | a31 a32 a33 a34 | */ \
/* | | */ \
/* | a41 a42 a43 a44 | */ \
/* */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T E S T D E L A S I T U A T I O N D ' U N P O I N T P A R R A P P O R T */
/* A U N T R I A N G L E D U P L A N E T R E N V O I D E S E S */
/* C O O R D O N N E E S B A R Y C E N T R I Q U E S : */
/* */
/*************************************************************************************************************************************/
#define INTERIEUR_D_UN_TRIANGLE(le_point_est_interieur,alpha,beta,gamma,x,y,x1,y1,x2,y2,x3,y3) \
Bblock \
DEFV(Float,INIT(determinant,FLOT__UNDEF)); \
DEFV(Float,INIT(determinant_alpha,FLOT__UNDEF)); \
DEFV(Float,INIT(determinant_beta,FLOT__UNDEF)); \
DEFV(Float,INIT(determinant_gamma,FLOT__UNDEF)); \
/* Definition des trois determinants destines a calculer les coordonnees barycentriques */ \
/* (alpha,beta,gamma) du point {x,y} dans le triangle [(x1,y1),(x2,y2),(x3,y3)]. */ \
\
EGAL(alpha,FLOT__UNDEF); \
EGAL(beta,FLOT__UNDEF); \
EGAL(gamma,FLOT__UNDEF); \
/* Definition des coordonnees barycentriques du point {x,y} dans le triangle */ \
/* [(x1,y1),(x2,y2),(x3,y3)]. Elles sont definies a l'aide du systeme : */ \
/* */ \
/* alpha.x1 + beta.x2 + gamma.x3 = x */ \
/* alpha.y1 + beta.y2 + gamma.y3 = y */ \
/* alpha.1 + beta.1 + gamma.1 = 1 */ \
/* */ \
/* Le point {x,y} sera a l'interieur du triangle [(x1,y1),(x2,y2),(x3,y3)] si les trois */ \
/* conditions suivantes sont satisfaites : */ \
/* */ \
/* 0 <= alpha <= 1 */ \
/* 0 <= beta <= 1 */ \
/* 0 <= gamma <= 1 */ \
/* */ \
EGAL(determinant \
,DET3(x1,x2,x3 \
,y1,y2,y3 \
,FU,FU,FU \
) \
); \
/* Calcul du determinant : */ \
/* */ \
/* | x1 x2 x3 | */ \
/* | | */ \
/* | y1 y2 y3 | */ \
/* | | */ \
/* | 1 1 1 | */ \
/* */ \
\
Test(IZNE(determinant)) \
Bblock \
/* Cas ou le determinant est non nul ; le systeme peut donc etre resolu : */ \
EGAL(determinant_alpha \
,DET3(x,x2,x3 \
,y,y2,y3 \
,FU,FU,FU \
) \
); \
/* Calcul du determinant : */ \
/* */ \
/* | x x2 x3 | */ \
/* | | */ \
/* | y y2 y3 | */ \
/* | | */ \
/* | 1 1 1 | */ \
/* */ \
EGAL(determinant_beta \
,DET3(x1,x,x3 \
,y1,y,y3 \
,FU,FU,FU \
) \
); \
/* Calcul du determinant : */ \
/* */ \
/* | x1 x x3 | */ \
/* | | */ \
/* | y1 y y3 | */ \
/* | | */ \
/* | 1 1 1 | */ \
/* */ \
EGAL(determinant_gamma \
,DET3(x1,x2,x \
,y1,y2,y \
,FU,FU,FU \
) \
); \
/* Calcul du determinant : */ \
/* */ \
/* | x1 x2 x | */ \
/* | | */ \
/* | y1 y2 y | */ \
/* | | */ \
/* | 1 1 1 | */ \
/* */ \
EGAL(alpha,DIVI(determinant_alpha,determinant)); \
EGAL(beta,DIVI(determinant_beta,determinant)); \
EGAL(gamma,DIVI(determinant_gamma,determinant)); \
/* Calcul des coordonnees barycentriques (alpha,beta,gamma) du point {x,y}, a l'aide des */ \
/* formules de Cramer... */ \
Test(I3ET(IFINff(alpha,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE) \
,IFINff(beta,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE) \
,IFINff(gamma,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE) \
) \
) \
Bblock \
EGAL(le_point_est_interieur,VRAI); \
/* Le point {x,y} est a l'interieur du triangle [(x1,y1),(x2,y2),(x3,y3)]... */ \
Eblock \
ATes \
Bblock \
EGAL(le_point_est_interieur,FAUX); \
/* Le point {x,y} est a l'exterieur du triangle [(x1,y1),(x2,y2),(x3,y3)]... */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
/* Cas ou le determinant est nul ; le systeme ne peut etre resolu (les points sont peut-etre */ \
/* alignes, ou confondus). */ \
EGAL(le_point_est_interieur,FAUX); \
/* Le point {x,y} est considere comme etant a l'exterieur (d'un triangle degenere...). */ \
Eblock \
ETes \
Eblock \
/* Cette procedure teste si le point {x,y} est a l'interieur du triangle plan defini par */ \
/* les points [(x1,y1),(x2,y2),(x3,y3)]. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T V E C T O R I E L D E D E U X D E P L A C E M E N T S 3 D : */
/* */
/*************************************************************************************************************************************/
#define PvectX(x1,y1,z1,x2,y2,z2) \
NEUT(DET2(y1,z1 \
,y2,z2 \
) \
) \
/* Calcul de la composante sur 'OX' du produit vectoriel (x1,y1,z1) /\ (x2,y2,z2). */
#define PvectY(x1,y1,z1,x2,y2,z2) \
NEGA(DET2(x1,z1 \
,x2,z2 \
) \
) \
/* Calcul de la composante sur 'OY' du produit vectoriel (x1,y1,z1) /\ (x2,y2,z2). */
#define PvectZ(x1,y1,z1,x2,y2,z2) \
NEUT(DET2(x1,y1 \
,x2,y2 \
) \
) \
/* Calcul de la composante sur 'OZ' du produit vectoriel (x1,y1,z1) /\ (x2,y2,z2). */
/* Calcul du produit vectoriel : */
/* */
/* | OX OY OZ | */
/* | | */
/* (x1,y1,z1) /\ (x2,y2,z2) = | x1 y1 z1 | */
/* | | */
/* | x2 y2 z2 | */
/* */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* " A N T I - P R O D U I T V E C T O R I E L " D E D E U X D E P L A C E M E N T S 3 D : */
/* */
/* */
/* Definition : */
/* */
/* Soit le produit vectoriel : */
/* */
/* ---> ---> ---> */
/* V = V /\ V */
/* 3 1 2 */
/* */
/* l'anti-produit vectoriel est alors */
/* ainsi defini : */
/* */
/* ---> ---> -1 ---> */
/* V = V /\ V */
/* 1 3 2 */
/* */
/* */
/* Nota important : */
/* */
/* Malheureusement, des experiences faites */
/* dans le programme 'v $xrk/rdn_walk.41$K' */
/* montre que cette notion est de peu d'utilite */
/* car contrairement a l'intuition, l'anti-produit */
/* n'est pas defini de facon unique. Cela peut se */
/* voir sur l'exemple suivant le 19971204091928 : */
/* */
/* ---> */
/* V = (a,b,0) */
/* 1 */
/* */
/* ---> */
/* V = (0,0,c) */
/* 2 */
/* */
/* d'ou : */
/* */
/* ---> */
/* V = (+bc,-ac,0) */
/* 3 */
/* */
/* Le calcul de l'anti-produit vectoriel */
/* pour retrouver le vecteur 'V1' (suppose */
/* alors inconnu) : */
/* */
/* ---> */
/* V = {x,y,z} */
/* 1 */
/* */
/* conduit a resoudre le systeme lineaire : */
/* */
/* +0 + cy - 0 = +bc */
/* -cx + 0 + 0 = -ac */
/* +0 - 0 + 0 = 0 */
/* */
/* qui donne : */
/* */
/* ---> */
/* V = (a,b,?) */
/* 1 */
/* */
/* et il y a donc indetermination sur la */
/* troisieme composante 'z'. En notant 'theta' */
/* l'angle (inconnu donc) entre 'V1' et 'V2', */
/* on a : */
/* */
/* ---> ---> ---> */
/* | V | = | V || V |sin(theta) */
/* 3 1 2 */
/* */
/* d'ou : */
/* */
/* 2 2 2 2 2 2 2 2 2 */
/* (b c + a c ) = (a + b + z )c sin (theta) */
/* */
/* 2 2 2 2 2 2 */
/* (b + a ) = (a + b + z )sin (theta) */
/* */
/* il y a donc une infinite de solutions */
/* otenue a partir de couples {z,theta} */
/* satisfaisant a la relation ci-dessus. */
/* */
/* Les definitions ci-dessous sont malgre */
/* tout conservees meme si elle sont donc */
/* de peu d'utilite... */
/* */
/*************************************************************************************************************************************/
#define APvectX(x3,y3,z3,x2,y2,z2) \
DIVI(DET3(NEUT(x3) ,NEUT(z2) ,NEGA(y2) \
,NEUT(y3) ,FZERO ,NEUT(x2) \
,NEUT(z3) ,NEGA(x2) ,FZERO \
) \
,DET3(FZERO ,NEUT(z2) ,NEGA(y2) \
,NEGA(z2) ,FZERO ,NEUT(x2) \
,NEUT(y2) ,NEGA(x2) ,FZERO \
) \
) \
/* -1 */ \
/* calcul de la composante sur 'OX' de l'anti-produit vectoriel (x3,y3,z3) /\ (x2,y2,z2) */ \
/* ou l'on notera que l'on suppose que le diviseur 'DET3(...)' est non nul... */
#define APvectY(x3,y3,z3,x2,y2,z2) \
DIVI(DET3(FZERO ,NEUT(x3) ,NEGA(y2) \
,NEGA(z2) ,NEUT(y3) ,NEUT(x2) \
,NEUT(y2) ,NEUT(z3) ,FZERO \
) \
,DET3(FZERO ,NEUT(z2) ,NEGA(y2) \
,NEGA(z2) ,FZERO ,NEUT(x2) \
,NEUT(y2) ,NEGA(x2) ,FZERO \
) \
) \
/* -1 */ \
/* calcul de la composante sur 'OY' de l'anti-produit vectoriel (x3,y3,z3) /\ (x2,y2,z2) */ \
/* ou l'on notera que l'on suppose que le diviseur 'DET3(...)' est non nul... */
#define APvectZ(x3,y3,z3,x2,y2,z2) \
DIVI(DET3(FZERO ,NEUT(z2) ,NEUT(x3) \
,NEGA(z2) ,FZERO ,NEUT(y3) \
,NEUT(y2) ,NEGA(x2) ,NEUT(z3) \
) \
,DET3(FZERO ,NEUT(z2) ,NEGA(y2) \
,NEGA(z2) ,FZERO ,NEUT(x2) \
,NEUT(y2) ,NEGA(x2) ,FZERO \
) \
) \
/* -1 */ \
/* calcul de la composante sur 'OZ' de l'anti-produit vectoriel (x3,y3,z3) /\ (x2,y2,z2) */ \
/* ou l'on notera que l'on suppose que le diviseur 'DET3(...)' est non nul... */
/* Calcul de l'anti-produit vectoriel : on se donne donc le produit vectoriel : */
/* */
/* (x1,y1,z1) /\ (x2,y2,z2) = (x3,y3,z3) */
/* */
/* et l'on cherche a connaitre le premier vecteur (x1,y1,z1), ce que l'on note : */
/* */
/* -1 */
/* (x1,y1,z1) = (x3,y3,z3) /\ (x2,y2,z2) */
/* */
/* a partir des deux autres (x2,y2,z2) et (x3,y3,z3). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O D U I T M I X T E D E T R O I S D E P L A C E M E N T S 3 D : */
/* */
/*************************************************************************************************************************************/
#define Pmixte(x1,y1,z1,x2,y2,z2,x3,y3,z3) \
DET3(x1,y1,z1 \
,x2,y2,z2 \
,x3,y3,z3 \
) \
/* Produit mixte de trois deplacements (introduit le 20080708112901)... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* A I R E D ' U N T R I A N G L E D A N S L ' E S P A C E : */
/* */
/*************************************************************************************************************************************/
#define AIRE_TRIANGLE_3D(x1,y1,z1,x2,y2,z2,x3,y3,z3) \
MOIT(RdisF3D(x1 \
,y1 \
,z1 \
,ADD2(x1 \
,PvectX(SOUS(x2,x1),SOUS(y2,y1),SOUS(z2,z1) \
,SOUS(x3,x1),SOUS(y3,y1),SOUS(z3,z1) \
) \
) \
,ADD2(y1 \
,PvectY(SOUS(x2,x1),SOUS(y2,y1),SOUS(z2,z1) \
,SOUS(x3,x1),SOUS(y3,y1),SOUS(z3,z1) \
) \
) \
,ADD2(z1 \
,PvectZ(SOUS(x2,x1),SOUS(y2,y1),SOUS(z2,z1) \
,SOUS(x3,x1),SOUS(y3,y1),SOUS(z3,z1) \
) \
) \
) \
) \
/* Calcul de l'aire d'un triangle de sommets [(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)]. Celle-ci */ \
/* est egale a la moitie du module du produit vectoriel de deux quelconques de ses cotes. */ \
/* On notera la translation par (x1,y1,z1) destinee a ramener le produit vectoriel au sommet */ \
/* (x1,y1,z1) choisi arbitrairement dans le triangle. Cette operation est en fait inutile */ \
/* (voir la definition de 'RdisF3D(...)', mais cela est fait uniquement pour des raisons */ \
/* liees au style...). Soient les trois points P1(x1,y1,z1), P2(x2,y2,z2) et P3(x3,y3,z3) */ \
/* donnes en argument et definissant le triangle [P ,P ,P ] ; on a alors : */ \
/* 1 2 3 */ \
/* */ \
/* 1 |-----> ----->| */ \
/* Aire(P1,P2,P3) = ---.(| P P /\ P P |) */ \
/* 2 | 1 2 1 3 | */ \
/* */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D E V A L E U R S A L E A T O I R E S : */
/* */
/*************************************************************************************************************************************/
#define GENERATION_D_UNE_VALEUR_ALEATOIRE__DONNEES_GLOBALES \
/* Procedure introduite le 20210520085903... */ \
DEFV(pointI_3D,point_courant_de_l_espace_de_parametrage); \
/* Point courant d'un espace abstrait servant a parametrer le generateur d'evenements. */ \
SPIRALE_DEFINITION_GENERALE(SPIRALE_DELTA_HORIZONTAL_GLOBAL,SPIRALE_DELTA_VERTICAL_GLOBAL) \
/* Donnees de generation d'une spirale de parcours d'un espace abstrait bidimensionnel */ \
/* de parametrage de la generation des evenements. */
#define GENERATION_D_UNE_VALEUR_ALEATOIRE__INITIALISATIONS \
/* Procedure introduite le 20210520085903... */ \
Bblock \
SPIRALE_VALIDATION; \
/* Validation des pas de parcours (pasX,pasY) de l'espace abstrait de parametrage du */ \
/* generateur d'evenements. */ \
INITIALISATION_POINT_3D(point_courant_de_l_espace_de_parametrage,Xmin,Ymin,Zmin); \
/* Initialisation de l'espace de parametrage independante du format de l'image, puisque le */ \
/* point 'min' n'en depend pas... */ \
Eblock
#define GENERATION_D_UNE_VALEUR_ALEATOIRE__CALCUL(valeur_aleatoire \
,graine \
,borne_inferieure \
,borne_superieure \
) \
Bblock \
EGAL(valeur_aleatoire \
,rdnI3D(ADRESSE(point_courant_de_l_espace_de_parametrage) \
,graine \
,RDN_INIT_AND_GENERE \
,borne_inferieure,borne_superieure \
) \
); \
/* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] et parametree */ \
/* par le point courant de l'espace de parametrage. */ \
\
SPIRALE_INITIALISATION; \
/* Initialisation dynamique de 'spirale_nombre_de_points_a_traiter'. */ \
SPIRALE_DEPLACEMENT(ASD1(point_courant_de_l_espace_de_parametrage,x) \
,ASD1(point_courant_de_l_espace_de_parametrage,y) \
); \
/* Deplacement du point courant de la spirale de l'espace de parametrage. */ \
SPIRALE_PARCOURS; \
/* Parcours de la spirale avec rotation eventuelle de PI/2 du bras courant... */ \
Eblock \
/* Procedure introduite le 20210520085903... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R E S O L U T I O N D ' E Q U A T I O N S L I N E A I R E S I N D E T E R M I N E E S E N { X , Y , Z } : */
/* */
/* */
/* Application : */
/* */
/* Une application de ce programme de */
/* resolution "aleatoire" d'equations a trois */
/* inconnues du type : */
/* */
/* A*X + B*Y + C*Z = D */
/* */
/* est la definition de palettes de couleurs */
/* a luminance strictement croissante. On */
/* resoudra donc : */
/* */
/* 0.30*R + 0.59*V + 0.11*B = LUMINANCE */
/* */
/* ou {0.30,0.59,0.11} sont respectivement */
/* 'v $xiii/quad_image$DEF LUMINANCE_DU_'. */
/* Ainsi, pour chaque LUMINANCE dans [$NOIR,$BLANC] */
/* on calculera un triplet {R,V,B} ayant cette */
/* luminance ('v $xciP/aleatoire.01$vv$Z' qui */
/* realise cela...). */
/* */
/*************************************************************************************************************************************/
#define RESOLUTION_EQUATION_LINEAIRE_INDETERMINEE_3D__DONNEES_UTILES_GLOBALES \
GENERATION_D_UNE_VALEUR_ALEATOIRE__DONNEES_GLOBALES;
#define RESOLUTION_EQUATION_LINEAIRE_INDETERMINEE_3D__DONNEES_UTILES_LOCALES \
/* Procedure introduite le 20210520100515... */ \
DEFV(Float,INIT(solution_X,FLOT__UNDEF)); \
DEFV(Float,INIT(solution_Y,FLOT__UNDEF)); \
DEFV(Float,INIT(solution_Z,FLOT__UNDEF)); \
/* Valeur courante des solutions {X,Y,Z} initialisees arbitrairement... */
#define RESOLUTION_EQUATION_LINEAIRE_INDETERMINEE_3D__INITIALISATION \
Bblock \
GENERATION_D_UNE_VALEUR_ALEATOIRE__INITIALISATIONS; \
Eblock
#define RESOLUTION_EQUATION_LINEAIRE_INDETERMINEE_3D__GENERATION_D_UNE_VALEUR_ALEATOIRE(valeur_aleatoire \
,graine \
,borne_inferieure \
,borne_superieure \
) \
Bblock \
GENERATION_D_UNE_VALEUR_ALEATOIRE__CALCUL(valeur_aleatoire \
,graine \
,borne_inferieure \
,borne_superieure \
); \
Eblock \
/* Procedure introduite le 20210520085903... */
#define RESOLUTION_EQUATION_LINEAIRE_INDETERMINEE_3D(parametre_A \
,parametre_B \
,parametre_C \
,parametre_D \
,utiliser_le_parametre_D_comme_borne_superieure \
,borne_inferieure_courante_X \
,borne_superieure_courante_X \
,borne_inferieure_courante_Y \
,borne_superieure_courante_Y \
,borne_inferieure_courante_Z \
,borne_superieure_courante_Z \
) \
/* Procedure introduite le 20210520085903... */ \
Bblock \
DEFV(Float,INIT(borne_inferieure_effective_X,borne_inferieure_courante_X)); \
DEFV(Float,INIT(borne_superieure_effective_X \
,COND(IL_FAUT(utiliser_le_parametre_D_comme_borne_superieure) \
,parametre_D \
,borne_superieure_courante_X \
) \
) \
); \
\
DEFV(Float,INIT(borne_inferieure_effective_Y,borne_inferieure_courante_Y)); \
DEFV(Float,INIT(borne_superieure_effective_Y \
,COND(IL_FAUT(utiliser_le_parametre_D_comme_borne_superieure) \
,parametre_D \
,borne_superieure_courante_Y \
) \
) \
); \
\
DEFV(Float,INIT(borne_inferieure_effective_Z,borne_inferieure_courante_Z)); \
DEFV(Float,INIT(borne_superieure_effective_Z \
,COND(IL_FAUT(utiliser_le_parametre_D_comme_borne_superieure) \
,parametre_D \
,borne_superieure_courante_Z \
) \
) \
); \
\
DEFV(Float,INIT(borne_inferieure_aleatoire_X,FLOT__UNDEF)); \
DEFV(Float,INIT(borne_inferieure_aleatoire_Y,FLOT__UNDEF)); \
DEFV(Float,INIT(borne_inferieure_aleatoire_Z,FLOT__UNDEF)); \
\
DEFV(Float,INIT(borne_superieure_aleatoire_X,FLOT__UNDEF)); \
DEFV(Float,INIT(borne_superieure_aleatoire_Y,FLOT__UNDEF)); \
DEFV(Float,INIT(borne_superieure_aleatoire_Z,FLOT__UNDEF)); \
/* Bornes courantes de generation aleatoire. */ \
\
DEFV(Logical,INIT(iterer,VRAI)); \
DEFV(Positive,INIT(nombre_d_iterations,ZERO)); \
/* Controle de l'iterations... */ \
\
EGAL(solution_X,MOYE(borne_inferieure_effective_X,borne_superieure_effective_X)); \
EGAL(solution_Y,MOYE(borne_inferieure_effective_Y,borne_superieure_effective_Y)); \
EGAL(solution_Z,MOYE(borne_inferieure_effective_Z,borne_superieure_effective_Z)); \
/* Initialisation a priori des solutions {X,Y,Z} avant le processus iteratif... */ \
\
EGAL(borne_inferieure_aleatoire_X \
,NEGA(MUL2(facteur_X,SOUA(borne_inferieure_effective_X,borne_superieure_effective_X))) \
); \
EGAL(borne_inferieure_aleatoire_Y \
,NEGA(MUL2(facteur_Y,SOUA(borne_inferieure_effective_Y,borne_superieure_effective_Y))) \
); \
EGAL(borne_inferieure_aleatoire_Z \
,NEGA(MUL2(facteur_Z,SOUA(borne_inferieure_effective_Z,borne_superieure_effective_Z))) \
); \
\
EGAL(borne_superieure_aleatoire_X \
,NEUT(MUL2(facteur_X,SOUA(borne_inferieure_effective_X,borne_superieure_effective_X))) \
); \
EGAL(borne_superieure_aleatoire_Y \
,NEUT(MUL2(facteur_Y,SOUA(borne_inferieure_effective_Y,borne_superieure_effective_Y))) \
); \
EGAL(borne_superieure_aleatoire_Z \
,NEUT(MUL2(facteur_Z,SOUA(borne_inferieure_effective_Z,borne_superieure_effective_Z))) \
); \
/* Les bornes courantes de generation aleatoire sont fonctions des bornes des variables */ \
/* {X,Y,Z}... */ \
\
EGAL(iterer,VRAI); \
\
Tant(IL_FAUT(iterer)) \
Bblock \
DEFV(Float,INIT(solution_X_avant_perturbation,solution_X)); \
DEFV(Float,INIT(solution_Y_avant_perturbation,solution_Y)); \
DEFV(Float,INIT(solution_Z_avant_perturbation,solution_Z)); \
DEFV(Float,INIT(parametre_D_avant_perturbation,FLOT__UNDEF)); \
/* Etat avant perturbation... */ \
DEFV(Float,INIT(solution_X_apres_perturbation,FLOT__UNDEF)); \
DEFV(Float,INIT(solution_Y_apres_perturbation,FLOT__UNDEF)); \
DEFV(Float,INIT(solution_Z_apres_perturbation,FLOT__UNDEF)); \
DEFV(Float,INIT(parametre_D_apres_perturbation,FLOT__UNDEF)); \
/* Etat apres perturbation... */ \
\
DEFV(Float,INIT(perturbation_aleatoire_X,FLOT__UNDEF)); \
DEFV(Float,INIT(perturbation_aleatoire_Y,FLOT__UNDEF)); \
DEFV(Float,INIT(perturbation_aleatoire_Z,FLOT__UNDEF)); \
\
EGAL(parametre_D_avant_perturbation \
,LIZ3(parametre_A,solution_X_avant_perturbation \
,parametre_B,solution_Y_avant_perturbation \
,parametre_C,solution_Z_avant_perturbation \
) \
); \
\
RESOLUTION_EQUATION_LINEAIRE_INDETERMINEE_3D__GENERATION_D_UNE_VALEUR_ALEATOIRE(perturbation_aleatoire_X \
,graine_X \
,borne_inferieure_aleatoire_X \
,borne_superieure_aleatoire_X \
); \
RESOLUTION_EQUATION_LINEAIRE_INDETERMINEE_3D__GENERATION_D_UNE_VALEUR_ALEATOIRE(perturbation_aleatoire_Y \
,graine_Y \
,borne_inferieure_aleatoire_Y \
,borne_superieure_aleatoire_Y \
); \
RESOLUTION_EQUATION_LINEAIRE_INDETERMINEE_3D__GENERATION_D_UNE_VALEUR_ALEATOIRE(perturbation_aleatoire_Z \
,graine_Z \
,borne_inferieure_aleatoire_Z \
,borne_superieure_aleatoire_Z \
); \
\
EGAL(solution_X_apres_perturbation \
,ADD2(solution_X_avant_perturbation,perturbation_aleatoire_X) \
); \
EGAL(solution_Y_apres_perturbation \
,ADD2(solution_Y_avant_perturbation,perturbation_aleatoire_Y) \
); \
EGAL(solution_Z_apres_perturbation \
,ADD2(solution_Z_avant_perturbation,perturbation_aleatoire_Z) \
); \
/* Perturbation de la solution {X,Y,Z} courante... */ \
\
Test(I3ET(INCLff(solution_X_apres_perturbation \
,borne_inferieure_effective_X \
,borne_superieure_effective_X \
) \
,INCLff(solution_Y_apres_perturbation \
,borne_inferieure_effective_Y \
,borne_superieure_effective_Y \
) \
,INCLff(solution_Z_apres_perturbation \
,borne_inferieure_effective_Z \
,borne_superieure_effective_Z \
) \
) \
) \
Bblock \
/* Cas ou les trois coordonnees {X,Y,Z} apres perturbation sont compatibles avec les */ \
/* contraintes : */ \
EGAL(parametre_D_apres_perturbation \
,LIZ3(parametre_A,solution_X_apres_perturbation \
,parametre_B,solution_Y_apres_perturbation \
,parametre_C,solution_Z_apres_perturbation \
) \
); \
\
Test(IFLT(SOUA(parametre_D_apres_perturbation,parametre_D) \
,SOUA(parametre_D_avant_perturbation,parametre_D) \
) \
) \
Bblock \
/* Cas ou l'on se rapproche du parametre 'D' : */ \
EGAL(solution_X,solution_X_apres_perturbation); \
EGAL(solution_Y,solution_Y_apres_perturbation); \
EGAL(solution_Z,solution_Z_apres_perturbation); \
/* On garde donc la solution {X,Y,Z} perturbee... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
INCR(nombre_d_iterations,UN); \
Test(IFGT(nombre_d_iterations,nombre_maximal_d_iterations)) \
/* C'est le seul test de convergence... */ \
Bblock \
EGAL(iterer,FAUX); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ETan \
Eblock
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O J E C T I O N Q U E L C O N Q U E : */
/* */
/* */
/* Definition : */
/* */
/* Nous allons definir la projection */
/* d'un point P(Xp,Yp,Zp) quelconque sur */
/* un plan defini par les quatre coefficients */
/* (A,B,C,D) et qui peut etre par exemple */
/* l'ecran, et ce pour un certain observateur */
/* O(Xo,Yo,Zo). */
/* */
/* */
/* Y^ */
/* | P(Xp,Yp,Zp) */
/* | * */
/* | + */
/* | + */
/* o---------> + */
/* / X . + */
/* / |\ + */
/* Z/ | \ + */
/* | \+ */
/* | .\ */
/* | . \ */
/* .*I \ */
/* +\ . */
/* + \ | */
/* + \ | plan A.X+B.Y+C.Z+D=0 */
/* + \ | */
/* + \ | */
/* + \| */
/* * . */
/* O(Xo,Yo,Zo) */
/* */
/* */
/* L'equation de la droite OP est : */
/* */
/* X-Xo Y-Yo Z-Zo */
/* ------- = ------- = ------- */
/* Xp-Xo Yp-Yo Zp-Zo */
/* */
/* L'equation du plan de projection est : */
/* */
/* A.X + B.Y + C.Z + D = 0 */
/* */
/* Posons : */
/* */
/* A.Xo + B.Yo + C.Zo + D */
/* R = ----------------------------------- */
/* A.(Xp-Xo) + B.(Yp-Yo) + C.(Zp-Zo) */
/* */
/* Le point d'intersection I a donc pour coordonnees : */
/* */
/* Xi = Xo - R.(Xp-Xo) */
/* Yi = Yo - R.(Yp-Yo) */
/* Zi = Zo - R.(Zp-Zo) */
/* */
/* ou encore : */
/* */
/* Xi = Xo + (-R).(Xp-Xo) */
/* Yi = Yo + (-R).(Yp-Yo) */
/* Zi = Zo + (-R).(Zp-Zo) */
/* */
/* On notera que si le point 'P' est invisible depuis 'O', */
/* (le point 'P' est derriere l'observateur 'O' par rapport */
/* au plan de projection), le point d'intersection 'I' est */
/* alors en dehors du segment 'OP'. On a donc : */
/* */
/* (-R) > 0 : I E ]O,P] ==> 'P' est visible, */
/* (-R) = 0 : I == O ==> 'P' est indetermine ('O' est dans le plan de projection), */
/* (-R) < 0 : I /E [O,P] ==> 'P' est invisible. */
/* */
/*************************************************************************************************************************************/
#define POINT_A_L_INFINI_INVISIBLE \
F_PETIT_INFINI \
/* Afin de caracteriser les coordonnees d'un point pour lequel (-R) < 0 (invisible). */ \
/* On notera l'utilisation de 'F_PETIT_INFINI' et non pas de 'F_INFINI' afin de permettre */ \
/* des operations ulterieures du type 'F__?DENORMALISE_O?(...)' sans debordement... */
#define POINT_A_L_INFINI_INDETERMINE \
NEGA(POINT_A_L_INFINI_INVISIBLE) \
/* Afin de caracteriser les coordonnees d'un point pour lequel (-R) = 0 (indetermine). */
#define PROJECTION_PLANE_QUELCONQUE(point_d_intersection,point_a_projeter,plan_de_projection,observateur) \
Bblock \
DEFV(Float \
,INIT(parametre \
,NEGA(fDIVZ(LIN3(ASD1(plan_de_projection,pA),ASD1(observateur,x) \
,ASD1(plan_de_projection,pB),ASD1(observateur,y) \
,ASD1(plan_de_projection,pC),ASD1(observateur,z) \
,ASD1(plan_de_projection,pD) \
) \
,LIN3(ASD1(plan_de_projection,pA),SOUS(ASD1(point_a_projeter,x),ASD1(observateur,x)) \
,ASD1(plan_de_projection,pB),SOUS(ASD1(point_a_projeter,y),ASD1(observateur,y)) \
,ASD1(plan_de_projection,pC),SOUS(ASD1(point_a_projeter,z),ASD1(observateur,z)) \
,FZERO \
) \
) \
) \
) \
); \
/* Calcul de l'oppose ('-R') du parametre 'R' ; on notera le 'DIVZ' qui evite les divisions */ \
/* par zero, mais qui en contre-partie donne a 'parametre' une valeur infinie (relativement */ \
/* au type 'Int'), ce qui peut entrainer ensuite des debordements lors de conversions du */ \
/* type flottant --> entier, par exemple dans les fonctions '_?DENORMALISE_O?(...)'. */ \
/* */ \
/* Le 20071201110152 'DIVZ(...)' fut remplace tardivement par 'fDIVZ(...)'... */ \
Test(IZGT(parametre)) \
Bblock \
INITIALISATION_POINT_3D(point_d_intersection \
,LIN1(SOUS(ASD1(point_a_projeter,x),ASD1(observateur,x)) \
,parametre \
,ASD1(observateur,x) \
) \
,LIN1(SOUS(ASD1(point_a_projeter,y),ASD1(observateur,y)) \
,parametre \
,ASD1(observateur,y) \
) \
,LIN1(SOUS(ASD1(point_a_projeter,z),ASD1(observateur,z)) \
,parametre \
,ASD1(observateur,z) \
) \
); \
/* Calcul des coordonnees du point d'intersection dans le cas ou 'P' est visible (-R > 0). */ \
Eblock \
ATes \
Bblock \
Test(IZLT(parametre)) \
Bblock \
INITIALISATION_POINT_3D(point_d_intersection \
,POINT_A_L_INFINI_INVISIBLE \
,POINT_A_L_INFINI_INVISIBLE \
,POINT_A_L_INFINI_INVISIBLE \
); \
/* Calcul des coordonnees du point d'intersection dans le cas ou 'P' est invisible (-R < 0). */ \
Eblock \
ATes \
Bblock \
INITIALISATION_POINT_3D(point_d_intersection \
,POINT_A_L_INFINI_INDETERMINE \
,POINT_A_L_INFINI_INDETERMINE \
,POINT_A_L_INFINI_INDETERMINE \
); \
/* Calcul des coordonnees du point d'intersection dans le cas ou 'P' est indetermine, ce */ \
/* qui veut dire que l'observateur 'O' est dans le plan de projection (-R = 0). */ \
Eblock \
ETes \
Eblock \
ETes \
Eblock \
/* Fonction de projection plane quelconque... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O J E C T I O N P A R A L L E L E D ' U N 4 - E S P A C E V E R S L E 3 - E S P A C E : */
/* */
/* */
/* Definition : */
/* */
/* On definit la projection parallele d'un */
/* point {x1,x2,x3,x4} appartenant a un espace */
/* a 4 dimensions sur un point {X,Y,Z} appartenant */
/* a un espace a 3 dimensions par : */
/* */
/* X = (A .x ) + (A .x ) + (A .x ) + (A .x ) */
/* X1 1 X2 2 X3 3 X4 4 */
/* */
/* Y = (A .x ) + (A .x ) + (A .x ) + (A .x ) */
/* Y1 1 Y2 2 Y3 3 Y4 4 */
/* */
/* Z = (A .x ) + (A .x ) + (A .x ) + (A .x ) */
/* Z1 1 Z2 2 Z3 3 Z4 4 */
/* */
/* la matrice 'A' etant initialisee implicitement */
/* avec les valeurs : */
/* */
/* | 1 0 0 1 | */
/* | 0 1 0 1 | */
/* | 0 0 1 1 | */
/* */
/* qui donnent de bons resultats... */
/* */
/*************************************************************************************************************************************/
#define PROJECTION_PARALLELE_01_4D_3D_X(x1,x2,x3,x4) \
LIZ4(coefficient_de_projection_parallele_01_4D_3D_x1_X,x1 \
,coefficient_de_projection_parallele_01_4D_3D_x2_X,x2 \
,coefficient_de_projection_parallele_01_4D_3D_x3_X,x3 \
,coefficient_de_projection_parallele_01_4D_3D_x4_X,x4 \
) \
/* Definition de la coordonnee 'X' apres projection 4D --> 3D (introduit le 20040331085528). */
#define PROJECTION_PARALLELE_01_4D_3D_Y(x1,x2,x3,x4) \
LIZ4(coefficient_de_projection_parallele_01_4D_3D_x1_Y,x1 \
,coefficient_de_projection_parallele_01_4D_3D_x2_Y,x2 \
,coefficient_de_projection_parallele_01_4D_3D_x3_Y,x3 \
,coefficient_de_projection_parallele_01_4D_3D_x4_Y,x4 \
) \
/* Definition de la coordonnee 'Y' apres projection 4D --> 3D (introduit le 20040331085528). */
#define PROJECTION_PARALLELE_01_4D_3D_Z(x1,x2,x3,x4) \
LIZ4(coefficient_de_projection_parallele_01_4D_3D_x1_Z,x1 \
,coefficient_de_projection_parallele_01_4D_3D_x2_Z,x2 \
,coefficient_de_projection_parallele_01_4D_3D_x3_Z,x3 \
,coefficient_de_projection_parallele_01_4D_3D_x4_Z,x4 \
) \
/* Definition de la coordonnee 'Z' apres projection 4D --> 3D (introduit le 20040331085528). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O J E C T I O N P E R S P E C T I V E D ' U N 4 - E S P A C E V E R S L E 3 - E S P A C E : */
/* */
/* */
/* Definition : */
/* */
/* On definit la projection perspective d'un */
/* point {x1,x2,x3,x4} appartenant a un espace */
/* a 4 dimensions sur un point {X,Y,Z} appartenant */
/* a un espace a 3 dimensions par. La transformation */
/* prespective est calculee au prealable. On definit */
/* donc le coefficient 'R' : */
/* */
/* */
/* A.O1 + B.O2 + C.O3 + D.O4 + E */
/* R = --------------------------------------------------- */
/* A.(x1-O1) + B.(x2-O2) + C.(x3-O3) + D.(x4-O4) + E */
/* */
/* et la transformation prespective : */
/* */
/* x1' = O1 + (-R).(x1-O1) */
/* x2' = O2 + (-R).(x2-O2) */
/* x3' = O3 + (-R).(x3-O3) */
/* x4' = O4 + (-R).(x4-O4) */
/* */
/* {A,B,C,D,E} etant un hyper-plan et */
/* {O1,O2,O3,O4} un hyper-observateur. */
/* */
/* Ceci est inspire de 'v $xrs/HyperCube.11$K' avec */
/* 'CoordonneeCourante' etant ici successivement */
/* {x1',x2',x3',x4'}... */
/* */
/* Et enfin, le point {x1',x2',x3',x4'} fait */
/* ensuite l'objet de la projection paralelle definie */
/* precedemment ('PROJECTION_PARALLELE_01_4D_3D') : */
/* */
/* {x1',x2',x3',x4'} --> {X,Y,Z} */
/* */
/*************************************************************************************************************************************/
#define COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4) \
DIVI(LIN4(plan_de_projection_perspective_01_4D_A,observateur_de_projection_perspective_01_4D_X1 \
,plan_de_projection_perspective_01_4D_B,observateur_de_projection_perspective_01_4D_X2 \
,plan_de_projection_perspective_01_4D_C,observateur_de_projection_perspective_01_4D_X3 \
,plan_de_projection_perspective_01_4D_D,observateur_de_projection_perspective_01_4D_X4 \
,plan_de_projection_perspective_01_4D_E \
) \
,LIN4(plan_de_projection_perspective_01_4D_A,SOUS(x1,observateur_de_projection_perspective_01_4D_X1) \
,plan_de_projection_perspective_01_4D_B,SOUS(x2,observateur_de_projection_perspective_01_4D_X2) \
,plan_de_projection_perspective_01_4D_C,SOUS(x3,observateur_de_projection_perspective_01_4D_X3) \
,plan_de_projection_perspective_01_4D_D,SOUS(x4,observateur_de_projection_perspective_01_4D_X4) \
,plan_de_projection_perspective_01_4D_E \
) \
) \
/* Voir 'v $ximd/operator.1$FON PROJECTION_PLANE_QUELCONQUE' pour la definition du */ \
/* coefficient 'R'... */
#define PROJECTION_PERSPECTIVE_01_4D_3D_X(x1,x2,x3,x4) \
PROJECTION_PARALLELE_01_4D_3D_X(AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x1,observateur_de_projection_perspective_01_4D_X1) \
,observateur_de_projection_perspective_01_4D_X1 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x2,observateur_de_projection_perspective_01_4D_X2) \
,observateur_de_projection_perspective_01_4D_X2 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x3,observateur_de_projection_perspective_01_4D_X3) \
,observateur_de_projection_perspective_01_4D_X3 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x4,observateur_de_projection_perspective_01_4D_X4) \
,observateur_de_projection_perspective_01_4D_X4 \
) \
) \
/* Definition de la coordonnee 'X' apres projection 4D --> 3D (introduit le 20230310103323). */
#define PROJECTION_PERSPECTIVE_01_4D_3D_Y(x1,x2,x3,x4) \
PROJECTION_PARALLELE_01_4D_3D_Y(AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x1,observateur_de_projection_perspective_01_4D_X1) \
,observateur_de_projection_perspective_01_4D_X1 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x2,observateur_de_projection_perspective_01_4D_X2) \
,observateur_de_projection_perspective_01_4D_X2 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x3,observateur_de_projection_perspective_01_4D_X3) \
,observateur_de_projection_perspective_01_4D_X3 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x4,observateur_de_projection_perspective_01_4D_X4) \
,observateur_de_projection_perspective_01_4D_X4 \
) \
) \
/* Definition de la coordonnee 'Y' apres projection 4D --> 3D (introduit le 20230310103323). */
#define PROJECTION_PERSPECTIVE_01_4D_3D_Z(x1,x2,x3,x4) \
PROJECTION_PARALLELE_01_4D_3D_Z(AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x1,observateur_de_projection_perspective_01_4D_X1) \
,observateur_de_projection_perspective_01_4D_X1 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x2,observateur_de_projection_perspective_01_4D_X2) \
,observateur_de_projection_perspective_01_4D_X2 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x3,observateur_de_projection_perspective_01_4D_X3) \
,observateur_de_projection_perspective_01_4D_X3 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_4D_3D_R(x1,x2,x3,x4)) \
,SOUS(x4,observateur_de_projection_perspective_01_4D_X4) \
,observateur_de_projection_perspective_01_4D_X4 \
) \
) \
/* Definition de la coordonnee 'Z' apres projection 4D --> 3D (introduit le 20230310103323). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O J E C T I O N P A R A L L E L E D ' U N 6 - E S P A C E V E R S L E 3 - E S P A C E : */
/* */
/* */
/* Definition : */
/* */
/* On definit la projection parallele d'un */
/* point {x1,x2,x3,x4,x5,x6} appartenant a un espace */
/* a 6 dimensions sur un point {X,Y,Z} appartenant */
/* a un espace a 3 dimensions par : */
/* */
/* X = (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) */
/* X1 1 X2 2 X3 3 X4 4 X5 5 X6 6 */
/* */
/* Y = (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) */
/* Y1 1 Y2 2 Y3 3 Y4 4 Y5 5 Y6 6 */
/* */
/* Z = (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) */
/* Z1 1 Z2 2 Z3 3 Z4 4 Z5 5 Z6 6 */
/* */
/* la matrice 'A' etant initialisee implicitement */
/* avec les valeurs : */
/* */
/* | 1 0 0 1 0 0 | */
/* | 0 1 0 0 1 0 | */
/* | 0 0 1 0 0 1 | */
/* */
/* qui donnent de bons resultats... */
/* */
/*************************************************************************************************************************************/
#define PROJECTION_PARALLELE_01_6D_3D_X(x1,x2,x3,x4,x5,x6) \
LIZ6(coefficient_de_projection_parallele_01_6D_3D_x1_X,x1 \
,coefficient_de_projection_parallele_01_6D_3D_x2_X,x2 \
,coefficient_de_projection_parallele_01_6D_3D_x3_X,x3 \
,coefficient_de_projection_parallele_01_6D_3D_x4_X,x4 \
,coefficient_de_projection_parallele_01_6D_3D_x5_X,x5 \
,coefficient_de_projection_parallele_01_6D_3D_x6_X,x6 \
) \
/* Definition de la coordonnee 'X' apres projection 6D --> 3D (introduit le 20040331085528). */
#define PROJECTION_PARALLELE_01_6D_3D_Y(x1,x2,x3,x4,x5,x6) \
LIZ6(coefficient_de_projection_parallele_01_6D_3D_x1_Y,x1 \
,coefficient_de_projection_parallele_01_6D_3D_x2_Y,x2 \
,coefficient_de_projection_parallele_01_6D_3D_x3_Y,x3 \
,coefficient_de_projection_parallele_01_6D_3D_x4_Y,x4 \
,coefficient_de_projection_parallele_01_6D_3D_x5_Y,x5 \
,coefficient_de_projection_parallele_01_6D_3D_x6_Y,x6 \
) \
/* Definition de la coordonnee 'Y' apres projection 6D --> 3D (introduit le 20040331085528). */
#define PROJECTION_PARALLELE_01_6D_3D_Z(x1,x2,x3,x4,x5,x6) \
LIZ6(coefficient_de_projection_parallele_01_6D_3D_x1_Z,x1 \
,coefficient_de_projection_parallele_01_6D_3D_x2_Z,x2 \
,coefficient_de_projection_parallele_01_6D_3D_x3_Z,x3 \
,coefficient_de_projection_parallele_01_6D_3D_x4_Z,x4 \
,coefficient_de_projection_parallele_01_6D_3D_x5_Z,x5 \
,coefficient_de_projection_parallele_01_6D_3D_x6_Z,x6 \
) \
/* Definition de la coordonnee 'Z' apres projection 6D --> 3D (introduit le 20040331085528). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O J E C T I O N P A R A L L E L E D ' U N 8 - E S P A C E V E R S L E 3 - E S P A C E : */
/* */
/* */
/* Definition : */
/* */
/* On definit la projection parallele d'un */
/* point {x1,x2,x3,x4,x5,x6,x7,x8} appartenant a un espace */
/* a 8 dimensions sur un point {X,Y,Z} appartenant */
/* a un espace a 3 dimensions par : */
/* */
/* X = (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) */
/* X1 1 X2 2 X3 3 X4 4 X5 5 X6 6 X7 7 X8 8 */
/* */
/* Y = (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) */
/* Y1 1 Y2 2 Y3 3 Y4 4 Y5 5 Y6 6 Y7 7 Y8 8 */
/* */
/* Z = (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) + (A .x ) */
/* Z1 1 Z2 2 Z3 3 Z4 4 Z5 5 Z6 6 Z7 7 Z8 8 */
/* */
/* la matrice 'A' etant initialisee implicitement */
/* avec les valeurs : */
/* */
/* | 1 0 0 1 1 0 0 1 | */
/* | 0 1 0 1 0 1 0 1 | */
/* | 0 0 1 1 0 0 1 1 | */
/* */
/* qui donnent de bons resultats... */
/* */
/*************************************************************************************************************************************/
#define PROJECTION_PARALLELE_01_8D_3D_X(x1,x2,x3,x4,x5,x6,x7,x8) \
LIZ8(coefficient_de_projection_parallele_01_8D_3D_x1_X,x1 \
,coefficient_de_projection_parallele_01_8D_3D_x2_X,x2 \
,coefficient_de_projection_parallele_01_8D_3D_x3_X,x3 \
,coefficient_de_projection_parallele_01_8D_3D_x4_X,x4 \
,coefficient_de_projection_parallele_01_8D_3D_x5_X,x5 \
,coefficient_de_projection_parallele_01_8D_3D_x6_X,x6 \
,coefficient_de_projection_parallele_01_8D_3D_x7_X,x7 \
,coefficient_de_projection_parallele_01_8D_3D_x8_X,x8 \
) \
/* Definition de la coordonnee 'X' apres projection 8D --> 3D (introduit le 20230202141425). */
#define PROJECTION_PARALLELE_01_8D_3D_Y(x1,x2,x3,x4,x5,x6,x7,x8) \
LIZ8(coefficient_de_projection_parallele_01_8D_3D_x1_Y,x1 \
,coefficient_de_projection_parallele_01_8D_3D_x2_Y,x2 \
,coefficient_de_projection_parallele_01_8D_3D_x3_Y,x3 \
,coefficient_de_projection_parallele_01_8D_3D_x4_Y,x4 \
,coefficient_de_projection_parallele_01_8D_3D_x5_Y,x5 \
,coefficient_de_projection_parallele_01_8D_3D_x6_Y,x6 \
,coefficient_de_projection_parallele_01_8D_3D_x7_Y,x7 \
,coefficient_de_projection_parallele_01_8D_3D_x8_Y,x8 \
) \
/* Definition de la coordonnee 'Y' apres projection 8D --> 3D (introduit le 20230202141425). */
#define PROJECTION_PARALLELE_01_8D_3D_Z(x1,x2,x3,x4,x5,x6,x7,x8) \
LIZ8(coefficient_de_projection_parallele_01_8D_3D_x1_Z,x1 \
,coefficient_de_projection_parallele_01_8D_3D_x2_Z,x2 \
,coefficient_de_projection_parallele_01_8D_3D_x3_Z,x3 \
,coefficient_de_projection_parallele_01_8D_3D_x4_Z,x4 \
,coefficient_de_projection_parallele_01_8D_3D_x5_Z,x5 \
,coefficient_de_projection_parallele_01_8D_3D_x6_Z,x6 \
,coefficient_de_projection_parallele_01_8D_3D_x7_Z,x7 \
,coefficient_de_projection_parallele_01_8D_3D_x8_Z,x8 \
) \
/* Definition de la coordonnee 'Z' apres projection 8D --> 3D (introduit le 20230202141425). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O J E C T I O N P E R S P E C T I V E D ' U N 8 - E S P A C E V E R S L E 3 - E S P A C E : */
/* */
/* */
/* Definition : */
/* */
/* On definit la projection perspective d'un */
/* point {x1,x2,x3,x4,x5,x6,x7,x8} appartenant a un espace */
/* a 8 dimensions sur un point {X,Y,Z} appartenant */
/* a un espace a 3 dimensions par. La transformation */
/* perspective est calculee au prealable : */
/* */
/* */
/* A.O1 + B.O2 + C.O3 + D.O4 + E.O5 + F.O6 +G.O7 + H.O8 + I */
/* R = --------------------------------------------------------------------------------------------------- */
/* A.(x1-O1) + B.(x2-O2) + C.(x3-O3) + D.(x4-O4) + D.(x5-O5) + D.(x6-O6) + D.(x7-O7) + D.(x8-O8) + I */
/* */
/* */
/* x1' = O1 + (-R).(x1-O1) */
/* x2' = O2 + (-R).(x2-O2) */
/* x3' = O3 + (-R).(x3-O3) */
/* x4' = O4 + (-R).(x4-O4) */
/* x5' = O5 + (-R).(x5-O5) */
/* x6' = O6 + (-R).(x6-O6) */
/* x7' = O7 + (-R).(x7-O7) */
/* x8' = O8 + (-R).(x8-O8) */
/* */
/* {A,B,C,D,E,F,G,H,I} etant un hyper-plan et */
/* {O1,O2,O3,O4,O5,O6,O7,O8} un hyper-observateur. */
/* */
/* Et enfin, le point {x1',x2',x3',x4',x5',x6',x7',x8'} fait */
/* l'objet de la projection paralelle definie */
/* precedemment : */
/* */
/* {x1',x2',x3',x4',x5',x6',x7',x8'} --> {X,Y,Z} */
/* */
/*************************************************************************************************************************************/
#define COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4,x5,x6,x7,x8) \
DIVI(LIN8(plan_de_projection_perspective_01_8D_A,observateur_de_projection_perspective_01_8D_X1 \
,plan_de_projection_perspective_01_8D_B,observateur_de_projection_perspective_01_8D_X2 \
,plan_de_projection_perspective_01_8D_C,observateur_de_projection_perspective_01_8D_X3 \
,plan_de_projection_perspective_01_8D_D,observateur_de_projection_perspective_01_8D_X4 \
,plan_de_projection_perspective_01_8D_E,observateur_de_projection_perspective_01_8D_X5 \
,plan_de_projection_perspective_01_8D_F,observateur_de_projection_perspective_01_8D_X6 \
,plan_de_projection_perspective_01_8D_G,observateur_de_projection_perspective_01_8D_X7 \
,plan_de_projection_perspective_01_8D_H,observateur_de_projection_perspective_01_8D_X8 \
,plan_de_projection_perspective_01_8D_I \
) \
,LIN8(plan_de_projection_perspective_01_8D_A,SOUS(x1,observateur_de_projection_perspective_01_8D_X1) \
,plan_de_projection_perspective_01_8D_B,SOUS(x2,observateur_de_projection_perspective_01_8D_X2) \
,plan_de_projection_perspective_01_8D_C,SOUS(x3,observateur_de_projection_perspective_01_8D_X3) \
,plan_de_projection_perspective_01_8D_D,SOUS(x4,observateur_de_projection_perspective_01_8D_X4) \
,plan_de_projection_perspective_01_8D_E,SOUS(x5,observateur_de_projection_perspective_01_8D_X5) \
,plan_de_projection_perspective_01_8D_F,SOUS(x6,observateur_de_projection_perspective_01_8D_X6) \
,plan_de_projection_perspective_01_8D_G,SOUS(x7,observateur_de_projection_perspective_01_8D_X7) \
,plan_de_projection_perspective_01_8D_H,SOUS(x8,observateur_de_projection_perspective_01_8D_X8) \
,plan_de_projection_perspective_01_8D_I \
) \
) \
/* Voir 'v $ximd/operator.1$FON PROJECTION_PLANE_QUELCONQUE' pour la definition du */ \
/* coefficient 'R'... */
#define PROJECTION_PERSPECTIVE_01_8D_3D_X(x1,x2,x3,x4,x5,x6,x7,x8) \
PROJECTION_PARALLELE_01_8D_3D_X(AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x1,observateur_de_projection_perspective_01_8D_X1) \
,observateur_de_projection_perspective_01_8D_X1 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x2,observateur_de_projection_perspective_01_8D_X2) \
,observateur_de_projection_perspective_01_8D_X2 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x3,observateur_de_projection_perspective_01_8D_X3) \
,observateur_de_projection_perspective_01_8D_X3 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x4,observateur_de_projection_perspective_01_8D_X4) \
,observateur_de_projection_perspective_01_8D_X4 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x5,observateur_de_projection_perspective_01_8D_X5) \
,observateur_de_projection_perspective_01_8D_X5 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x6,observateur_de_projection_perspective_01_8D_X6) \
,observateur_de_projection_perspective_01_8D_X6 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x7,observateur_de_projection_perspective_01_8D_X7) \
,observateur_de_projection_perspective_01_8D_X7 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x8,observateur_de_projection_perspective_01_8D_X8) \
,observateur_de_projection_perspective_01_8D_X8 \
) \
) \
/* Definition de la coordonnee 'X' apres projection 8D --> 3D (introduit le 20230316145048). */
#define PROJECTION_PERSPECTIVE_01_8D_3D_Y(x1,x2,x3,x4,x5,x6,x7,x8) \
PROJECTION_PARALLELE_01_8D_3D_Y(AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x1,observateur_de_projection_perspective_01_8D_X1) \
,observateur_de_projection_perspective_01_8D_X1 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x2,observateur_de_projection_perspective_01_8D_X2) \
,observateur_de_projection_perspective_01_8D_X2 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x3,observateur_de_projection_perspective_01_8D_X3) \
,observateur_de_projection_perspective_01_8D_X3 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x4,observateur_de_projection_perspective_01_8D_X4) \
,observateur_de_projection_perspective_01_8D_X4 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x5,observateur_de_projection_perspective_01_8D_X5) \
,observateur_de_projection_perspective_01_8D_X5 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x6,observateur_de_projection_perspective_01_8D_X6) \
,observateur_de_projection_perspective_01_8D_X6 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x7,observateur_de_projection_perspective_01_8D_X7) \
,observateur_de_projection_perspective_01_8D_X7 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x8,observateur_de_projection_perspective_01_8D_X8) \
,observateur_de_projection_perspective_01_8D_X8 \
) \
) \
/* Definition de la coordonnee 'Y' apres projection 8D --> 3D (introduit le 20230316145048). */
#define PROJECTION_PERSPECTIVE_01_8D_3D_Z(x1,x2,x3,x4,x5,x6,x7,x8) \
PROJECTION_PARALLELE_01_8D_3D_Z(AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x1,observateur_de_projection_perspective_01_8D_X1) \
,observateur_de_projection_perspective_01_8D_X1 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x2,observateur_de_projection_perspective_01_8D_X2) \
,observateur_de_projection_perspective_01_8D_X2 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x3,observateur_de_projection_perspective_01_8D_X3) \
,observateur_de_projection_perspective_01_8D_X3 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x4,observateur_de_projection_perspective_01_8D_X4) \
,observateur_de_projection_perspective_01_8D_X4 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x5,observateur_de_projection_perspective_01_8D_X5) \
,observateur_de_projection_perspective_01_8D_X5 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x6,observateur_de_projection_perspective_01_8D_X6) \
,observateur_de_projection_perspective_01_8D_X6 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x7,observateur_de_projection_perspective_01_8D_X7) \
,observateur_de_projection_perspective_01_8D_X7 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_8D_3D_R(x1,x2,x3,x4 \
,x5,x6,x7,x8 \
) \
) \
,SOUS(x8,observateur_de_projection_perspective_01_8D_X8) \
,observateur_de_projection_perspective_01_8D_X8 \
) \
) \
/* Definition de la coordonnee 'Z' apres projection 8D --> 3D (introduit le 20230316145048). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O J E C T I O N P A R A L L E L E D ' U N 1 6 - E S P A C E V E R S L E 3 - E S P A C E : */
/* */
/* */
/* Definition : */
/* */
/* On definit la projection parallele d'un */
/* point {x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15,x16} appartenant a un espace */
/* a 16 dimensions sur un point {X,Y,Z} appartenant */
/* a un espace a 3 dimensions par : */
/* */
/* X = (A .x ) + (A .x ) + (...) + (A .x ) + (A .x ) */
/* X01 01 X02 02 X15 15 X16 16 */
/* */
/* */
/* Y = (A .x ) + (A .x ) + (...) + (A .x ) + (A .x ) */
/* Y01 01 Y02 02 Y15 15 Y16 16 */
/* */
/* */
/* Z = (A .x ) + (A .x ) + (...) + (A .x ) + (A .x ) */
/* Z01 01 Z02 02 Z15 15 Z16 16 */
/* */
/* la matrice 'A' etant initialisee implicitement */
/* avec les valeurs : */
/* */
/* | 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 | */
/* | 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 | */
/* | 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 | */
/* */
/* qui donnent de bons resultats... */
/* */
/*************************************************************************************************************************************/
#define PROJECTION_PARALLELE_01_16D_3D_X(x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15,x16) \
LIZ16(coefficient_de_projection_parallele_01_16D_3D_x01_X,x01 \
,coefficient_de_projection_parallele_01_16D_3D_x02_X,x02 \
,coefficient_de_projection_parallele_01_16D_3D_x03_X,x03 \
,coefficient_de_projection_parallele_01_16D_3D_x04_X,x04 \
,coefficient_de_projection_parallele_01_16D_3D_x05_X,x05 \
,coefficient_de_projection_parallele_01_16D_3D_x06_X,x06 \
,coefficient_de_projection_parallele_01_16D_3D_x07_X,x07 \
,coefficient_de_projection_parallele_01_16D_3D_x08_X,x08 \
,coefficient_de_projection_parallele_01_16D_3D_x09_X,x09 \
,coefficient_de_projection_parallele_01_16D_3D_x10_X,x10 \
,coefficient_de_projection_parallele_01_16D_3D_x11_X,x11 \
,coefficient_de_projection_parallele_01_16D_3D_x12_X,x12 \
,coefficient_de_projection_parallele_01_16D_3D_x13_X,x13 \
,coefficient_de_projection_parallele_01_16D_3D_x14_X,x14 \
,coefficient_de_projection_parallele_01_16D_3D_x15_X,x15 \
,coefficient_de_projection_parallele_01_16D_3D_x16_X,x16 \
) \
/* Definition de la coordonnee 'X' apres projection 16D --> 3D, introduit le 20230226095722. */
#define PROJECTION_PARALLELE_01_16D_3D_Y(x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15,x16) \
LIZ16(coefficient_de_projection_parallele_01_16D_3D_x01_Y,x01 \
,coefficient_de_projection_parallele_01_16D_3D_x02_Y,x02 \
,coefficient_de_projection_parallele_01_16D_3D_x03_Y,x03 \
,coefficient_de_projection_parallele_01_16D_3D_x04_Y,x04 \
,coefficient_de_projection_parallele_01_16D_3D_x05_Y,x05 \
,coefficient_de_projection_parallele_01_16D_3D_x06_Y,x06 \
,coefficient_de_projection_parallele_01_16D_3D_x07_Y,x07 \
,coefficient_de_projection_parallele_01_16D_3D_x08_Y,x08 \
,coefficient_de_projection_parallele_01_16D_3D_x09_Y,x09 \
,coefficient_de_projection_parallele_01_16D_3D_x10_Y,x10 \
,coefficient_de_projection_parallele_01_16D_3D_x11_Y,x11 \
,coefficient_de_projection_parallele_01_16D_3D_x12_Y,x12 \
,coefficient_de_projection_parallele_01_16D_3D_x13_Y,x13 \
,coefficient_de_projection_parallele_01_16D_3D_x14_Y,x14 \
,coefficient_de_projection_parallele_01_16D_3D_x15_Y,x15 \
,coefficient_de_projection_parallele_01_16D_3D_x16_Y,x16 \
) \
/* Definition de la coordonnee 'Y' apres projection 16D --> 3D, introduit le 20230226095722. */
#define PROJECTION_PARALLELE_01_16D_3D_Z(x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15,x16) \
LIZ16(coefficient_de_projection_parallele_01_16D_3D_x01_Z,x01 \
,coefficient_de_projection_parallele_01_16D_3D_x02_Z,x02 \
,coefficient_de_projection_parallele_01_16D_3D_x03_Z,x03 \
,coefficient_de_projection_parallele_01_16D_3D_x04_Z,x04 \
,coefficient_de_projection_parallele_01_16D_3D_x05_Z,x05 \
,coefficient_de_projection_parallele_01_16D_3D_x06_Z,x06 \
,coefficient_de_projection_parallele_01_16D_3D_x07_Z,x07 \
,coefficient_de_projection_parallele_01_16D_3D_x08_Z,x08 \
,coefficient_de_projection_parallele_01_16D_3D_x09_Z,x09 \
,coefficient_de_projection_parallele_01_16D_3D_x10_Z,x10 \
,coefficient_de_projection_parallele_01_16D_3D_x11_Z,x11 \
,coefficient_de_projection_parallele_01_16D_3D_x12_Z,x12 \
,coefficient_de_projection_parallele_01_16D_3D_x13_Z,x13 \
,coefficient_de_projection_parallele_01_16D_3D_x14_Z,x14 \
,coefficient_de_projection_parallele_01_16D_3D_x15_Z,x15 \
,coefficient_de_projection_parallele_01_16D_3D_x16_Z,x16 \
) \
/* Definition de la coordonnee 'Z' apres projection 16D --> 3D, introduit le 20230226095722. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O J E C T I O N P E R S P E C T I V E D ' U N 1 6 - E S P A C E V E R S L E 3 - E S P A C E : */
/* */
/* */
/* Definition : */
/* */
/* On definit la projection perspective d'un */
/* point {x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15,x16} appartenant a un espace */
/* a 16 dimensions sur un point {X,Y,Z} appartenant */
/* a un espace a 3 dimensions par. Cette projection est */
/* tout a fait identique a celle definie pour un */
/* espace a 16 dimensions... */
/* */
/*************************************************************************************************************************************/
#define COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x15,x14,x16) \
DIVI(LIN16(plan_de_projection_perspective_01_16D_A,observateur_de_projection_perspective_01_16D_X01 \
,plan_de_projection_perspective_01_16D_B,observateur_de_projection_perspective_01_16D_X02 \
,plan_de_projection_perspective_01_16D_C,observateur_de_projection_perspective_01_16D_X03 \
,plan_de_projection_perspective_01_16D_D,observateur_de_projection_perspective_01_16D_X04 \
,plan_de_projection_perspective_01_16D_E,observateur_de_projection_perspective_01_16D_X05 \
,plan_de_projection_perspective_01_16D_F,observateur_de_projection_perspective_01_16D_X06 \
,plan_de_projection_perspective_01_16D_G,observateur_de_projection_perspective_01_16D_X07 \
,plan_de_projection_perspective_01_16D_H,observateur_de_projection_perspective_01_16D_X08 \
,plan_de_projection_perspective_01_16D_I,observateur_de_projection_perspective_01_16D_X09 \
,plan_de_projection_perspective_01_16D_J,observateur_de_projection_perspective_01_16D_X10 \
,plan_de_projection_perspective_01_16D_K,observateur_de_projection_perspective_01_16D_X11 \
,plan_de_projection_perspective_01_16D_L,observateur_de_projection_perspective_01_16D_X12 \
,plan_de_projection_perspective_01_16D_M,observateur_de_projection_perspective_01_16D_X13 \
,plan_de_projection_perspective_01_16D_N,observateur_de_projection_perspective_01_16D_X14 \
,plan_de_projection_perspective_01_16D_O,observateur_de_projection_perspective_01_16D_X15 \
,plan_de_projection_perspective_01_16D_P,observateur_de_projection_perspective_01_16D_X16 \
,plan_de_projection_perspective_01_16D_Q \
) \
,LIN16(plan_de_projection_perspective_01_16D_A,SOUS(x01,observateur_de_projection_perspective_01_16D_X01) \
,plan_de_projection_perspective_01_16D_B,SOUS(x02,observateur_de_projection_perspective_01_16D_X02) \
,plan_de_projection_perspective_01_16D_C,SOUS(x03,observateur_de_projection_perspective_01_16D_X03) \
,plan_de_projection_perspective_01_16D_D,SOUS(x04,observateur_de_projection_perspective_01_16D_X04) \
,plan_de_projection_perspective_01_16D_E,SOUS(x05,observateur_de_projection_perspective_01_16D_X05) \
,plan_de_projection_perspective_01_16D_F,SOUS(x06,observateur_de_projection_perspective_01_16D_X06) \
,plan_de_projection_perspective_01_16D_G,SOUS(x07,observateur_de_projection_perspective_01_16D_X07) \
,plan_de_projection_perspective_01_16D_H,SOUS(x08,observateur_de_projection_perspective_01_16D_X08) \
,plan_de_projection_perspective_01_16D_I,SOUS(x09,observateur_de_projection_perspective_01_16D_X09) \
,plan_de_projection_perspective_01_16D_J,SOUS(x10,observateur_de_projection_perspective_01_16D_X10) \
,plan_de_projection_perspective_01_16D_K,SOUS(x11,observateur_de_projection_perspective_01_16D_X11) \
,plan_de_projection_perspective_01_16D_L,SOUS(x12,observateur_de_projection_perspective_01_16D_X12) \
,plan_de_projection_perspective_01_16D_M,SOUS(x13,observateur_de_projection_perspective_01_16D_X13) \
,plan_de_projection_perspective_01_16D_N,SOUS(x14,observateur_de_projection_perspective_01_16D_X14) \
,plan_de_projection_perspective_01_16D_O,SOUS(x15,observateur_de_projection_perspective_01_16D_X15) \
,plan_de_projection_perspective_01_16D_P,SOUS(x16,observateur_de_projection_perspective_01_16D_X16) \
,plan_de_projection_perspective_01_16D_Q \
) \
) \
/* Voir 'v $ximd/operator.1$FON PROJECTION_PLANE_QUELCONQUE' pour la definition du */ \
/* coefficient 'R'... */
#define PROJECTION_PERSPECTIVE_01_16D_3D_X(x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x15,x14,x16) \
PROJECTION_PARALLELE_01_16D_3D_X(AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x01,observateur_de_projection_perspective_01_16D_X01) \
,observateur_de_projection_perspective_01_16D_X01 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x02,observateur_de_projection_perspective_01_16D_X02) \
,observateur_de_projection_perspective_01_16D_X02 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x03,observateur_de_projection_perspective_01_16D_X03) \
,observateur_de_projection_perspective_01_16D_X03 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x04,observateur_de_projection_perspective_01_16D_X04) \
,observateur_de_projection_perspective_01_16D_X04 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x05,observateur_de_projection_perspective_01_16D_X05) \
,observateur_de_projection_perspective_01_16D_X05 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x06,observateur_de_projection_perspective_01_16D_X06) \
,observateur_de_projection_perspective_01_16D_X06 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x07,observateur_de_projection_perspective_01_16D_X07) \
,observateur_de_projection_perspective_01_16D_X07 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x08,observateur_de_projection_perspective_01_16D_X08) \
,observateur_de_projection_perspective_01_16D_X08 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x09,observateur_de_projection_perspective_01_16D_X09) \
,observateur_de_projection_perspective_01_16D_X09 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x10,observateur_de_projection_perspective_01_16D_X10) \
,observateur_de_projection_perspective_01_16D_X10 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x11,observateur_de_projection_perspective_01_16D_X11) \
,observateur_de_projection_perspective_01_16D_X11 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x12,observateur_de_projection_perspective_01_16D_X12) \
,observateur_de_projection_perspective_01_16D_X12 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x13,observateur_de_projection_perspective_01_16D_X13) \
,observateur_de_projection_perspective_01_16D_X13 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x14,observateur_de_projection_perspective_01_16D_X14) \
,observateur_de_projection_perspective_01_16D_X14 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x15,observateur_de_projection_perspective_01_16D_X15) \
,observateur_de_projection_perspective_01_16D_X15 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x16,observateur_de_projection_perspective_01_16D_X16) \
,observateur_de_projection_perspective_01_16D_X16 \
) \
) \
/* Definition de la coordonnee 'X' apres projection 16D --> 3D (introduit le */
/* 20230316145048). */
#define PROJECTION_PERSPECTIVE_01_16D_3D_Y(x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x15,x14,x16) \
PROJECTION_PARALLELE_01_16D_3D_Y(AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x01,observateur_de_projection_perspective_01_16D_X01) \
,observateur_de_projection_perspective_01_16D_X01 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x02,observateur_de_projection_perspective_01_16D_X02) \
,observateur_de_projection_perspective_01_16D_X02 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x03,observateur_de_projection_perspective_01_16D_X03) \
,observateur_de_projection_perspective_01_16D_X03 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x04,observateur_de_projection_perspective_01_16D_X04) \
,observateur_de_projection_perspective_01_16D_X04 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x05,observateur_de_projection_perspective_01_16D_X05) \
,observateur_de_projection_perspective_01_16D_X05 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x06,observateur_de_projection_perspective_01_16D_X06) \
,observateur_de_projection_perspective_01_16D_X06 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x07,observateur_de_projection_perspective_01_16D_X07) \
,observateur_de_projection_perspective_01_16D_X07 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x08,observateur_de_projection_perspective_01_16D_X08) \
,observateur_de_projection_perspective_01_16D_X08 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x09,observateur_de_projection_perspective_01_16D_X09) \
,observateur_de_projection_perspective_01_16D_X09 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x10,observateur_de_projection_perspective_01_16D_X10) \
,observateur_de_projection_perspective_01_16D_X10 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x11,observateur_de_projection_perspective_01_16D_X11) \
,observateur_de_projection_perspective_01_16D_X11 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x12,observateur_de_projection_perspective_01_16D_X12) \
,observateur_de_projection_perspective_01_16D_X12 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x13,observateur_de_projection_perspective_01_16D_X13) \
,observateur_de_projection_perspective_01_16D_X13 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x14,observateur_de_projection_perspective_01_16D_X14) \
,observateur_de_projection_perspective_01_16D_X14 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x15,observateur_de_projection_perspective_01_16D_X15) \
,observateur_de_projection_perspective_01_16D_X15 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x16,observateur_de_projection_perspective_01_16D_X16) \
,observateur_de_projection_perspective_01_16D_X16 \
) \
) \
/* Definition de la coordonnee 'Y' apres projection 16D --> 3D (introduit le */
/* 20230316145048). */
#define PROJECTION_PERSPECTIVE_01_16D_3D_Z(x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15,x16) \
PROJECTION_PARALLELE_01_16D_3D_Z(AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x01,observateur_de_projection_perspective_01_16D_X01) \
,observateur_de_projection_perspective_01_16D_X01 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x02,observateur_de_projection_perspective_01_16D_X02) \
,observateur_de_projection_perspective_01_16D_X02 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x03,observateur_de_projection_perspective_01_16D_X03) \
,observateur_de_projection_perspective_01_16D_X03 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x04,observateur_de_projection_perspective_01_16D_X04) \
,observateur_de_projection_perspective_01_16D_X04 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x05,observateur_de_projection_perspective_01_16D_X05) \
,observateur_de_projection_perspective_01_16D_X05 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x06,observateur_de_projection_perspective_01_16D_X06) \
,observateur_de_projection_perspective_01_16D_X06 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x07,observateur_de_projection_perspective_01_16D_X07) \
,observateur_de_projection_perspective_01_16D_X07 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x08,observateur_de_projection_perspective_01_16D_X08) \
,observateur_de_projection_perspective_01_16D_X08 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x09,observateur_de_projection_perspective_01_16D_X09) \
,observateur_de_projection_perspective_01_16D_X09 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x10,observateur_de_projection_perspective_01_16D_X10) \
,observateur_de_projection_perspective_01_16D_X10 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x11,observateur_de_projection_perspective_01_16D_X11) \
,observateur_de_projection_perspective_01_16D_X11 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x12,observateur_de_projection_perspective_01_16D_X12) \
,observateur_de_projection_perspective_01_16D_X12 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x13,observateur_de_projection_perspective_01_16D_X13) \
,observateur_de_projection_perspective_01_16D_X13 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x14,observateur_de_projection_perspective_01_16D_X14) \
,observateur_de_projection_perspective_01_16D_X14 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x15,observateur_de_projection_perspective_01_16D_X15) \
,observateur_de_projection_perspective_01_16D_X15 \
) \
,AXPB(NEGA(COEFFICIENT_DE_PROJECTION_PERSPECTIVE_01_16D_3D_R(x01,x02,x03,x04 \
,x05,x06,x07,x08 \
,x09,x10,x11,x12 \
,x13,x14,x15,x16 \
) \
) \
,SOUS(x16,observateur_de_projection_perspective_01_16D_X16) \
,observateur_de_projection_perspective_01_16D_X16 \
) \
) \
/* Definition de la coordonnee 'Z' apres projection 16D --> 3D (introduit le */
/* 20230316145048). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D E P O L Y N O M E S A U N E V A R I A B L E */
/* P A R L A M E T H O D E D E H O R N E R : */
/* */
/* */
/* Definitions : */
/* */
/* Les differentes procedures s'appeleront */
/* 'HORNER_v_0n(...)' ou 'v' designe le nombre */
/* de variables (v=1,2,3,4,...) et 'n' le degre */
/* maximal relatif a chaque variable (n=1,2,3,...) */
/* -et non pas le degre maximal des differents */
/* produits des variables-. */
/* */
/*************************************************************************************************************************************/
_____define(GenOperator_PASSE_D_____HORNER_1_nn,++D++-define $1(x,$3,a0) \
-_-_-_- AXPB($2(x,$3),x,a0)++F++
)
/* Procedure de generation automatique des 'HORNER_??(...)' introduite le 20070907132158... */
/* */
/* Jusqu'au 20070913145427, on trouvait ci-dessus : */
/* */
/* #define NomOperateur_____HORNER \ */
/* HORNER */
/* #define GenereOperateur_____HORNER_NN(NN,NN_1,Liste_NN) \ */
/* &define NomOperateur_____HORNER`NN(x,Liste_NN,a0) \ */
/* AXPB(NomOperateur_____HORNER`NN_1(x,Liste_NN),x,a0) */
/* */
/* mais il est preferable que le nom complet des operateurs (par exemple 'HORNER_01') */
/* apparaissent explicitement (a cause de 'v $xi/DICO_define$Z' en particulier...). Les */
/* definitions subsistent en '$PASSE_4' malgre tout puisque cela marche ainsi... */
/* */
/* Le 20070913153802 le nom 'GenereOperateur_____HORNER_NN(...)' fut change en */
/* 'GenOperator_P_4_____HORNER_nn(...)' afin de contenir la passe '$PASSE_4' de generation, */
/* ce qui est utile dans 'v $xi/DICO$D/GenOperator$vv$sub GenOperator_P_._____'. */
/* */
/* Le 20071002090755 le nom 'GenOperator_P_4_____HORNER_nn(...)' fut change en */
/* 'GenOperator_P_4_____HORNER_1_nn(...)'... */
/* */
/* Le 20071003154549 le nom 'GenOperator_P_4_____HORNER_1_nn(...)' a ete change en */
/* 'GenOperator_PASSE_4_____HORNER_1_nn(...)' pour une meilleure lisibilite... */
/* */
/* Le 20071004150158 'Liste_nn' a ete rebaptise 'Liste_nn_sans_a0' plus logique... */
/* */
/* Jusqu'au 20071030114605, on trouvait ci-dessus : */
/* */
/* #define GenOperator_PASSE_4_____HORNER_1_nn(HORNER_1_nn, \ */
/* ,HORNER_1_nn_1 \ */
/* ,Liste_nn_sans_a0 \ */
/* ) \ */
/* &define HORNER_1_nn(x,Liste_nn_sans_a0,a0) \ */
/* AXPB(HORNER_1_nn_1(x,Liste_nn_sans_a0),x,a0) */
/* */
/* mais l'utilisation de '$PASSE_4' etait incompatible avec le 'GooF', d'ou cette */
/* nouvelle definition avec la signification suivante des arguments de l'operateur */
/* 'GenOperator.PASSE.D.....HORNER_1_nn(...)' : */
/* */
/* $1 : nom de l'operateur 'HORNER_1_??' a definir (de rang 'n'), */
/* $2 : nom de l'operateur 'HORNER_1_??' a utiliser (de rang 'n-1'), */
/* $3 : liste d'arguments sans le 'a0' (nombre variables d'elements), */
/* */
/* ATTENTION : l'absence de "," apres 'GenOperator.PASSE.D.....HORNER_1_nn' donne a priori */
/* a 'GenOperator.PASSE.D.....HORNER_1_nn' une valeur vide. Or cela fait partie de mon */
/* modele de programmation. La modification 'v $xcc/cpp$Z 20070912133816' est destinee */
/* justement a deplacer la "," de debut de ligne pour la mettre a la fin de la ligne */
/* precedente et ainsi donner a 'GenOperator.PASSE.D.....HORNER_1_nn' la bonne definition... */
/* */
/* Le 20071030120852, il y a eu passage de '$PASSE_1' a '$PASSE_D' qui ouvre plus de */
/* portes... */
/* */
/* On notera la presence des "."s au lieu des "_"s dans les commentaires relatifs a cet */
/* operateur : cela est destine a bloquer l'action de '$m4' dans ces commentaires... */
-define HORNER_1_00(x,a0) \
-_-_-_- NEUT(a0)
GenOperator_PASSE_D_____HORNER_1_nn(HORNER_1_01,HORNER_1_00,++D++a1++F++)
GenOperator_PASSE_D_____HORNER_1_nn(HORNER_1_02,HORNER_1_01,++D++a2,a1++F++)
GenOperator_PASSE_D_____HORNER_1_nn(HORNER_1_03,HORNER_1_02,++D++a3,a2,a1++F++)
GenOperator_PASSE_D_____HORNER_1_nn(HORNER_1_04,HORNER_1_03,++D++a4,a3,a2,a1++F++)
GenOperator_PASSE_D_____HORNER_1_nn(HORNER_1_05,HORNER_1_04,++D++a5,a4,a3,a2,a1++F++)
GenOperator_PASSE_D_____HORNER_1_nn(HORNER_1_06,HORNER_1_05,++D++a6,a5,a4,a3,a2,a1++F++)
GenOperator_PASSE_D_____HORNER_1_nn(HORNER_1_07,HORNER_1_06,++D++a7,a6,a5,a4,a3,a2,a1++F++)
GenOperator_PASSE_D_____HORNER_1_nn(HORNER_1_08,HORNER_1_07,++D++a8,a7,a6,a5,a4,a3,a2,a1++F++)
GenOperator_PASSE_D_____HORNER_1_nn(HORNER_1_09,HORNER_1_08,++D++a9,a8,a7,a6,a5,a4,a3,a2,a1++F++)
/* Definition recursive des polynomes de degre 0 a 9. Les procedures sont du type : */
/* */
/* HORNER_1_00(x,a0) */
/* HORNER_1_01(x,a1,a0) */
/* HORNER_1_02(x,a2,a1,a0) */
/* HORNER_1_03(x,a3,a2,a1,a0) */
/* HORNER_1_04(x,a4,a3,a2,a1,a0) */
/* HORNER_1_05(x,a5,a4,a3,a2,a1,a0) */
/* HORNER_1_06(x,a6,a5,a4,a3,a2,a1,a0) */
/* HORNER_1_07(x,a7,a6,a5,a4,a3,a2,a1,a0) */
/* HORNER_1_08(x,a8,a7,a6,a5,a4,a3,a2,a1,a0) */
/* HORNER_1_09(x,a9,a8,a7,a6,a5,a4,a3,a2,a1,a0) */
/* */
/* en notant bien que la liste des coefficients est dans l'ordre des puissances */
/* decroissantes (de 9 a 0 dans le cas de 'HORNER_1_09(...)'). */
/* */
/* Le 20070905104756, afin de prevoir des extensions dans un futur plus ou moins proche, */
/* les procedures 'HORNER?(...)' ont ete rebaptisees 'HORNER0?(...)', ce qui permettra */
/* donc de definir le degre 10 et au dela... */
/* */
/* Le 20070907130046, afin de prevoir une generation automatique des 'HORNER0?(...)'s, */
/* ces procedures ont ete rebaptisees (encore...) en 'HORNER_0?(...)'. Cette generation */
/* automatique fut introduite le 20070907132158... */
/* */
/* Le 20071001143616, afin de prevoir des extensions dans un futur plus ou moins proche, les */
/* procedures 'HORNER_0?(...)' ont ete rebaptisees (de nouveau...) en 'HORNER_1_0?(...)'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D E P O L Y N O M E S A D E U X V A R I A B L E S */
/* P A R L A M E T H O D E D E H O R N E R : */
/* */
/* */
/* Definitions : */
/* */
/* Les differentes procedures s'appeleront */
/* 'HORNER_v_0n(...)' ou 'v' designe le nombre */
/* de variables (v=1,2,3,4,...) et 'n' le degre */
/* maximal relatif a chaque variable (n=1,2,3,...) */
/* -et non pas le degre maximal des differents */
/* produits des variables-. */
/* */
/* */
/* Notations : */
/* */
/* Les polynomes sont definis */
/* matriciellement de la facon */
/* suivante : */
/* */
/* */
/* | m | m-1 | m-2 | | 2 | 1 | 0 */
/* | x | x | x | (...) | x | x | x */
/* ---------+---------+---------+---------+---------+---------+---------+---------- */
/* n | | | | | | | */
/* y | a | a | a | (...) | a | a | a */
/* | n,m | n,m-1 | n,m-2 | | n,2 | n,1 | n,0 */
/* ---------+---------+---------+---------+---------+---------+---------+---------- */
/* n-1 | | | | | | | */
/* y | a | a | a | (...) | a | a | a */
/* | n-1,m | n-1,m-1| n-1,m-2| | n-1,2 | n-1,1 | n-1,0 */
/* ---------+---------+---------+---------+---------+---------+---------+---------- */
/* | | | | | | | */
/* (...) | (...) | (...) | (...) | (...) | (...) | (...) | (...) */
/* | | | | | | | */
/* ---------+---------+---------+---------+---------+---------+---------+---------- */
/* 1 | | | | | | | */
/* y | a | a | a | (...) | a | a | a */
/* | 1,m | 1,m-1 | 1,m-2 | | 1,2 | 1,1 | 1,0 */
/* ---------+---------+---------+---------+---------+---------+---------+---------- */
/* 0 | | | | | | | */
/* y | a | a | a | (...) | a | a | a */
/* | 0,m | 0,m-1 | 0,m-2 | | 0,2 | 0,1 | 0,0 */
/* */
/* */
/* soit les polynomes : */
/* */
/* m m-1 0 n n-1 0 */
/* P(x,y) = (a .x + a .x + ... + a .x ).y + (...).y + (...) + (...).y */
/* n,m n,m-1 n,0 */
/* */
/* | | ^ ^ */
/* | |__| | */
/* |______________________________________| */
/* */
/*************************************************************************************************************************************/
#define HORNER_2_01(x,y,a11,a10,a01,a00) \
HORNER_1_01(y \
,HORNER_1_01(x,a11,a10) \
,HORNER_1_01(x,a01,a00) \
)
#define HORNER_2_02(x,y,a22,a21,a20,a12,a11,a10,a02,a01,a00) \
HORNER_1_02(y \
,HORNER_1_02(x,a22,a21,a20) \
,HORNER_1_02(x,a12,a11,a10) \
,HORNER_1_02(x,a02,a01,a00) \
)
#define HORNER_2_03(x,y,a33,a32,a31,a30,a23,a22,a21,a20,a13,a12,a11,a10,a03,a02,a01,a00) \
HORNER_1_03(y \
,HORNER_1_03(x,a33,a32,a31,a30) \
,HORNER_1_03(x,a23,a22,a21,a20) \
,HORNER_1_03(x,a13,a12,a11,a10) \
,HORNER_1_03(x,a03,a02,a01,a00) \
)
/* Les procedures 'HORNER_2_01(...)', 'HORNER_2_02(...)' et 'HORNER_2_03(...)' furent */
/* introduites le 20071001144554... */
#define HORNER_2_04(x,y,a44,a43,a42,a41,a40,a34,a33,a32,a31,a30,a24,a23,a22,a21,a20,a14,a13,a12,a11,a10,a04,a03,a02,a01,a00) \
HORNER_1_04(y \
,HORNER_1_04(x,a44,a43,a42,a41,a40) \
,HORNER_1_04(x,a34,a33,a32,a31,a30) \
,HORNER_1_04(x,a24,a23,a22,a21,a20) \
,HORNER_1_04(x,a14,a13,a12,a11,a10) \
,HORNER_1_04(x,a04,a03,a02,a01,a00) \
) \
/* La procedure 'HORNER_2_04(...)' a ete introduite le 20071002095954... */
/* */
/* Voir le 20181119121510 la validation 'v $xiii/tri_image$FON 20181119120731' de cette */
/* procedure 'HORNER_2_04(...)'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D E P O L Y N O M E S A T R O I S V A R I A B L E S */
/* P A R L A M E T H O D E D E H O R N E R : */
/* */
/* */
/* Definitions : */
/* */
/* Les differentes procedures s'appeleront */
/* 'HORNER_v_0n(...)' ou 'v' designe le nombre */
/* de variables (v=1,2,3,4,...) et 'n' le degre */
/* maximal relatif a chaque variable (n=1,2,3,...) */
/* -et non pas le degre maximal des differents */
/* produits des variables-. */
/* */
/* */
/* Notations : */
/* */
/* Les polynomes sont definis de */
/* la facon suivante : */
/* */
/* m m-1 0 n n-1 p */
/* P(x,y,z) = [(a .x + a .x + ... + a .x ).y + (...).y + (...)].z + (...) */
/* p,n,m p,n,m-1 p,n,0 */
/* */
/* | | | ^ ^ ^ */
/* | | |__| | | */
/* | |__________________________________________| | */
/* |_____________________________________________________________________| */
/* */
/* */
/* Ainsi, par exemple, on notera le 20171020182529 */
/* que 'HORNER_3_01(x,y,z,...)' est bien : */
/* */
/* (((((a111*x)+a110)*y)+((a101*x)+a100))*z)+((((a011*x)+a010)*y)+((a001*x)+a000)) */
/* */
/* ou bien encore : */
/* */
/* ([({(a111*x)+a110}*y)+{(a101*x)+a100}]*z)+[({(a011*x)+a010}*y)+{(a001*x)+a000}] */
/* */
/* ||||| | | | || | || | |||| | | | || | || */
/* |||| ------ | | | ------ || | ||| ------ | | | ------ || */
/* |||| | | | || | ||| | | | || */
/* ||| ------------- | ------------- | | || ------------- | ------------- | */
/* ||| | | | || | | */
/* || ----------------- | | | ----------------- | */
/* || | | | | */
/* | ----------------------------------- | | | */
/* | | | | */
/* --------------------------------------- ----------------------------------- */
/* */
/* */
/* et pour faire, par exemple, la somme 'x+y+z', on */
/* choisira : */
/* */
/* a111=0 */
/* a110=0 */
/* a101=0 */
/* a100=1 --> z */
/* */
/* a011=0 */
/* a010=1 --> y */
/* */
/* a001=1 --> x */
/* */
/* a000=0 */
/* */
/*************************************************************************************************************************************/
#define HORNER_3_01(x,y,z \
,a111,a110,a101,a100 \
,a011,a010,a001,a000 \
) \
HORNER_1_01(z \
,HORNER_2_01(x,y,a111,a110,a101,a100) \
,HORNER_2_01(x,y,a011,a010,a001,a000) \
)
#define HORNER_3_02(x,y,z \
,a222,a221,a220,a212,a211,a210,a202,a201,a200 \
,a122,a121,a120,a112,a111,a110,a102,a101,a100 \
,a022,a021,a020,a012,a011,a010,a002,a001,a000 \
) \
HORNER_1_02(z \
,HORNER_2_02(x,y,a222,a221,a220,a212,a211,a210,a202,a201,a200) \
,HORNER_2_02(x,y,a122,a121,a120,a112,a111,a110,a102,a101,a100) \
,HORNER_2_02(x,y,a022,a021,a020,a012,a011,a010,a002,a001,a000) \
)
#define HORNER_3_03(x,y,z \
,a333,a332,a331,a330,a323,a322,a321,a320,a313,a312,a311,a310,a303,a302,a301,a300 \
,a233,a232,a231,a230,a223,a222,a221,a220,a213,a212,a211,a210,a203,a202,a201,a200 \
,a133,a132,a131,a130,a123,a122,a121,a120,a113,a112,a111,a110,a103,a102,a101,a100 \
,a033,a032,a031,a030,a023,a022,a021,a020,a013,a012,a011,a010,a003,a002,a001,a000 \
) \
HORNER_1_03(z \
,HORNER_2_03(x,y,a333,a332,a331,a330,a323,a322,a321,a320,a313,a312,a311,a310,a303,a302,a301,a300) \
,HORNER_2_03(x,y,a233,a232,a231,a230,a223,a222,a221,a220,a213,a212,a211,a210,a203,a202,a201,a200) \
,HORNER_2_03(x,y,a133,a132,a131,a130,a123,a122,a121,a120,a113,a112,a111,a110,a103,a102,a101,a100) \
,HORNER_2_03(x,y,a033,a032,a031,a030,a023,a022,a021,a020,a013,a012,a011,a010,a003,a002,a001,a000) \
)
/* Les procedures 'HORNER_3_01(...)', 'HORNER_3_02(...)' et 'HORNER_3_03(...)' furent */
/* introduites le 20071026112951... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D E P O L Y N O M E S A Q U A T R E V A R I A B L E S */
/* P A R L A M E T H O D E D E H O R N E R : */
/* */
/* */
/* Definitions : */
/* */
/* Les differentes procedures s'appeleront */
/* 'HORNER_v_0n(...)' ou 'v' designe le nombre */
/* de variables (v=1,2,3,4,...) et 'n' le degre */
/* maximal relatif a chaque variable (n=1,2,3,...) */
/* -et non pas le degre maximal des differents */
/* produits des variables-. */
/* */
/* */
/* Notations : */
/* */
/* Les polynomes sont definis de */
/* la facon suivante : */
/* */
/* m m-1 0 n n-1 p q */
/* P(x,y,z,t) = {[(a .x + a .x + ... + a .x ).y + (...).y + (...)].z + (...)}.t + (...) */
/* q,p,n,m q,p,n,m-1 q,p,n,0 */
/* */
/* | | | | ^ ^ ^ ^ */
/* | | | |__| | | | */
/* | | |______________________________________________| | | */
/* | |_________________________________________________________________________| | */
/* |_______________________________________________________________________________________| */
/* */
/* */
/* On notera le 20181210122013 */
/* que 'HORNER_4_01(x,y,z,t,...)' est bien : */
/* */
/* {([aF*x+aE]*y+aD*x+aC)*z+({aB*x+aA}*y+a9*x+a8)}*t+([a7*x+a6]*y+a5*x+a4)*z+([a3*x+a2]*y+a1*x+a0) */
/* ||| | | || | || || | | || | | */
/* || ------- | | ------- || | ------- | | ------- | */
/* | ------------------- ------------------- | ------------------- ------------------- */
/* --------------------------------------------- */
/* */
/* et ce en utilisant un codage hexa-decimal des */
/* differents coefficients (pour des raisons liees */
/* a la longueur des lignes...) : */
/* */
/* a1111 --> aF */
/* a1110 --> aE */
/* a1101 --> aD */
/* a1100 --> aC */
/* a1011 --> aB */
/* a1010 --> aA */
/* a1001 --> a9 */
/* a1000 --> a8 */
/* a0111 --> a7 */
/* a0110 --> a6 */
/* a0101 --> a5 */
/* a0100 --> a4 */
/* a0011 --> a3 */
/* a0010 --> a2 */
/* a0001 --> a1 */
/* a0000 --> a0 */
/* */
/* et pour faire, par exemple, la somme 'x+y+z+t', on */
/* choisira tous les coefficients 'a' nuls, sauf : */
/* */
/* a1 = a0001 = 1 --> x */
/* a2 = a0010 = 1 --> y */
/* a4 = a0100 = 1 --> z */
/* a8 = a1000 = 1 --> t */
/* */
/*************************************************************************************************************************************/
#define HORNER_4_01(x,y,z,t \
,a1111,a1110,a1101,a1100,a1011,a1010,a1001,a1000 \
,a0111,a0110,a0101,a0100,a0011,a0010,a0001,a0000 \
) \
HORNER_1_01(t \
,HORNER_3_01(x,y,z,a1111,a1110,a1101,a1100,a1011,a1010,a1001,a1000) \
,HORNER_3_01(x,y,z,a0111,a0110,a0101,a0100,a0011,a0010,a0001,a0000) \
) \
/* La procedure 'HORNER_4_01(...)' a ete introduite le 20071026114253... */
#define HORNER_4_02(x,y,z,t \
,a2222,a2221,a2220,a2212,a2211,a2210,a2202,a2201,a2200 \
,a2122,a2121,a2120,a2112,a2111,a2110,a2102,a2101,a2100 \
,a2022,a2021,a2020,a2012,a2011,a2010,a2002,a2001,a2000 \
,a1222,a1221,a1220,a1212,a1211,a1210,a1202,a1201,a1200 \
,a1122,a1121,a1120,a1112,a1111,a1110,a1102,a1101,a1100 \
,a1022,a1021,a1020,a1012,a1011,a1010,a1002,a1001,a1000 \
,a0222,a0221,a0220,a0212,a0211,a0210,a0202,a0201,a0200 \
,a0122,a0121,a0120,a0112,a0111,a0110,a0102,a0101,a0100 \
,a0022,a0021,a0020,a0012,a0011,a0010,a0002,a0001,a0000 \
) \
HORNER_1_02(t \
,HORNER_3_02(x,y,z \
,a2222,a2221,a2220,a2212,a2211,a2210,a2202,a2201,a2200 \
,a2122,a2121,a2120,a2112,a2111,a2110,a2102,a2101,a2100 \
,a2022,a2021,a2020,a2012,a2011,a2010,a2002,a2001,a2000 \
) \
,HORNER_3_02(x,y,z \
,a1222,a1221,a1220,a1212,a1211,a1210,a1202,a1201,a1200 \
,a1122,a1121,a1120,a1112,a1111,a1110,a1102,a1101,a1100 \
,a1022,a1021,a1020,a1012,a1011,a1010,a1002,a1001,a1000 \
) \
,HORNER_3_02(x,y,z \
,a0222,a0221,a0220,a0212,a0211,a0210,a0202,a0201,a0200 \
,a0122,a0121,a0120,a0112,a0111,a0110,a0102,a0101,a0100 \
,a0022,a0021,a0020,a0012,a0011,a0010,a0002,a0001,a0000 \
) \
) \
/* La procedure 'HORNER_4_02(...)' a ete introduite le 20181210102632... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D E P O L Y N O M E S A C I N Q V A R I A B L E S ( E T P L U S ) */
/* P A R L A M E T H O D E D E H O R N E R : */
/* */
/* */
/* Definitions : */
/* */
/* Les differentes procedures s'appeleront */
/* 'HORNER_v_0n(...)' ou 'v' designe le nombre */
/* de variables (v=1,2,3,4,...) et 'n' le degre */
/* maximal relatif a chaque variable (n=1,2,3,...) */
/* -et non pas le degre maximal des differents */
/* produits des variables-. */
/* */
/*************************************************************************************************************************************/
#define HORNER_5_01(x,y,z,t,u \
,a11111,a11110,a11101,a11100,a11011,a11010,a11001,a11000 \
,a10111,a10110,a10101,a10100,a10011,a10010,a10001,a10000 \
,a01111,a01110,a01101,a01100,a01011,a01010,a01001,a01000 \
,a00111,a00110,a00101,a00100,a00011,a00010,a00001,a00000 \
) \
HORNER_1_01(u \
,HORNER_4_01(x,y,z,t \
,a11111,a11110,a11101,a11100,a11011,a11010,a11001,a11000 \
,a10111,a10110,a10101,a10100,a10011,a10010,a10001,a10000 \
) \
,HORNER_4_01(x,y,z,t \
,a01111,a01110,a01101,a01100,a01011,a01010,a01001,a01000 \
,a00111,a00110,a00101,a00100,a00011,a00010,a00001,a00000 \
) \
) \
/* La procedure 'HORNER_5_01(...)' a ete introduite le 20071028115705... */
#define HORNER_6_01(x,y,z,t,u,v \
,a111111,a111110,a111101,a111100,a111011,a111010,a111001,a111000 \
,a110111,a110110,a110101,a110100,a110011,a110010,a110001,a110000 \
,a101111,a101110,a101101,a101100,a101011,a101010,a101001,a101000 \
,a100111,a100110,a100101,a100100,a100011,a100010,a100001,a100000 \
,a011111,a011110,a011101,a011100,a011011,a011010,a011001,a011000 \
,a010111,a010110,a010101,a010100,a010011,a010010,a010001,a010000 \
,a001111,a001110,a001101,a001100,a001011,a001010,a001001,a001000 \
,a000111,a000110,a000101,a000100,a000011,a000010,a000001,a000000 \
) \
HORNER_1_01(v \
,HORNER_5_01(x,y,z,t,u \
,a111111,a111110,a111101,a111100,a111011,a111010,a111001,a111000 \
,a110111,a110110,a110101,a110100,a110011,a110010,a110001,a110000 \
,a101111,a101110,a101101,a101100,a101011,a101010,a101001,a101000 \
,a100111,a100110,a100101,a100100,a100011,a100010,a100001,a100000 \
) \
,HORNER_5_01(x,y,z,t,u \
,a011111,a011110,a011101,a011100,a011011,a011010,a011001,a011000 \
,a010111,a010110,a010101,a010100,a010011,a010010,a010001,a010000 \
,a001111,a001110,a001101,a001100,a001011,a001010,a001001,a001000 \
,a000111,a000110,a000101,a000100,a000011,a000010,a000001,a000000 \
) \
) \
/* La procedure 'HORNER_6_01(...)' a ete introduite le 20071028115705... */
#define HORNER_7_01(x,y,z,t,u,v,w \
,a1111111,a1111110,a1111101,a1111100,a1111011,a1111010,a1111001,a1111000 \
,a1110111,a1110110,a1110101,a1110100,a1110011,a1110010,a1110001,a1110000 \
,a1101111,a1101110,a1101101,a1101100,a1101011,a1101010,a1101001,a1101000 \
,a1100111,a1100110,a1100101,a1100100,a1100011,a1100010,a1100001,a1100000 \
,a1011111,a1011110,a1011101,a1011100,a1011011,a1011010,a1011001,a1011000 \
,a1010111,a1010110,a1010101,a1010100,a1010011,a1010010,a1010001,a1010000 \
,a1001111,a1001110,a1001101,a1001100,a1001011,a1001010,a1001001,a1001000 \
,a1000111,a1000110,a1000101,a1000100,a1000011,a1000010,a1000001,a1000000 \
,a0111111,a0111110,a0111101,a0111100,a0111011,a0111010,a0111001,a0111000 \
,a0110111,a0110110,a0110101,a0110100,a0110011,a0110010,a0110001,a0110000 \
,a0101111,a0101110,a0101101,a0101100,a0101011,a0101010,a0101001,a0101000 \
,a0100111,a0100110,a0100101,a0100100,a0100011,a0100010,a0100001,a0100000 \
,a0011111,a0011110,a0011101,a0011100,a0011011,a0011010,a0011001,a0011000 \
,a0010111,a0010110,a0010101,a0010100,a0010011,a0010010,a0010001,a0010000 \
,a0001111,a0001110,a0001101,a0001100,a0001011,a0001010,a0001001,a0001000 \
,a0000111,a0000110,a0000101,a0000100,a0000011,a0000010,a0000001,a0000000 \
) \
HORNER_1_01(w \
,HORNER_6_01(x,y,z,t,u,v \
,a1111111,a1111110,a1111101,a1111100,a1111011,a1111010,a1111001,a1111000 \
,a1110111,a1110110,a1110101,a1110100,a1110011,a1110010,a1110001,a1110000 \
,a1101111,a1101110,a1101101,a1101100,a1101011,a1101010,a1101001,a1101000 \
,a1100111,a1100110,a1100101,a1100100,a1100011,a1100010,a1100001,a1100000 \
,a1011111,a1011110,a1011101,a1011100,a1011011,a1011010,a1011001,a1011000 \
,a1010111,a1010110,a1010101,a1010100,a1010011,a1010010,a1010001,a1010000 \
,a1001111,a1001110,a1001101,a1001100,a1001011,a1001010,a1001001,a1001000 \
,a1000111,a1000110,a1000101,a1000100,a1000011,a1000010,a1000001,a1000000 \
) \
,HORNER_6_01(x,y,z,t,u,v \
,a0111111,a0111110,a0111101,a0111100,a0111011,a0111010,a0111001,a0111000 \
,a0110111,a0110110,a0110101,a0110100,a0110011,a0110010,a0110001,a0110000 \
,a0101111,a0101110,a0101101,a0101100,a0101011,a0101010,a0101001,a0101000 \
,a0100111,a0100110,a0100101,a0100100,a0100011,a0100010,a0100001,a0100000 \
,a0011111,a0011110,a0011101,a0011100,a0011011,a0011010,a0011001,a0011000 \
,a0010111,a0010110,a0010101,a0010100,a0010011,a0010010,a0010001,a0010000 \
,a0001111,a0001110,a0001101,a0001100,a0001011,a0001010,a0001001,a0001000 \
,a0000111,a0000110,a0000101,a0000100,a0000011,a0000010,a0000001,a0000000 \
) \
) \
/* La procedure 'HORNER_7_01(...)' a ete introduite le 20071028115705... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O C E D U R E D E T R I D ' U N E L I S T E Q U E L C O N Q U E */
/* F O N C T I O N N A N T E N ' N ' A U C A R R E : */
/* */
/*************************************************************************************************************************************/
/* Ce code de tri a ete deplace depuis '$xrv/champs_5.11$I' le 20010215162028 dans le but */
/* (peut-etre...) d'etendre les modeles d'Ising bi- et tridimensionnels a des noyaux de */
/* taille quelconque ('v $xiii/di_image$FON Imodele_d_Ising_2D_a_temperature_locale' et */
/* 'v $xiii/di_album$FON Amodele_d_Ising_3D_a_temperature_locale') en s'inspirant du */
/* parcours d'un cube tel qu'il est programme dans 'v $xtc/ParcoCube.12$c' et qui demande */
/* un tri afin de classer les points par distance croissante depuis le "centre"... */
#nodefine NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
DIX_MILLE
#nodefine NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
GRO5(DIX_MILLE)
#nodefine NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
GRO10(DIX_MILLE)
/* Seuil un peu arbitraire (car il devrait en fait dependre des performances locales...) */
/* permettant d'avertir que cela risque d'etre long si plus d'elements sont a trier... */
/* */
/* Le 20041111083342, devant l'amelioration constante des performances des MACHINEs, je */
/* suis passe de 10000 a 50000. */
/* */
/* Le 20120508144654, devant l'amelioration constante des performances des MACHINEs, je */
/* suis passe de 50000 a 100000. */
/* */
/* Le 20220405110034 a ete introduit ci-dessous une dependance vis a vis de '$sHOTE'... */
#if ( (defined(LACT1A)) \
)
/* Introduit le 20240322132346... */
# define NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
GRO3(GRO14(DIX_MILLE))
#Aif ( (defined(LACT1A)) \
)
#Eif ( (defined(LACT1A)) \
)
#if ( (defined(LACT1B)) \
)
/* Introduit le 20220405110034... */
# nodefine NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
GRO12(DIX_MILLE)
# nodefine NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
GRO16(DIX_MILLE)
# nodefine NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
GRO2(GRO13(DIX_MILLE))
# define NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
GRO3(GRO14(DIX_MILLE))
/* Le 20220405135807, passage de 'GRO12(...)' a 'GRO16(...)'... */
/* */
/* Le 20220419142706, passage de 'GRO16(...)' a 'GRO2(GRO13(...))' lors du calcul de */
/* l'image 'v $xiirv/PEAN.36'... */
/* */
/* Le 20220429121700, passage de 'GRO2(GRO13(...)' a 'GRO3(GRO14(...))' lors du calcul de */
/* l'image 'v $xiirv/PEAN.75'... */
#Aif ( (defined(LACT1B)) \
)
#Eif ( (defined(LACT1B)) \
)
#ifndef NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE
# define NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
GRO10(DIX_MILLE)
#Aifndef NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE
#Eifndef NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE
#define TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE(liste_a_trier,liste_index,premier_element,NEUT_dernier_element,AccesListe) \
/* Le 20020828170851 j'ai fait en sorte que l'argument '????_dernier_element' pointe bien */ \
/* sur le dernier element de la liste et non pas sur son successeur, d'ou le remplacement */ \
/* d'operateurs 'PRED(...)' et 'SUCC(...)' par des 'NEUT(...)'. */ \
/* */ \
/* Je rappelle le 20220804102408 que la procedure argument 'AccesListe(...)' demande */ \
/* deux arguments, ce qui fait que 'IdTb1(...)' (qui en demande trois) ne peut etre */ \
/* utilisee ici. C'est ce qui a implique l'introduction de la procedure 'IdTb1sd(..)' */ \
/* ('v $xil/defi_c1$vv$DEF IdTb1sd', "sd"="Sans Dimension") qui n'en demande que deux... */ \
Bblock \
DEFV(Int,INIT(dernier_element,NEUT(NEUT_dernier_element))); \
/* Definition locale du dernier element. */ \
\
Test(IFGT(NBRE(premier_element,NEUT_dernier_element) \
,NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
) \
) \
/* Ce test a ete introduit le 20020630000808 pour eviter d'attendre dans l'inquietude */ \
/* des programmes essayant de trier ainsi trop de nombres. Cela s'est vu le 20020628160000 */ \
/* avec pas de loin de 400000 particules dans 'v $xrv/particule.10$K'... */ \
Bblock \
Test(IL_FAUT(TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE_____editer_le_message_de_duree_excessive)) \
/* Ce test a ete introduit le 20120509093458... */ \
Bblock \
PRINT_ATTENTION("un tri en mode 'N_AU_CARRE' a ete demande et risque de durer longtemps"); \
CAL1(Prer2("(il y a en effet %d elements a trier alors qu'il vaut mieux ne pas exceder %d)\n" \
,NBRE(premier_element,NEUT_dernier_element) \
,NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
) \
); \
PRINT_ATTENTION("il est donc suggere d'utiliser le tri 'N_LOG_N'"); \
CAL1(Prer2("(via l'option 'N_au_carre=%s' ou de facon equivalente 'N_log_N=%s')\n" \
,C_FAUX____ \
,C_VRAI____ \
) \
); \
/* Le message "...via l'option 'N_au_carre=FAUX'" a ete modifie le 20041110100707 car, en */ \
/* effet, cette option "N_au_carre=" ne fait pas partie des options qui sont definies dans */ \
/* 'v $xig/fonct$vv$DEF GET_ARGUMENTSi' ; elle est en fait definie "a un niveau superieur", */ \
/* dans 'v $xrv/champs_5.1A$I N_au_carre'... */ \
PRINT_ATTENTION("mais le tri 'N_AU_CARRE' a l'avantage de conserver l'ordre d'une liste deja triee"); \
/* Malgre tout, le tri en mode 'N_AU_CARRE' presente l'avantage de conserver l'ordre des */ \
/* listes deja triees, ce qui permet une meilleure qualite visuelle des images que l'on */ \
/* genere par ce moyen... */ \
/* */ \
/* Aux environs du 20181226080911 lors de la generation de l'image 'v $xiirv/CARR.35', des */ \
/* tests sur '$LACT1A' avec : */ \
/* */ \
/* set _____DistanceMini=0.001 */ \
/* set _____NAuCarre=VRAI */ \
/* */ \
/* ('v $xiirv/$Fnota Debut_listG_CARR_35') faisaient des tris de listes contenant */ \
/* 568800 elements. La duree de ces tris etait de l'ordre de 00:06:21 ce qui est tout */ \
/* a fait raisonnable... */ \
PRINT_ATTENTION("voir a ce propos le programme 'v $xtKg/tri.02$K' qui fait des tests de performance"); \
/* Introduit le 20181227091707... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IFGT(dernier_element,premier_element)) \
/* Ce test verifiant qu'il y a plus d'un element dans la liste a ete introduit le */ \
/* 20011017144259 car il manquait... */ \
Bblock \
DEFV(Int,INIT(index_de_debut_de_permutation,UNDEF)); \
DEFV(Int,INIT(index_de_fin_de_permutation,UNDEF)); \
/* Index de permutation destines a trier la liste des points tel que le point le plus */ \
/* eloigne ('Z' tendant vers moins l'infini) se retrouve le premier de la liste... */ \
/* */ \
/* Ces indices varient de la facon suivante, ou : */ \
/* */ \
/* debut : designe 'index_de_debut_de_permutation', */ \
/* fin : designe 'index_de_fin_de_permutation', */ \
/* */ \
/* */ \
/* ---- premier_element */ \
/* | dernier_element ---- */ \
/* | | */ \
/* \|/ | */ \
/* . | */ \
/* + <------------------------- fin <--------------- + | */ \
/* | | | \|/ */ \
/* | | | . */ \
/* | | | */ \
/* 0 1 2 (...) N-3 N-2 N-1 */ \
/* . . . | . . */ \
/* . . . | . * */ \
/* . . . | . */ \
/* . . . \|/ * */ \
/* . . . . */ \
/* . . . * */ \
/* . . . | */ \
/* . . * | */ \
/* . . | */ \
/* . * | */ \
/* . | */ \
/* * | */ \
/* | | */ \
/* | | */ \
/* | | */ \
/* + -------> balayage --------> + */ \
/* debut fin */ \
/* */ \
/* Ainsi, on explore un triangle "inferieur" de plus en plus petit : le premier (le plus */ \
/* grand) est [0,N-2] ce qui correspond au tri des points [0,...N-1], et le dernier (le */ \
/* plus petit) est [0,0] ce qui correspond au tri des points [0,1]... */ \
\
DoDe(index_de_fin_de_permutation,premier_element,PRED(dernier_element),I) \
/* Un deuxieme 'PRED(...)' a ete introduit le 20011017144259 car il manquait ; en effet, */ \
/* il y a ci-apres un 'SUCC(index_de_debut_de_permutation)' qui implique que l'on s'arrete */ \
/* sur l'avant-dernier element (soit 'PRED(dernier_element)'). */ \
Bblock \
DoIn(index_de_debut_de_permutation,premier_element,index_de_fin_de_permutation,I) \
Bblock \
DEFV(Int,INIT(index_1_de_permutation \
,INTE(AccesListe(liste_index,NEUT(index_de_debut_de_permutation))) \
) \
); \
DEFV(Int,INIT(index_2_de_permutation \
,INTE(AccesListe(liste_index,SUCC(index_de_debut_de_permutation))) \
) \
); \
/* Index de permutation destines a permuter les deux elements courants de la liste. */ \
\
Test(IFGc(AccesListe(liste_a_trier,index_1_de_permutation) \
,AccesListe(liste_a_trier,index_2_de_permutation) \
,TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE_____faire_un_IFGT \
) \
) \
/* Le 'IFGT(...)' a ete remplace par un 'IFGc(...)' le 20020828144254 afin de permettre */ \
/* d'inverser l'ordre d'une liste contenant des elements tous identiques. Cela a ete rendu */ \
/* necessaire pour generer la sequence : */ \
/* */ \
/* xivPdf 12 1 / 012801_013312 */ \
/* */ \
/* pour laquelle toutes les coordonnees 'Z' sont identiques ; cela implique par defaut */ \
/* une absence de tri. Or cette liste contenait 'N' positions successives d'une meme */ \
/* particule soit {P(t-(N-1)),P(t-(N-2)),...,P(t)}. Ainsi, c'est donc le point 'P(t-(N-1))', */ \
/* qui est le plus ancien qui est trace en premier et qui se retrouve donc ensuite devant */ \
/* les points les plus recents. En permettant cette inversion de la liste, c'est le point */ \
/* 'P(t)' qui sera trace en premier et qui sera donc devant les points plus anciens... */ \
/* */ \
/* Donnons un exemple ; soit le fichier : */ \
/* */ \
/* {10,10,10,10,10,10,10,10,10,10} */ \
/* */ \
/* et trions le via '$xrv/tri.11$X index=VRAI N2=VRAI'. Avec "IFGT_N2=VRAI" (c'est-a-dire */ \
/* en utilisant 'IFGT(...)', la liste des index alors obtenue est : */ \
/* */ \
/* {0,1,2,3,4,5,6,7,8,9} */ \
/* */ \
/* et l'ordre directe est conserve, alors qu'avec "IFGT_N2=FAUX" (c'est-a-dire en utilisant */ \
/* 'IFGE(...)', la liste des index alors obtenue est : */ \
/* */ \
/* {9,8,7,6,5,4,3,2,1,0} */ \
/* */ \
/* et l'ordre est completement inverse. On notera que via '$xrv/tri.11$X index=VRAI N2=FAUX' */ \
/* la procedure 'TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_LOG_N(...)' donne la liste des index */ \
/* suivante : */ \
/* */ \
/* {1,2,3,4,5,6,7,8,9,0} */ \
/* */ \
/* ce que je n'explique pas a la date du 20020829120207. En fait, des tests effectues a */ \
/* l'aide du programme 'v $xtc/tri_NLogN.02$c' semblent montrer que ce phenomene est tout */ \
/* a fait inevitable et lie a l'operation 'v $xtc/tri_NLogN.02$c echang.debut,index.' qui */ \
/* est toujours effectuee au moins une fois (si la liste a plus d'un element evidemment...) */ \
/* et ce a cause du ' v $xtc/tri_NLogN.02$c while......index.debut.' qui la precede. Ainsi, */ \
/* il a toujours au moins une permutation d'elements ce qui fait que l'ordre, s'il est deja */ \
/* correct, ne peut etre maintenu... */ \
Bblock \
fSWAP(AccesListe(liste_index,NEUT(index_de_debut_de_permutation)) \
,AccesListe(liste_index,SUCC(index_de_debut_de_permutation)) \
); \
/* Lorsqu'un element est plus grand que son successeur, on les permute, ainsi, */ \
/* progressivement le plus petit element se retrouvera en tete, et le plus grand en queue... */ \
/* Ainsi, on trie la liste de facon a ce que le premier point soit le plus eloigne de nous, */ \
/* et que le dernier soit le plus proche. Enfin, cette facon de proceder conserve l'ordre */ \
/* des elements possedant la meme clef de tri (soit 'AccesListe(liste_a_trier,...)'). */ \
/* */ \
/* On notera le 20081005094936 qu'en utilisant 'fSWAP(...)' on permet de traiter ainsi des */ \
/* listes de type quelconque puisque 'fSWAP(...)' possede le type "maximal", c'est-a-dire */ \
/* 'Float'... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
EDoI \
Eblock \
EDoD \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Tri d'une liste quelconque avec une methode en 'N' au carre... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O C E D U R E D E T R I D ' U N E L I S T E Q U E L C O N Q U E */
/* F O N C T I O N N A N T E N ' N x L O G ( N ) ' : */
/* */
/*************************************************************************************************************************************/
/* Ce code de tri a ete deplace depuis '$xrv/champs_5.11$I' le 20010215162028 dans le but */
/* (peut-etre...) d'etendre les modeles d'Ising bi- et tridimensionnels a des noyaux de */
/* taille quelconque ('v $xiii/di_image$FON Imodele_d_Ising_2D_a_temperature_locale' et */
/* 'v $xiii/di_album$FON Amodele_d_Ising_3D_a_temperature_locale') en s'inspirant du */
/* parcours d'un cube tel qu'il est programme dans 'v $xtc/ParcoCube.12$c' et qui demande */
/* un tri afin de classer les points par distance croissante depuis le "centre"... */
/* Nota : cet algorithme a ete preleve dans "METHODES DE PROGRAMMATION" de Bertrand Meyer */
/* et Claude Baudoin publie aux Editions Eyrolles (pages 481 et 482). */
#define PERMUTATION_DE_DEUX_ELEMENTS(liste_index,index_1,index_2,AccesListe) \
Bblock \
fSWAP(AccesListe(liste_index,index_1) \
,AccesListe(liste_index,index_2) \
); \
Eblock \
/* Permutation de deux elements d'index donne. */ \
/* */ \
/* On notera le 20081005094936 qu'en utilisant 'fSWAP(...)' on permet de traiter ainsi des */ \
/* listes de type quelconque puisque 'fSWAP(...)' possede le type "maximal", c'est-a-dire */ \
/* 'Float'... */
#define COMPARAISON_DE_DEUX_ELEMENTS(test,liste_a_trier,liste_index,index_1,index_2,AccesListe) \
test(AccesListe(liste_a_trier,INTE(AccesListe(liste_index,index_1))) \
,AccesListe(liste_a_trier,INTE(AccesListe(liste_index,index_2))) \
) \
/* Comparaison de deux elements d'index donne. */
#define REORGANISATION_ENTRE_DEUX_INDICES_POUR_LE_TRI(liste_a_trier,liste_index,index_de_debut,index_de_fin,AccesListe) \
Bblock \
DEFV(Int,INIT(index_courant_de_reorganisation,index_de_debut)); \
DEFV(Logical,INIT(iterer_la_reorganisation,VRAI)); \
\
Tant(IL_FAUT(iterer_la_reorganisation)) \
Bblock \
DEFV(Int,INIT(index_de_gauche,DOUB(index_courant_de_reorganisation))); \
\
Test(IFGT(index_de_gauche,index_de_fin)) \
Bblock \
EGAL(iterer_la_reorganisation,FAUX); \
Eblock \
ATes \
Bblock \
DEFV(Int,INIT(index_extreme,index_de_gauche)); \
DEFV(Int,INIT(index_de_droite,SUCC(index_de_gauche))); \
\
Test(IFGT(index_de_droite,index_de_fin)) \
Bblock \
Eblock \
ATes \
Bblock \
Test(COMPARAISON_DE_DEUX_ELEMENTS(IFLT \
,liste_a_trier \
,liste_index \
,index_de_gauche \
,index_de_droite \
,AccesListe \
) \
) \
Bblock \
EGAL(index_extreme,index_de_droite); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ETes \
\
Test(COMPARAISON_DE_DEUX_ELEMENTS(IFLE \
,liste_a_trier \
,liste_index \
,index_extreme \
,index_courant_de_reorganisation \
,AccesListe \
) \
) \
Bblock \
EGAL(iterer_la_reorganisation,FAUX); \
Eblock \
ATes \
Bblock \
PERMUTATION_DE_DEUX_ELEMENTS(liste_index,index_courant_de_reorganisation,index_extreme,AccesListe); \
/* Malheureusement, cette facon de proceder ne conserve pas l'ordre des elements possedant */ \
/* la meme clef de tri (soit 'AccesListe(liste_a_trier,...)') puisque les listes sont */ \
/* completement bouleversees ; c'est pourquoi, je maintiens les deux tris avec le tri */ \
/* en 'N au carre' implicite... */ \
EGAL(index_courant_de_reorganisation,index_extreme); \
Eblock \
ETes \
Eblock \
ETes \
Eblock \
ETan \
Eblock \
/* Reorganisation des elements d'une liste entre deux index. */
#define TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_LOG_N(liste_a_trier,liste_index,premier_element,NEUT_dernier_element,AccesListe) \
/* Le 20020828170851 j'ai fait en sorte que l'argument '????_dernier_element' pointe bien */ \
/* sur le dernier element de la liste et non pas sur son successeur, d'ou le remplacement */ \
/* d'operateurs 'PRED(...)' et 'SUCC(...)' par des 'NEUT(...)'. */ \
/* */ \
/* Je rappelle le 20220804102408 que la procedure argument 'AccesListe(...)' demande */ \
/* deux arguments, ce qui fait que 'IdTb1(...)' (qui en demande trois) ne peut etre */ \
/* utilisee ici. C'est ce qui a implique l'introduction de la procedure 'IdTb1sd(..)' */ \
/* ('v $xil/defi_c1$vv$DEF IdTb1sd', "sd"="Sans Dimension") qui n'en demande que deux... */ \
Bblock \
DEFV(Int,INIT(dernier_element,NEUT(NEUT_dernier_element))); \
/* Definition locale du dernier element. */ \
\
Test(IFGT(dernier_element,premier_element)) \
/* Ce test verifiant qu'il y a plus d'un element dans la liste a ete introduit le */ \
/* 20011017144259 car il manquait... */ \
Bblock \
DEFV(Int,INIT(index_courant_de_tri,MOIT(dernier_element))); \
\
Tant(IFGE(index_courant_de_tri,premier_element)) \
Bblock \
REORGANISATION_ENTRE_DEUX_INDICES_POUR_LE_TRI(liste_a_trier \
,liste_index \
,index_courant_de_tri \
,dernier_element \
,AccesListe \
); \
DECR(index_courant_de_tri,I); \
Eblock \
ETan \
\
EGAL(index_courant_de_tri,dernier_element); \
\
Tant(IFGT(index_courant_de_tri,premier_element)) \
Bblock \
PERMUTATION_DE_DEUX_ELEMENTS(liste_index,premier_element,index_courant_de_tri,AccesListe); \
DECR(index_courant_de_tri,I); \
REORGANISATION_ENTRE_DEUX_INDICES_POUR_LE_TRI(liste_a_trier \
,liste_index \
,premier_element \
,index_courant_de_tri \
,AccesListe \
); \
Eblock \
ETan \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Tri d'une liste quelconque avec une methode en 'Nxlog(N)'... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R O C E D U R E D E T R I D ' U N E L I S T E Q U E L C O N Q U E : */
/* */
/*************************************************************************************************************************************/
/* Ce code de tri a ete deplace depuis '$xrv/champs_5.11$I' le 20010215162028 dans le but */
/* (peut-etre...) d'etendre les modeles d'Ising bi- et tridimensionnels a des noyaux de */
/* taille quelconque ('v $xiii/di_image$FON Imodele_d_Ising_2D_a_temperature_locale' et */
/* 'v $xiii/di_album$FON Amodele_d_Ising_3D_a_temperature_locale') en s'inspirant du */
/* parcours d'un cube tel qu'il est programme dans 'v $xtc/ParcoCube.12$c' et qui demande */
/* un tri afin de classer les points par distance croissante depuis le "centre"... */
#define EST_CE_LE_TRI_AUTOMATIQUE_D_UNE_LISTE_QUELCONQUE \
FAUX \
/* Afin de bloquer (provisoirement ?) le "tri automatique" dans les '$K's qui utilisent */ \
/* la procedure 'TRI_D_UNE_LISTE_QUELCONQUE(...)' (introduit le 20170608103840)... */
#define EST_CE_LE_TRI_N_AU_CARRE_D_UNE_LISTE_QUELCONQUE \
FAUX \
/* Afin de forcer le tri en 'N*log(N)' dans certains '$K's (introduit le 20170608103840)... */
#define TRI_D_UNE_LISTE_QUELCONQUE(liste_a_trier,liste_index,premier_element,NEUT_dernier_element,tri_auto,V_N_AU_CARRE,AccesListe) \
/* Le 20020828170851 j'ai fait en sorte que l'argument '????_dernier_element' pointe bien */ \
/* sur le dernier element de la liste et non pas sur son successeur, d'ou le remplacement */ \
/* d'operateurs 'PRED(...)' et 'SUCC(...)' par des 'NEUT(...)'. */ \
/* */ \
/* La procedure argument 'AccesListe(...)' est du type : */ \
/* */ \
/* AccesListe(liste,index) */ \
/* */ \
/* sachant de plus que les deux listes {liste_a_trier,liste_index} doivent etre evidemment */ \
/* initialisees, et en particulier 'liste_index' ('v $xtKg/tri.01$K' pour un exemple */ \
/* d'utilisation...). */ \
/* */ \
/* Je rappelle le 20220804102408 que la procedure argument 'AccesListe(...)' demande */ \
/* deux arguments, ce qui fait que 'IdTb1(...)' (qui en demande trois) ne peut etre */ \
/* utilisee ici. C'est ce qui a implique l'introduction de la procedure 'IdTb1sd(..)' */ \
/* ('v $xil/defi_c1$vv$DEF IdTb1sd', "sd"="Sans Dimension") qui n'en demande que deux... */ \
/* */ \
/* Le 20170608102359, l'argument 'tri_auto' a ete introduit au cas ou, mais aussi par */ \
/* "symetrie" avec 'v $xrv/champs_5.11$I 20170608082613'... */ \
Bblock \
DEFV(Logical,INIT(effectivement__V_N_AU_CARRE,V_N_AU_CARRE)); \
/* Introduit le 20170609081822... */ \
\
Test(IL_FAUT(tri_auto)) \
/* Possibilite introduite le 20170608082613... */ \
Bblock \
Test(IFLE(NBRE(premier_element,NEUT_dernier_element) \
,NOMBRE_RAISONNABLE_MAXIMAL_D_ELEMENTS_DANS_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
) \
) \
Bblock \
EGAL(effectivement__V_N_AU_CARRE,VRAI); \
/* On peut utiliser le tri suivant la methode 'N*N' */ \
Eblock \
ATes \
Bblock \
EGAL(effectivement__V_N_AU_CARRE,FAUX); \
/* Il faut utiliser le tri suivant la methode 'N*log(N)' */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(effectivement__V_N_AU_CARRE)) \
Bblock \
TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE(liste_a_trier \
,liste_index \
,premier_element \
,NEUT_dernier_element \
,AccesListe \
); \
/* Tri suivant la methode 'NxN' qui possede l'avantage de conserver l'ordre des index */ \
/* d'une liste deja triee. Par contre elle est plus lente que la methode 'Nxlog(N)', */ \
/* surtout pour des grandes valeurs de 'N' (elle peut meme devenir impraticable...). */ \
Eblock \
ATes \
Bblock \
TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_LOG_N(liste_a_trier \
,liste_index \
,premier_element \
,NEUT_dernier_element \
,AccesListe \
); \
/* Tri suivant la methode 'Nxlog(N)' qui possede l'inconvenient de changer eventuellement */ \
/* l'ordre des index d'une liste deja triee, en ce qui concerne les "paquets" de valeurs */ \
/* identiques. Par contre elle est plus rapide que la methode 'NxN', surtout pour des */ \
/* grandes valeurs de 'N'... */ \
Eblock \
ETes \
Eblock \
/* Tri d'une liste quelconque. */