Transwiki:Triangle de Sierpiński (programme informatique)

Un livre de Wikibooks.

Information icon.svg
Information :

Page à intégrer dans le livre de Programmation C.

Ces programmes récursifs écrits en C soit Java, permettent de générer des triangles de Sierpiński.

[modifier] En C

Ce programme utilise la bibliothèque graphique Allegro.

/* pour compiler taper en ligne de commande :
   gcc triangle.c -o triangle `allegro-config --libs`
   pour exécuter taper triangle suivi du nombre d'itérations :
   triangle 7
   */
 
#include <stdlib.h>
#include <math.h>
#include "allegro.h"
 
#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) de l'extrémité gauche de la base d'un triangle équilatéral, 
   a la longueur d'un de ses cotés et 
   n le nombre d'itérations */
 
void triangle_Sierpinski(double x, double y, double a, int n)
{
  double b=-a*sqrt(3.0)/2;
  /* négatif à cause de l'orientation 
     de l'axe des ordonnées vers le bas */
  if (n>0)
    {
      /* on dessine un triangle plein */
      triangle(bmp, (int) x, (int) y, (int) (x+a), (int)y, (int)(x+a/2),(int)(y+b), 4);
      /* et on supprime le petit triangle central */
      triangle(bmp, (int) (x+a/2), (int) y, (int) (x+3*a/4), (int)(y+b/2), (int)(x+a/4),(int)(y+b/2), 0);
      /* appels récursifs */
      triangle_Sierpinski(x, y, a/2, n-1);
      triangle_Sierpinski(x+a/2, y, a/2, n-1);
      triangle_Sierpinski(x+a/4, y+b/2, a/2, n-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);
 
  /* fixe la palette */
  set_palette(desktop_palette);
 
  bmp = create_bitmap(MAXX, MAXY);
  if(!bmp)
    {
      allegro_message("Ne peut pas créer l'image\n");
      return 1;
    }
 
  triangle_Sierpinski(OX, OY+TY, TX, (int)n);
 
  save_bitmap("Triangle_de_Sierpinski.pcx", bmp, desktop_palette);
  destroy_bitmap(bmp);
 
  return 0;
}
 
END_OF_MAIN();
/* note finale des programmes allegro */