Tapis de Sierpi?ski (programme informatique) - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Ces programmes récursifs écrits en langages Java, C et Caml génèrent des tapis de Sierpiński.

La fonction TapisSierpinsky rédigée en Caml vous permet non seulement d'obtenir un tapis de Sierpiński, mais également de colorer les différents carrés selon leur taille en redéfinissant constamment la couleur en fonction de paramètres tels que la longueur (lng) ou la hauteur (htr).

        let rec TapisSierpinsky x y lng htr =          if lng > 2 && htr > 2 then begin            let nlng = lng / 3 and nhtr = htr / 3 in            set_color (rgb (9 * lng) (3 * lng) htr);            fill_rect (x + nlng) (y + nhtr) nlng nhtr;            for k = 0 to 8 do              if k <> 4 then let i = k / 3 and j = k mod 3 in              TapisSierpinsky (x + i * nlng) (y + j * nhtr) nlng nhtr            done;          end;;      

Le programme Java est un applet, dont la méthode drawSierpinskiCarpet est récursive:

       import java.awt.*;       import java.applet.*;              public class SierpinskiCarpet extends Applet {           private Graphics g=null;           private int d0=729; // 3^6                  public void init() {               g=getGraphics();               resize(d0,d0);           }                  public void paint(Graphics g) {               //  démarrez la récursion:               drawSierpinskiCarpet ( 0, 0, getWidth(), getHeight() );           }                  private void drawSierpinskiCarpet(int xHG, int yHG, int largeur, int hauteur) {               if (largeur>2 && hauteur>2) {                   int w=largeur/3, h=hauteur/3;                   g.fillRect ( xHG+w, yHG+h, w, h );                   for (int k=0;k<9;k++) if (k!=4) {                       int i=k/3, j=k%3;                       drawSierpinskiCarpet ( xHG+i*w, yHG+j*h, w, h ); // récursion                   }               }           }       }      

Pour le programme en langage C on procède différemment que dans le programme écrit pour les triangles de Sierpiński. Au lieu de dessiner à chaque fois une forme et d'en enlever un morceau, on enlève des morceaux à une seule forme dessinée une fois pour toute ; c'est-à-dire que l'on « gruyèrise » un rectangle.

      /* pour compiler taper en ligne de commande:         gcc tapis.c -o tapis `allegro-config --libs`         pour exécuter taper tapis suivi du nombre d'itérations:         tapis 7 */             #include       #include       #include              #define MAXX 768      #define MAXY 665      #define OX 5       #define OY 5      #define TX 758      #define TY 655             BITMAP *bmp;             /* fonction récursive, qui a pour paramètres          les coordonnées (x, y) d'un des sommets d'un rectangle,         a la longueur et b la largeur de ce rectangle  et,         n le nombre d'itérations */             void tapis_Sierpinski(double x, double y, double a, double b, int n)      {        if (n>0)          {            /* on supprime le petit rectangle central */            rectfill(bmp, (int) (x+a/3), (int) (y+b/3), (int) (x+2*a/3), (int)(y+2*b/3), 8);            /* appels récursifs pour les huit rectangles restants */            tapis_Sierpinski(x, y, a/3, b/3, n-1);            tapis_Sierpinski(x+a/3, y, a/3, b/3, n-1);            tapis_Sierpinski(x+2*a/3, y, a/3, b/3, n-1);            tapis_Sierpinski(x, y+b/3, a/3, b/3, n-1);            tapis_Sierpinski(x+2*a/3, y+b/3, a/3, b/3, n-1);            tapis_Sierpinski(x, y+2*b/3, a/3, b/3, n-1);            tapis_Sierpinski(x+a/3, y+2*b/3, a/3, b/3, n-1);            tapis_Sierpinski(x+2*a/3, y+2*b/3, a/3, b/3, n-1);          } else                   /* on dessine un rectangle plein */            rectfill(bmp, (int) x, (int) y, (int) (x+a), (int)(y+b), 1);      }             int main(int argc, char *argv[])      {        unsigned long n=1;        if (argc>1) n=strtoul(argv[1], NULL, 10);               /* initialisation de allegro */        allegro_init();               set_color_depth(8);               bmp = create_bitmap(MAXX, MAXY);        if(!bmp)          {            allegro_message("Ne peut pas créer l'image\n");            return 1;          }               tapis_Sierpinski(OX, OY, TX, TY, (int)n);               save_bitmap("Tapis_de_Sierpinski.pcx", bmp, desktop_palette);        destroy_bitmap(bmp);               return 0;      }             END_OF_MAIN();      /* note finale des programmes allegro */      
Page générée en 0.082 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise