/*************************************************************************************************************************************/ /* */ /* P L A C E M E N T A L E A T O I R E D E D O M I N O S D A N S L E P L A N : */ /* */ /* */ /* Author of '$xtc/dominos.11$c' : */ /* */ /* John F. Kolonna (LACTAMME, 20230804113616). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" extern void *malloc(); extern void srand48(); extern double drand48(); static int dimX=0; #define Xmin 0 #define Xmax (Xmin + (dimX-1)) /* Definition des abscisses. */ static int dimY=0; #define Ymin 0 #define Ymax (Ymin + (dimY-1)) /* Definition des ordonnees. */ #define DIMENSION_XY \ 8 #define FACTEUR_XY \ 1 #define FACTEUR_X \ (FACTEUR_XY*8) #define FACTEUR_Y \ (FACTEUR_XY*8) #define dimX_effectif \ (FACTEUR_X*dimY) #define dimY_effectif \ (FACTEUR_Y*dimY) #define IMAGE(x,y) \ (*(image + ((((y)-Ymin)*dimY_effectif) + ((x)-Xmin)))) \ /* Acces a un point de l'image. */ #define store(n,x,y) \ { \ if ((x >= Xmin) && (x <= Xmax) && (y >= Ymin) && (y <= Ymax)) \ { \ IMAGE(x,y) = n; \ } \ else \ { \ } \ } \ /* Rangement d'un point valide d'une image. */ #define GRAINE_DU_GENERATEUR_ALEATOIRE \ 1789 #define SEUIL_CHOIX_ORIENTATION \ 0.5 #define NIVEAU_VIDE______ \ NOIR #define NIVEAU_HORIZONTAL \ (BLANC/1) #define NIVEAU_VERTICAL__ \ (BLANC/2) #define NIVEAU_GRILLE____ \ (BLANC/4) enum ModesDisponibles { LigneLigne_HV=1 ,LigneLigne_VH ,ColonneColonne_HV ,ColonneColonne_VH ,SpiraleCarree ,Aleatoire }; int mode=LigneLigne_HV; /* Definition du mode de parcours du domaine : */ /* */ /* mode=1 : Ligne apres ligne (HV), */ /* mode=2 : Ligne apres ligne (VH), */ /* mode=3 : Colonne apres colonne (HV), */ /* mode=4 : Colonne apres colonne (VH), */ /* mode=5 : Suivant une spirale "caree", */ /* mode=6 : Mode aleatoire. */ /* */ #define FACTEUR_ALEATOIRE \ 100 #define TEST_IMAGE(x,y) \ IMAGE(((x)*FACTEUR_X)+(FACTEUR_X/2),((y)*FACTEUR_Y)+(FACTEUR_Y/2)) #define TRACE_RECTANGLE(x,y,nx,ny,niveau) \ { \ int xc; \ int yc; \ int xcm=((x)*FACTEUR_X); \ int ycm=((y)*FACTEUR_Y); \ int xcM=((x+nx)*FACTEUR_X)-1; \ int ycM=((y+ny)*FACTEUR_Y)-1; \ \ for (xc=xcm ; xc <= xcM ; xc++) \ { \ for (yc=ycm ; yc <= ycM ; yc++) \ { \ IMAGE(xc,yc) = \ COND(IFOU(IFOU(IFEQ(xc,xcm),IFEQ(xc,xcM)) \ ,IFOU(IFEQ(yc,ycm),IFEQ(yc,ycM)) \ ) \ ,NIVEAU_GRILLE____ \ ,niveau \ ); \ } \ } \ \ if (niveau == NIVEAU_HORIZONTAL) \ { \ CompteurH++; \ } \ else \ { \ if (niveau == NIVEAU_VERTICAL__) \ { \ CompteurV++; \ } \ else \ { \ fprintf(stderr,"Le niveau %d n'est pas reconnu\n",niveau); \ } \ } \ } #define TENTATIVE_HORIZONTALE(x,y) \ { \ if (TEST_IMAGE(x+1,y) == NIVEAU_VIDE______) \ { \ TRACE_RECTANGLE(x,y,2,1,NIVEAU_HORIZONTAL); \ /* Trace d'un rectangle horizontal 2x1. */ \ } \ else \ { \ if (TEST_IMAGE(x,y+1) == NIVEAU_VIDE______) \ { \ TRACE_RECTANGLE(x,y,1,2,NIVEAU_VERTICAL__); \ /* Trace d'un rectangle vertical 1x1. */ \ } \ else \ { \ } \ } \ } #define TENTATIVE_VERTICALE__(x,y) \ { \ if (TEST_IMAGE(x,y+1) == NIVEAU_VIDE______) \ { \ TRACE_RECTANGLE(x,y,1,2,NIVEAU_VERTICAL__); \ /* Trace d'un rectangle vertical 1x1. */ \ } \ else \ { \ if (TEST_IMAGE(x+1,y) == NIVEAU_VIDE______) \ { \ TRACE_RECTANGLE(x,y,2,1,NIVEAU_HORIZONTAL); \ /* Trace d'un rectangle horizontal 2x1. */ \ } \ else \ { \ } \ } \ } #define DEFINITION_TUILE_1x2(x,y,test,tentative_1,tentative_2) \ { \ if (TEST_IMAGE(x,y) == NIVEAU_VIDE______) \ { \ double random=drand48(); \ \ if test \ { \ tentative_1; \ } \ else \ { \ tentative_2; \ } \ } \ else \ { \ } \ } #define PARCOURS_SEQUENTIEL(boucle1,boucle2,test,tentative_1,tentative_2) \ { \ for boucle1 \ { \ for boucle2 \ { \ DEFINITION_TUILE_1x2(x,y,test,tentative_1,tentative_2); \ } \ } \ } void main(int argc,char *argv[]) { int x,y; /* Definition des coordonnees. */ unsigned char *image; /* Definition de l'image a generer... */ int CompteurH=0; int CompteurV=0; if (argc > 1) { mode=atoi(argv[1]); /* Recuperation du mode de remplissage... */ } else { } if (FACTEUR_XY == 1) { Get(dimX,"dimX"); Get(dimY,"dimY"); /* Recuperation des dimensions en 'X' et en 'Y' de l'image a generer. */ } else { dimX=DIMENSION_XY; dimY=DIMENSION_XY; } image=malloc(dimX_effectif*dimY_effectif); /* Definition de l'image a generer... */ srand48(GRAINE_DU_GENERATEUR_ALEATOIRE); for (y=Ymin ; y<=(dimY_effectif-1) ; y++) { for (x=Xmin ; x<=(dimX_effectif-1) ; x++) { store(NIVEAU_VIDE______,x,y); } } switch (mode) { case LigneLigne_HV: /* Mode ligne par ligne (HORIZONTALE,VERTICALE__) : */ { PARCOURS_SEQUENTIEL((y=Ymin ; y<=(Ymax-1) ; y++) ,(x=Xmin ; x<=(Xmax-1) ; x++) ,(random < SEUIL_CHOIX_ORIENTATION) ,TENTATIVE_HORIZONTALE(x,y) ,TENTATIVE_VERTICALE__(x,y) ); break; } case LigneLigne_VH: /* Mode ligne par ligne (VERTICALE__,HORIZONTALE) : */ { PARCOURS_SEQUENTIEL((y=Ymin ; y<=(Ymax-1) ; y++) ,(x=Xmin ; x<=(Xmax-1) ; x++) ,(random < SEUIL_CHOIX_ORIENTATION) ,TENTATIVE_VERTICALE__(x,y) ,TENTATIVE_HORIZONTALE(x,y) ); break; } case ColonneColonne_HV: /* Mode colonne par colonne (HORIZONTALE,VERTICALE__) : */ { PARCOURS_SEQUENTIEL((x=Xmin ; x<=(Xmax-1) ; x++) ,(y=Ymin ; y<=(Ymax-1) ; y++) ,(random < SEUIL_CHOIX_ORIENTATION) ,TENTATIVE_HORIZONTALE(x,y) ,TENTATIVE_VERTICALE__(x,y) ); break; } case ColonneColonne_VH: /* Mode colonne par colonne (VERTICALE__,HORIZONTALE) : */ { PARCOURS_SEQUENTIEL((x=Xmin ; x<=(Xmax-1) ; x++) ,(y=Ymin ; y<=(Ymax-1) ; y++) ,(random < SEUIL_CHOIX_ORIENTATION) ,TENTATIVE_VERTICALE__(x,y) ,TENTATIVE_HORIZONTALE(x,y) ); break; } case SpiraleCarree: /* Mode spirale "carre" : */ { int x = Xmin+(dimX / 2); int y = Ymin+(dimY / 2); int SdeltaX = 1; int SdeltaY = 0; int Slongueur_du_bras = 1; int Snombre_de_points = 0; int index; for (index = 1 ; index <= ((dimX * dimY) + ((dimX + dimY) * 2)) ; index++) { if ((x >= Xmin) && (x <= (Xmax-1)) && (y >= Ymin) && (y <= (Ymax-1))) { DEFINITION_TUILE_1x2(x ,y ,(random < SEUIL_CHOIX_ORIENTATION) ,TENTATIVE_HORIZONTALE(x,y) ,TENTATIVE_VERTICALE__(x,y) ); } else { } if (Snombre_de_points == 0) { Snombre_de_points = Slongueur_du_bras; } else { } x += SdeltaX; y += SdeltaY; Snombre_de_points--; if (Snombre_de_points == 0) { int intermediaire; if (SdeltaX == 0) { Slongueur_du_bras++; } else { } intermediaire = SdeltaX ^ SdeltaY; SdeltaX ^= intermediaire; SdeltaY ^= intermediaire; SdeltaX = - SdeltaX; /* Parcours de la spirale "carre" : ... */ } else { } } Snombre_de_points++; break; } case Aleatoire: /* Mode aleatoire : */ { int index; for (index = 1 ; index <= (FACTEUR_ALEATOIRE*(dimX * dimY)) ; index++) { int x = Xmin+((int)Xmax*drand48()); int y = Ymin+((int)Ymax*drand48()); if ((x >= Xmin) && (x <= Xmax) && (y >= Ymin) && (y <= Ymax)) { DEFINITION_TUILE_1x2(x ,y ,(random < SEUIL_CHOIX_ORIENTATION) ,TENTATIVE_HORIZONTALE(x,y) ,TENTATIVE_VERTICALE__(x,y) ); } else { } } break; } default: { fprintf(stderr,"Le mode %d n'est pas reconnu\n",mode); break; } } write(1,image,dimX_effectif*dimY_effectif); /* Sortie de l'image... */ fprintf(stderr,"CompteurH=%d\n",CompteurH); fprintf(stderr,"CompteurV=%d\n",CompteurV); }