Advertisement
tresonance

essai_optimisation

Jun 13th, 2020
945
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.25 KB | None | 0 0
  1. #include <stdlib.h>/* Chargement des bibliothèque */
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include "libimage.h"
  5. #include "libimage.c"
  6.  
  7. #define NOM_IMAGE "dendrites.ppm" /* les paramètres de l'image*/
  8. #define LARGEUR 150               /* on peut modifier la largeur en modifiant le chiffre*/
  9. #define HAUTEUR 150               /* on peut modifier la hauteur en modifiant le chiffre*/
  10. #define GRAINE 100                /* on peut modifier le pas de nombre aléatoire en modifiant le nombre de graines*/
  11.  
  12. /*Fonctions usuelles aux programmes données dans le sujet */
  13.  
  14. /* Le générateur de nombres pseudo-aléatoires */
  15. static unsigned long suivant = 1;
  16.  
  17. #define ALEA_MAX 32767
  18.  
  19. int alea(void)
  20. {
  21.     suivant = suivant * 1103515245 + 12345;
  22.     return ((unsigned)(suivant / 65536) % 32768);
  23. }
  24.  
  25. void init_alea(unsigned int graine)
  26. {
  27.     suivant = graine;
  28. }
  29.  
  30. typedef struct /* stockage des coordonnées d'un point généré */
  31. {
  32.     int x;
  33.     int y;
  34. } point;
  35.  
  36. int lance_de(int n) /* simulation du lancement d'un dé à n faces */
  37. {
  38.     int diviseur = ALEA_MAX / n;
  39.     int res;
  40.     do
  41.     {
  42.         res = alea() / diviseur;
  43.     } while (res > n - 1);
  44.     return res + 1;
  45. }
  46.  
  47. point point_au_hasard() // A ETE MODIFIE, juste caster la structure de sortie
  48. {
  49.     return (point) { lance_de(LARGEUR) - 1, lance_de(HAUTEUR) - 1 }
  50. }
  51.  
  52. point torique(point Ivrogne) // A ETE MODIFIE: J'ai utilise les ternaires, plus pratiques
  53. {    
  54.  
  55.     Ivrogne.x = (Ivrogne.x > LARGEUR - 1) ? Ivrogne.x - LARGEUR : Ivrogne.x < 0 ?  Ivrogne.x + LARGEUR : Ivrogne.x;
  56.     Ivrogne.y = (Ivrogne.y > HAUTEUR - 1) ? Ivrogne.y - HAUTEUR : Ivrogne.y < 0 ?  Ivrogne.y + HAUTEUR : Ivrogne.y;
  57.     return Ivrogne;
  58. }
  59.  
  60. int point_noir(image im, point Ivrogne) // A ETE MODIFIE
  61. {
  62.     point p0 = (point){Ivrogne.x, Ivrogne.y};
  63.     point p1 = (point){p0.x - 1, p0.y - 1};
  64.     p1 = torique(p1);
  65.     point p2 = (point){p0.x, p0.y - 1};
  66.     p2 = torique(p2);
  67.  
  68.     point p3 = (point){p0.x + 1, p0.y - 1};
  69.     p3 = torique(p3);
  70.  
  71.     point p4 = (point){p0.x - 1, p0.y};
  72.     p4 = torique(p4);
  73.  
  74.     point p5 = (point){p0.x + 1, p0.y};
  75.     p5 = torique(p5);
  76.  
  77.     point p6 = (point){p0.x - 1, p0.y + 1};
  78.     p6 = torique(p6);
  79.  
  80.     point p7 = (point){p0.x, p0.y + 1};
  81.     p7 = torique(p7);
  82.  
  83.     point p8 = (point){p0.x + 1, p0.y + 1};
  84.     p8 = torique(p8);
  85.  
  86.     int accept = 0;
  87.  
  88.     /*Test cases environnantes et ériture le cas échéant*/
  89.     couleur c[9] = { lire_couleur(im, p0.x, p0.y), lire_couleur(im, p1.x, p1.y), lire_couleur(im, p2.x, p2.y),
  90.                      lire_couleur(im, p3.x, p3.y), lire_couleur(im, p4.x, p4.y), lire_couleur(im, p5.x, p5.y),
  91.                      lire_couleur(im, p6.x, p6.y), lire_couleur(im, p7.x, p7.y), lire_couleur(im, p8.x, p8.y)
  92.     };
  93.  
  94.     (c[0].bleu + c[0].rouge + c[0].vert) == (255 * 3) ?  accept++ : NULL;
  95.     (c[1].bleu + c[1].rouge + c[1].vert) == (255 * 3) ?  accept++ : NULL;
  96.     (c[2].bleu + c[2].rouge + c[2].vert) == (255 * 3) ?  accept++ : NULL;
  97.     (c[3].bleu + c[3].rouge + c[3].vert) == (255 * 3) ?  accept++ : NULL;
  98.     (c[4].bleu + c[4].rouge + c[4].vert) == (255 * 3) ?  accept++ : NULL;
  99.     (c[5].bleu + c[5].rouge + c[5].vert) == (255 * 3) ?  accept++ : NULL;
  100.     (c[6].bleu + c[6].rouge + c[6].vert) == (255 * 3) ?  accept++ : NULL;
  101.     (c[7].bleu + c[7].rouge + c[7].vert) == (255 * 3) ?  accept++ : NULL;
  102.     (c[8].bleu + c[8].rouge + c[8].vert) == (255 * 3) ?  accept++ : NULL;
  103.  
  104.     return accept;
  105. }
  106.  
  107. int main()
  108. {
  109.     int compteur_dendrites = 0; /*Declaration des variables*/
  110.     int Surface, i, j;
  111.     int accept = 0;
  112.  
  113.     init_alea(GRAINE); /*initialisation alea*/
  114.  
  115.     image im = nouvelle_image(LARGEUR, HAUTEUR);
  116.  
  117.     point Point_centre = (point){floor(LARGEUR / 2), floor(HAUTEUR / 2) }; //ANCIEN A ETE MODIFIE
  118.    
  119.     point Ivrogne;
  120.  
  121.     Surface = HAUTEUR * LARGEUR;
  122.  
  123.     couleur blanc = (couleur){255, 255, 255};//ANCIEN A ETE MODIFIE
  124.  
  125.     couleur noir = (couleur){0, 0, 0};
  126.  
  127.     /*démarrage du programme*/
  128.     for (i = 0; i < LARGEUR; i++) /*création du fond en blanc*/
  129.     {
  130.         for (j = 0; j < HAUTEUR; j++)
  131.         {
  132.             change_couleur(im, i, j, blanc);
  133.         }
  134.     }
  135.     change_couleur(im, Point_centre.x, Point_centre.y, noir); /*Coloration en noir du germe en centre de page*/
  136.     while (compteur_dendrites < Surface / 5)                  /*on peut faire varier le % de surface en  modifiant le diviseur*/
  137.     {
  138.         while (accept < 9) /*règle limitante: le point n'est pas proche d'un point noir*/
  139.         {
  140.             Ivrogne = point_au_hasard(); /*caractéristiques des ivrognes*/
  141.             Ivrogne = torique(Ivrogne);
  142.             accept = point_noir(im, Ivrogne);
  143.         }
  144.         while (accept == 9) //ANCIEN A ETE MODIFIE (voir ci-dessous)
  145.         {
  146.             switch (lance_de(8)) /* règle d'ecriture des coordonnées pour chaque nouvelle case générée*/
  147.             {
  148.             case 1:
  149.                 Ivrogne = (point) { Ivrogne.x - 1, Ivrogne.y - 1 };
  150.                 break;
  151.             case 2:
  152.                 Ivrogne = (point){Ivrogne.x, Ivrogne.y - 1};
  153.                 break;
  154.             case 3:
  155.                 Ivrogne = (point){Ivrogne.x + 1, Ivrogne.y - 1};
  156.                 break;
  157.             case 4:
  158.                 Ivrogne = (point){Ivrogne.x - 1, Ivrogne.y};
  159.                 break;
  160.             case 5:
  161.                 Ivrogne = (point){Ivrogne.x + 1, Ivrogne.y};
  162.                 break;
  163.             case 6:
  164.                 Ivrogne = (point){Ivrogne.x - 1, Ivrogne.y + 1};
  165.                 break;
  166.             case 7:
  167.                 Ivrogne = (point){Ivrogne.x , Ivrogne.y + 1};
  168.                 break;
  169.             case 8:
  170.                 Ivrogne = (point){Ivrogne.x + 1, Ivrogne.y + 1};
  171.                 break;
  172.             default:
  173.                 printf("Erreur fonction (lance_de())");
  174.                 break;
  175.             }
  176.             Ivrogne = torique(Ivrogne);
  177.             accept = point_noir(im, Ivrogne);
  178.         }
  179.         change_couleur(im, Ivrogne.x, Ivrogne.y, noir);
  180.         compteur_dendrites++;
  181.         printf("Compteur creation pixel noir: %d \n", compteur_dendrites);
  182.     }
  183.     ecrire_image(im, NOM_IMAGE); /* nommer l'image générée*/
  184.     detruire_image(im);          /*écraser l'image existante si non renommée*/
  185.     return (0);
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement