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