Forum > C et C++ > Fractale : triangle de Sierpinski >

Fractale : triangle de Sierpinski

répondre

première page page précédente page suivante dernière page

Navigation rapide :

Auteur Message
jeremya Posté le 21 avr 2009 16:33:43

Administrateur
Administrateur

Auteur
Auteur

Modérateur
Modérateur

Inscrit le : 08 nov 2008
Localisation : Nord-Pas-de-Calais
Emploi :
Loisirs :

PROBLEME

Une image qui a une apparence similaire quelle-que soit l'échelle à laquelle on l'observe est appelée une fractale (il y a d'autres types de fractales).

Un exemple simple de fractale est le triangle de Sierpinski, dont voici une représentation :

triangle de Sierpinski

Une telle image peut être réalisée en quelques minutes avec n'importe-quel logiciel de dessin. On commence par former un triangle de trois pixels. On en fait ensuite trois copies que l'on utilise pour former un plus grand triangle, et on recommence l'opération avec ce nouveau triangle, et ainsi de suite, jusqu'à obtenir une figure de la taille souhaitée.

Voici une vue zoomée des trois premières étapes de l'opération :

construction triangle de Sierpinski

Les dimensions de la figure étant multipliées par 2 à chaque nouvelle étape, le côté de la figure finale est une puissance de 2.

Ecrivez un programme qui lit un nombre sur l'entrée standard (une puissance de 2), et affiche un triangle de Sierpinski de la taille indiquée.

Les pixels noirs doivent être affichés sous la forme de caractères '#', et les pixels blancs sous la forme d'espaces. N'affichez pas d'espaces à la fin des lignes, lorsqu'il n'y a plus de caractères '#' sur la ligne.

Conseil : créez l'image dans un tableau avec une fonction récursive, avant d'afficher le contenu de ce tableau.

Votre programme doit impérativement être basé sur une fonction récursive, et non sur des boucles..

CONTRAINTES

1 <= N <= 64, où N est le côté de la figure.

ENTREE

Un entier : la taille du côté de la figure.

SORTIE

Le triangle de Sierpinski de la taille fournie en entrée.

CODE SOURCE

Code: C++
  1. #include <cstdio>
  2.  
  3. char image[64][64];
  4.  
  5. void triangle(unsigned int x, unsigned int y, unsigned int n)
  6. {
  7. if (n == 0)
  8. return;
  9.  
  10. if (n == 1) {
  11. image[x][y] = '#';
  12. return;
  13. }
  14.  
  15. triangle(x, y, n>>1);
  16. triangle(x + (n>>1), y, n>>1);
  17. triangle(x, y + (n>>1), n>>1);
  18. }
  19.  
  20. int main(int argc, char* argv[])
  21. {
  22. unsigned int N;
  23.  
  24. scanf_s("%u", &N);
  25.  
  26. for (unsigned int i=0; i<N; i++)
  27. for (unsigned int j=0; j<N; j++)
  28. image[i][j] = ' ';
  29.  
  30. triangle(0, 0, N);
  31.  
  32. for (unsigned int i=0; i<N; i++) {
  33. unsigned int n = N;
  34. for (unsigned int j=N-1; j>=0; --j) {
  35. if (image[i][j] == ' ')
  36. n--;
  37. else
  38. break;
  39. }
  40. for (unsigned int j=0; j<n; j++)
  41. putchar(image[i][j]);
  42. putchar('\n');
  43. }
  44.  
  45. return 0;
  46. }
  47.  
Messages : 284 http://www.jeremya.ironie.org citer

répondre

première page page précédente page suivante dernière page

Navigation rapide :

Forum > C et C++ > Fractale : triangle de Sierpinski >


Cette page a été générée le 16 mar 2010 13:45:49.
page d'accueil Jeremya's Web Site
jeremya.ironie.org

s'identifier

Nom d'utilisateur :
Mot de passe :

outils

qui est en ligne ?

2 visiteurs en ligne