/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D E R E C T A N G L E S D ' O R : */
/* */
/* */
/* Author of '$xci/valeurs_RectangleOr$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20171212140008). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#include xci/sequence.01.I"
#define INVERSER_L_AXE_OX \
FAUX
#define INVERSER_L_AXE_OY \
FAUX
/* Afin de permettre d'inverser les axes 'OX' et 'OY' (introduit le 20171213110412). */
#define TRANSLATION_OX \
FZERO
#define TRANSLATION_OY \
FZERO
/* Afin de permettre de translater les axes 'OX' et 'OY' (introduit le 20171213114417). */
#define CENTRER_LE_PREMIER_RECTANGLE \
VRAI
#define X_SOMMET_BAS_GAUCHE \
FXmin
#define Y_SOMMET_BAS_GAUCHE \
FYmin
/* Definition du sommet en bas et a gauche. */
#define COTE_HORIZONTAL \
NOMBRE_D_OR
#define COTE_VERTICAL__ \
FU
/* Definition des deux cotes d'un rectangle. */
#define RAPPORT_DE_REDUCTION \
NOMBRE_D_OR \
/* Definition du rapport de reduction. */
#define EDITER_LES_COTES \
VRAI
#define EDITER_LES_SOMMETS \
VRAI
/* Controle des editions... */
#include xci/valeurs.01.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#include xci/valeurs.02.I"
#define INVERSER_EVENTUELLEMENT_OX(deplacement) \
MUL2(COND(IL_FAUT(inverser_l_axe_OX),NEGA(FU),NEUT(FU)),deplacement)
#define INVERSER_EVENTUELLEMENT_OY(deplacement) \
MUL2(COND(IL_FAUT(inverser_l_axe_OY),NEGA(FU),NEUT(FU)),deplacement)
/* Introduit le 20171213110412 pour permettre l'inversion eventuelle des axes. Etant */
/* donne qu'il y a quatre possibilites, on peut ainsi simuler 'v $xci/tapisserie$K' comme */
/* le montre l'image 'v $xiirv/REOR.21'... */
#define EDITION_DES_COTES(editer,format_coordonnees_normalisees,cote) \
Bblock \
Test(IL_FAUT(editer_les_cotes)) \
Bblock \
Test(IL_FAUT(editer)) \
Bblock \
CAL2(Prin1(format_coordonnees_normalisees \
,cote \
) \
); \
CAL2(Prin0("\n")); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Edition des coordonnees des segments. */
#define EDITION_DES_COORDONNEES_DES_SOMMETS(editer,format_coordonnees_normalisees,X,Y) \
Bblock \
Test(IL_FAUT(editer_les_sommets)) \
Bblock \
Test(IL_FAUT(editer)) \
Bblock \
CAL2(Prin2(format_coordonnees_normalisees \
,X \
,Y \
) \
); \
CAL2(Prin0("\n")); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Edition des coordonnees des segments. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D E R E C T A N G L E S D ' O R : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE));
/* Numero de la premiere image, */
DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE));
/* Numero de la derniere image. */
DEFV(Int,INIT(numero_d_image,UNDEF));
/* Numero de l'image courante. */
DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES));
/* Pas de passage d'un numero d'image a une autre. */
DEFV(Logical,INIT(inverser_l_axe_OX,INVERSER_L_AXE_OX));
DEFV(Logical,INIT(inverser_l_axe_OY,INVERSER_L_AXE_OY));
/* Afin de permettre d'inverser les axes 'OX' et 'OY' (introduit le 20171213110412). */
DEFV(Float,INIT(translation_OX,TRANSLATION_OX));
DEFV(Float,INIT(translation_OY,TRANSLATION_OY));
/* Afin de permettre de translater les axes 'OX' et 'OY' (introduit le 20171213114417). */
DEFV(Logical,INIT(centrer_le_premier_rectangle,CENTRER_LE_PREMIER_RECTANGLE));
DEFV(Float,INIT(X_sommet_bas_gauche,X_SOMMET_BAS_GAUCHE));
DEFV(Float,INIT(Y_sommet_bas_gauche,Y_SOMMET_BAS_GAUCHE));
/* Definition du sommet en bas et a gauche. */
DEFV(Float,INIT(cote_horizontal,COTE_HORIZONTAL));
DEFV(Float,INIT(cote_vertical__,COTE_VERTICAL__));
/* Definition des deux cotes d'un rectangle. */
DEFV(Float,INIT(rapport_de_reduction,RAPPORT_DE_REDUCTION));
/* Rapport de passage d'un nombre au suivant. */
DEFV(Local,DEFV(Logical,INIT(editer_les_cotes,EDITER_LES_COTES)));
DEFV(Local,DEFV(Logical,INIT(editer_les_sommets,EDITER_LES_SOMMETS)));
/* Controle des editions... */
#include xci/valeurs.03.I"
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_I("premiere=""p=""D=",premiere_image);
GET_ARGUMENT_I("derniere=""d=""A=",derniere_image);
GET_ARGUMENT_I("pas=",pas_des_images);
GET_ARGUMENT_L("inverserX=""iX=",inverser_l_axe_OX);
GET_ARGUMENT_L("inverserY=""iY=",inverser_l_axe_OY);
/* Arguments introduits le 20171213110412... */
GET_ARGUMENT_F("translationX=""tX=",translation_OX);
GET_ARGUMENT_F("translationY=""tY=",translation_OY);
/* Arguments introduits le 20171213114417... */
GET_ARGUMENT_L("centrer=",centrer_le_premier_rectangle);
GET_ARGUMENT_F("X_sommet_bas_gauche=""Xsbg=",X_sommet_bas_gauche);
GET_ARGUMENT_F("Y_sommet_bas_gauche=""Ysbg=",Y_sommet_bas_gauche);
GET_ARGUMENT_F("cote_horizontal=""ch=",cote_horizontal);
GET_ARGUMENT_F("cote_vertical=""cv=",cote_vertical__);
GET_ARGUMENT_F("rapport=""r=",rapport_de_reduction);
GET_ARGUMENT_L("editer_cotes=""cotes=",editer_les_cotes);
GET_ARGUMENT_L("editer_sommets=""sommets=",editer_les_sommets);
)
);
Test(IL_FAUT(centrer_le_premier_rectangle))
Bblock
EGAL(X_sommet_bas_gauche,ADD2(SOUS(FXmilieu,INVERSER_EVENTUELLEMENT_OX(MOIT(cote_horizontal))),translation_OX));
EGAL(Y_sommet_bas_gauche,ADD2(SOUS(FYmilieu,INVERSER_EVENTUELLEMENT_OY(MOIT(cote_vertical__))),translation_OY));
Eblock
ATes
Bblock
Eblock
ETes
begin_nouveau_block
Bblock
DEFV(Float,INIT(cote_horizontal_courant,cote_horizontal));
DEFV(Float,INIT(cote_vertical___courant,cote_vertical__));
/* Definition des deux cotes d'un rectangle. */
DEFV(pointF_2D,sommet_A);
DEFV(pointF_2D,sommet_B);
DEFV(pointF_2D,sommet_C);
DEFV(pointF_2D,sommet_D);
/* Definition des sommets du rectangle. */
INITIALISATION_POINT_2D(sommet_A,NEUT(X_sommet_bas_gauche),NEUT(Y_sommet_bas_gauche));
/* Initialisation du sommet 'A' qui ne changera pas au cours des iterations... */
Test(IFLE(premiere_image,derniere_image))
Bblock
DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images)
Bblock
INITIALISATION_POINT_2D(sommet_B
,ADD2(ASD1(sommet_A,x),INVERSER_EVENTUELLEMENT_OX(cote_horizontal_courant))
,NEUT(ASD1(sommet_A,y))
);
INITIALISATION_POINT_2D(sommet_C
,NEUT(ASD1(sommet_B,x))
,ADD2(ASD1(sommet_B,y),INVERSER_EVENTUELLEMENT_OY(cote_vertical___courant))
);
INITIALISATION_POINT_2D(sommet_D
,SOUS(ASD1(sommet_C,x),INVERSER_EVENTUELLEMENT_OX(cote_horizontal_courant))
,NEUT(ASD1(sommet_C,y))
);
/* Calcul des sommets 'B', 'C' et 'D' qui se deplacent au cours des iterations... */
EDITION_DES_COTES(VRAI,"CoteHorizontal=%+.^^^",cote_horizontal_courant);
EDITION_DES_COTES(VRAI,"CoteVertical=%+.^^^",cote_vertical___courant);
EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xA=%+.^^^ yA=%+.^^^",ASD1(sommet_A,x),ASD1(sommet_A,y));
EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xB=%+.^^^ yB=%+.^^^",ASD1(sommet_B,x),ASD1(sommet_B,y));
EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xB=%+.^^^ yB=%+.^^^",ASD1(sommet_B,x),ASD1(sommet_B,y));
EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xC=%+.^^^ yC=%+.^^^",ASD1(sommet_C,x),ASD1(sommet_C,y));
EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xC=%+.^^^ yC=%+.^^^",ASD1(sommet_C,x),ASD1(sommet_C,y));
EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xD=%+.^^^ yD=%+.^^^",ASD1(sommet_D,x),ASD1(sommet_D,y));
EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xD=%+.^^^ yD=%+.^^^",ASD1(sommet_D,x),ASD1(sommet_D,y));
EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xA=%+.^^^ yA=%+.^^^",ASD1(sommet_A,x),ASD1(sommet_A,y));
fSWAP(cote_horizontal_courant,cote_vertical___courant);
EGAL(cote_horizontal_courant,DIVI(cote_horizontal_courant,rapport_de_reduction));
EGAL(cote_vertical___courant,DIVI(cote_vertical___courant,rapport_de_reduction));
/* Rotation et reduction... */
Eblock
EDoI
Eblock
ATes
Bblock
PRINT_ERREUR("la relation d'ordre stricte ('premier < dernier') n'est pas respectee");
Eblock
ETes
Eblock
end_nouveau_block
RETU_Commande;
Eblock
ECommande