/*************************************************************************************************************************************/ /* */ /* I N T E R S E C T I O N D E D E U X P S E U D O - P R O J E C T I O N S : */ /* */ /* */ /* Author of '$xrs/intersection3D.11$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20200731101812). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE #include image_image_IMAGESF_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define EPSILON_DISTANCE \ tgEPSILON \ /* Definition de l'epsilon de detection d'intersection. */ #define PONDERATION_MOYE \ FU #define PONDERATION_MIN2 \ FZERO #define PONDERATION_MAX2 \ FZERO #define PONDERATION_SE12 \ FZERO #define PONDERATION_SE22 \ FZERO /* Definition des ponderations de selection du mode de calcul des coordonnees des points */ /* d'intersection. */ /* */ /* On notera les selecteurs 'SE12(...)' et 'SE22(...)' qui permettent respectivement de */ /* conserver les coordonnees originales des premiere et deuxieme pseudo-projections... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define PseudoProjection_A1X \ IFmageA1 #define PseudoProjection_A1Y \ IFmageA2 #define PseudoProjection_A1Z \ IFmageA3 #define PseudoProjection_A2X \ IFmageA4 #define PseudoProjection_A2Y \ IFmageA5 #define PseudoProjection_A2Z \ IFmageA6 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R S E C T I O N D E D E U X P S E U D O - P R O J E C T I O N S : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_PseudoProjection_A1X),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_PseudoProjection_A1Y),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_PseudoProjection_A1Z),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_PseudoProjection_A2X),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_PseudoProjection_A2Y),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_PseudoProjection_A2Z),NOM_PIPE)); DEFV(Float,INIT(epsilon_distance,EPSILON_DISTANCE)); /* Definition de l'epsilon de detection d'intersection. */ DEFV(Float,INIT(ponderation_MOYE,PONDERATION_MOYE)); DEFV(Float,INIT(ponderation_MIN2,PONDERATION_MIN2)); DEFV(Float,INIT(ponderation_MAX2,PONDERATION_MAX2)); DEFV(Float,INIT(ponderation_SE12,PONDERATION_SE12)); DEFV(Float,INIT(ponderation_SE22,PONDERATION_SE22)); /* Definition des ponderations de selection du mode de calcul des coordonnees des points */ /* d'intersection. */ /* */ /* On notera les selecteurs 'SE12(...)' et 'SE22(...)' qui permettent respectivement de */ /* conserver les coordonnees originales des premiere et deuxieme pseudo-projections... */ /*..............................................................................................................................*/ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_C("imagePP1X=""PP1X=",nom_PseudoProjection_A1X); GET_ARGUMENT_C("imagePP1Y=""PP1Y=",nom_PseudoProjection_A1Y); GET_ARGUMENT_C("imagePP1Z=""PP1Z=",nom_PseudoProjection_A1Z); GET_ARGUMENT_C("imagePP2X=""PP2X=",nom_PseudoProjection_A2X); GET_ARGUMENT_C("imagePP2Y=""PP2Y=",nom_PseudoProjection_A2Y); GET_ARGUMENT_C("imagePP2Z=""PP2Z=",nom_PseudoProjection_A2Z); GET_ARGUMENT_F("epsilon=""e=",epsilon_distance); GET_ARGUMENT_F("ponderation_MOYE=""pMOYE=",ponderation_MOYE); GET_ARGUMENT_F("ponderation_MIN2=""pMIN2=",ponderation_MIN2); GET_ARGUMENT_F("ponderation_MAX2=""pMAX2=",ponderation_MAX2); GET_ARGUMENT_F("ponderation_SE12=""pSE12=",ponderation_SE12); GET_ARGUMENT_F("ponderation_SE22=""pSE22=",ponderation_SE22); ) ); Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(PseudoProjection_A1X,nom_PseudoProjection_A1X)))) Bblock Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(PseudoProjection_A1Y,nom_PseudoProjection_A1Y)))) Bblock Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(PseudoProjection_A1Z,nom_PseudoProjection_A1Z)))) Bblock Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(PseudoProjection_A2X,nom_PseudoProjection_A2X)))) Bblock Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(PseudoProjection_A2Y,nom_PseudoProjection_A2Y)))) Bblock Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(PseudoProjection_A2Z,nom_PseudoProjection_A2Z)))) Bblock begin_image_AvecEditionProgression /* L'edition de la progression a ete introduite le 20200731141024 car, en effet, etant */ /* donnes les deux 'begin_image' imbriques, le processus promet d'etre lent a partir du */ /* format 'Pal'... */ Bblock DEFV(Float,INIT(coordonnee_A1X,loadF_point(PseudoProjection_A1X,X,Y))); DEFV(Float,INIT(coordonnee_A1Y,loadF_point(PseudoProjection_A1Y,X,Y))); DEFV(Float,INIT(coordonnee_A1Z,loadF_point(PseudoProjection_A1Z,X,Y))); /* Point courant de la premiere pseudo-projection. */ begin_image Bblock DEFV(Float,INIT(coordonnee_A2X,loadF_point(PseudoProjection_A2X,X,Y))); Test(IFLE(SOUA(coordonnee_A1X,coordonnee_A2X),epsilon_distance)) /* Optimisation introduite le 20200803155516 basee sur le fait que la distance entre deux */ /* points projetee sur l'axe 'OX' est inferieure ou egale a la distance euclidienne entre */ /* ces deux points (le temps de calcul a effectivement ete divise par 3...). */ Bblock DEFV(Float,INIT(coordonnee_A2Y,loadF_point(PseudoProjection_A2Y,X,Y))); Test(IFLE(SOUA(coordonnee_A1Y,coordonnee_A2Y),epsilon_distance)) /* Optimisation introduite le 20200803155516 basee sur le fait que la distance entre deux */ /* points projetee sur l'axe 'OY' est inferieure ou egale a la distance euclidienne entre */ /* ces deux points (le temps de calcul a effectivement ete divise par 3...). */ Bblock DEFV(Float,INIT(coordonnee_A2Z,loadF_point(PseudoProjection_A2Z,X,Y))); Test(IFLE(SOUA(coordonnee_A1Z,coordonnee_A2Z),epsilon_distance)) /* Optimisation introduite le 20200803155516 basee sur le fait que la distance entre deux */ /* points projetee sur l'axe 'OZ' est inferieure ou egale a la distance euclidienne entre */ /* ces deux points (le temps de calcul a effectivement ete divise par 3...). */ Bblock DEFV(Float,INIT(distance_12 ,RdisF3D(coordonnee_A1X,coordonnee_A1Y,coordonnee_A1Z ,coordonnee_A2X,coordonnee_A2Y,coordonnee_A2Z ) ) ); /* Distance courante entre les deux pseudo-projections... */ Test(IFLE(distance_12,epsilon_distance)) Bblock /* Cas ou les deux points sont proches l'un de l'autre : il y a intersection... */ CAL2(Prin4("X=%+.^^^ Y=%+.^^^ Z=%+.^^^ DISTANCE=%+.^^^\n" ,LIZ5(ponderation_MOYE,MOYE(coordonnee_A1X,coordonnee_A2X) ,ponderation_MIN2,MIN2(coordonnee_A1X,coordonnee_A2X) ,ponderation_MAX2,MAX2(coordonnee_A1X,coordonnee_A2X) ,ponderation_SE12,SE12(coordonnee_A1X,coordonnee_A2X) ,ponderation_SE22,SE22(coordonnee_A1X,coordonnee_A2X) ) ,LIZ5(ponderation_MOYE,MOYE(coordonnee_A1Y,coordonnee_A2Y) ,ponderation_MIN2,MIN2(coordonnee_A1Y,coordonnee_A2Y) ,ponderation_MAX2,MAX2(coordonnee_A1Y,coordonnee_A2Y) ,ponderation_SE12,SE12(coordonnee_A1Y,coordonnee_A2Y) ,ponderation_SE22,SE22(coordonnee_A1Y,coordonnee_A2Y) ) ,LIZ5(ponderation_MOYE,MOYE(coordonnee_A1Z,coordonnee_A2Z) ,ponderation_MIN2,MIN2(coordonnee_A1Z,coordonnee_A2Z) ,ponderation_MAX2,MAX2(coordonnee_A1Z,coordonnee_A2Z) ,ponderation_SE12,SE12(coordonnee_A1Z,coordonnee_A2Z) ,ponderation_SE22,SE22(coordonnee_A1Z,coordonnee_A2Z) ) ,distance_12 ) ); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock end_image Eblock end_image_AvecEditionProgression Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes RETU_Commande; Eblock ECommande