Aller au menu - Aller au contenu
Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !

[cod'Art] Tapis de Sierpinski

Pour toutes vos créations autour de cette fractale

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1 
Hors ligne Furzel # Posté le 05/07/2007 à 18:11:17
Vive open arena !
Avatar

Postez ici toutes vos créations autour du tapis de Sierpinski afin de garde le topic principale de cod'Art lisible


mon ptit carré de Sierpinski :

http://img362.imageshack.us/img362/3910/captureaout14gy6.png

et le code :

Code : C

# include <stdio.h>
# include <stdlib.h>
# include <SDL/SDL.h>
# include <math.h>


void pause()                         // fonction de pause pour avoir le temp de voir sa création
{
    int continuer = 1;
    SDL_Event event;

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
        }
    }
}
int main ()
{
        SDL_Surface *carre=NULL, *ecran=NULL;
        SDL_Rect position;                                         
        SDL_Rect position_00;
        int x,y,i,xx=1,yy=1;
        int nombre = 6;           // Definition du nombre de carre de taille différente
        int cote=pow(3,nombre);         // On definit le coté de manière a ce qu'il soit multiple de 3
        position_00.x=0;
        position_00.y=0;
        position.x=0;
        position.y=0;
        if (SDL_Init(SDL_INIT_VIDEO)==-1)                                           
        {
                fprintf(stderr,"Erreur d'initialisation de la SDL");                   
                exit(EXIT_FAILURE);
        }
        ecran=SDL_SetVideoMode(cote,cote,32,SDL_HWSURFACE);                                   
        if (ecran==NULL)
        {
                fprintf(stderr,"Erreur d'inialisation du mode vidéo %s",SDL_GetError());
                exit(EXIT_FAILURE);                                                                     
        }
        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));
        SDL_Flip(ecran);
        for (i=0;i<nombre;i++)                  // La SDL est initialisé on entre dans la boucle principale
        {
                for (x=0;x<xx;x++)                                                      // Boucles pour afficher le bon nombre de carré à chaque fois
                        for (y=0;y<yy;y++)
                                {
                                        carre=SDL_CreateRGBSurface(SDL_HWSURFACE,cote/3,cote/3,32,0,0,0,0)// On cree la surface : un caré avec pour coté le tier du précédent
                                        SDL_FillRect(carre,NULL,SDL_MapRGB(ecran->format,0,0,0)); // on rempli de noir
                                        position.x=(1+(3*x))*(cote/3)// Calcul de la position vertical du carré
                                        position.y=(1+(3*y))*(cote/3)// Calcul de la position horizontal du carré
                                        SDL_BlitSurface(carre,NULL,ecran,&position); // On affiche enfin le carré
                                        SDL_Flip(ecran);
                                }
                cote=cote/3; // on divise par 3 le coté de l'ancien carré pour passer a la taille en dessous
                xx=xx*3; // on va afficher 3 fois plus de carré horizontalement
                yy=yy*3; // on va afficher 3 fois plus de carré verticalement
        }
        pause();
        return 0;
}
               
 


Et sinon un peu HS , mais j'ai utiliser le dit carré géneré par ce code en tant que masque de calque sur une autre image : http://programs.rednox.net/area51/FURZEL/tapis_color.png


EDIT : Voila c'est commenter pour l'indentation j'ai le même problème a l'affichage pourtant il est indenter dans la source du message

EDIT 2 : Mea culpa pour le : C , ra regle l'indentation de surplus
Édité le 05/07/2007 à 20:55:32 par Furzel
Publicité # Posté le 05/07/2007 à 18:11:17

Hors ligne anonyme # Posté le 05/07/2007 à 19:13:15

Même remarque que sur l'autre topic, tu peux pas rendre ton code plus présentable ? (commentaires par exemple, ensuite c'est peut-être moi mais j'ai pas d'indentation).

Ça serait gentil pour ceux qu'il intéresse :) .
Hors ligne ne0chaotic # Posté le 05/07/2007 à 20:17:49
[ 26.457239] Kernel Panic
Avatar

Pourquoi pas code : C ? Parce que là...
Hors ligne Baptiste Wicht # Posté le 06/07/2007 à 07:57:01
Certes...
Avatar
Flux RSS

Voilà, une petite version en Java :

Image utilisateur

Voici le code :

Code : Java
package sierpinski;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Tapis extends JPanel {
        private static final long serialVersionUID = 6899161860200488093L;

        public Tapis(){
                super();
               
                setOpaque(false);
                setBackground(Color.white);
                setPreferredSize(new Dimension(500,500));
        }
       
        public static void main(String[] args) {
                JFrame frame = new JFrame("Tapis de sierpinski");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new Tapis());
                frame.pack();
                frame.setVisible(true);
        }
       
        public void paint(Graphics g) {
                int nbreX = 1;
                int nbreY = 1;
       
                int nbre = 3;
                int tailles = 6;
       
                int cote= (int)Math.pow(nbre, tailles);
               
                g.setColor(Color.white);
                g.fillRect(0, 0, getSize().width, getSize().height);
               
                g.setColor(Color.black);
               
                for (int i = 0; i < tailles; i++){
                        for (int x = 0; x < nbreX; x++){
                                for (int y =0; y < nbreY; y++){
                                        int xPosition = (1 + (nbre  * x)) * (cote / nbre);
                                        int yPosition = (1 + (nbre * y)) * (cote / nbre);
                                       
                                        g.fillRect(xPosition, yPosition, cote / nbre, cote / nbre);
                                }
                        }
                       
                        cote /= nbre;
                        nbreX *= nbre;
                        nbreY *= nbre;
                }
               
                super.paint(g);
        }
}


Par contre, j'ai pas trouvé de valeurs qui font que ce soit plus joli, donc j'ai gardé les mêmes valeurs que toi Furzel.
 
Hors ligne guimers8 # Posté le 06/07/2007 à 14:29:26
Cocoa/ObjC
Avatar

Ville : Grenoble
Pays : France métropolitaine

En voilà un pas trop moche :-°
Image utilisateur

Image utilisateur

Mac mini, Intel Core Duo à 1,83GHz avec 2 Go RAM.
iPhone 3GS 32 Go
 
Hors ligne Pmol # Posté le 07/07/2007 à 14:35:03
Mangez du Python
Avatar

Études : IUT A Lyon 1

http://the.pmol.free.fr/codart/tapisSierpinski/
La coloration se fait en fonction de la taille des carrés (bon j'ai pas réussi à faire quelque chose de joli).
Édité le 12/07/2007 à 18:41:25 par Pmol
Hors ligne Artefact2 # Posté le 08/07/2007 à 01:38:01
Avatar

Ville : Reims
Pays : France métropolitaine
Études : Université de Reims

Citation : guimers8
En voilà un pas trop moche :-°
Image utilisateur


Le code source scrogneugneu ! :-°

Merci ;)
Hors ligne guimers8 # Posté le 08/07/2007 à 02:10:47
Cocoa/ObjC
Avatar

Ville : Grenoble
Pays : France métropolitaine

Je l'ai plus, j'ai changé les combinaisons pour les couleurs… :o

Image utilisateur

Mac mini, Intel Core Duo à 1,83GHz avec 2 Go RAM.
iPhone 3GS 32 Go
 
Hors ligne Cygal # Posté le 08/07/2007 à 07:20:27
X-No-Archive: yes
Avatar
Flux RSS

Et alors ? ^_^

Ça empêche d'avoir le reste ?
Hors ligne guimers8 # Posté le 08/07/2007 à 11:47:49
Cocoa/ObjC
Avatar

Ville : Grenoble
Pays : France métropolitaine

C'est le même que tout en haut, en C avec la SDL. :)

Image utilisateur

Mac mini, Intel Core Duo à 1,83GHz avec 2 Go RAM.
iPhone 3GS 32 Go
 
Hors ligne Artefact2 # Posté le 10/07/2007 à 15:51:40
Avatar

Ville : Reims
Pays : France métropolitaine
Études : Université de Reims

Ca y est, j'ai enfin réussi le mien après moultes péipéries... Pas trop facile quand on ne maîtrise ni le langage ni les classes graphiques :-°

Image utilisateur

Et voici le code :

Code : C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace TapisDeSierpinski
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // On définit manuellement la taille du contrôle
            this.Width = 600;
            this.Height = 600;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // On paramètre la picturebox lors du chargement du formulaire
            pictureBox1.Dock = DockStyle.Fill;
            pictureBox1.BackColor = Color.Black;

            // On connecte l'évènement du picturebox1_paint()
            pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);

            // On l'ajoute au formulaire
            this.Controls.Add(pictureBox1);
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            // On initialise le Tapis
            Bitmap Fond = Images.Couleurs;
            Tapis sierpinski = new Tapis(new TextureBrush(Fond), e);

            // On le dessine ;)
            sierpinski.DrawTapis(new Point(0, 0), pictureBox1.Width, pictureBox1.Height, 5);
        }

        public class Tapis
        {
            // Le brush qui nous sert à créer les carrés
            private Brush DrawingBrush;

            // Nous permet de créer des rectangles, lignes, ...
            private Graphics g;

            public Tapis(Brush Brush, PaintEventArgs e)
            {
                // On assigne les valeurs obtenues
                DrawingBrush = Brush;
                g = e.Graphics;
            }

            public void DrawTapis(Point Sommet, int Longueur, int Largeur, int Iterations)
            {
                // Si on a fait le nombre nécessaire d'itérations, on quitte :)
                if (Iterations == 0)
                    return;

                // On définit les variables d'usages, pour aller plus vite
                int X = Sommet.X;
                int Y = Sommet.Y;
                int LongueurPetit = (int)Longueur / 3;
                int LargeurPetit = (int)Largeur / 3;

                // On crée les trois points restants
                Point[] Sommets = { new Point(X + LongueurPetit, Y + LargeurPetit),
                    new Point(X + Longueur - LongueurPetit, Y + LargeurPetit),
                    new Point(X + Longueur - LongueurPetit, Y + Largeur - LargeurPetit),
                    new Point(X + LongueurPetit, Y + Largeur - LargeurPetit) };

                // On dessine notre rectangle
                g.FillPolygon(DrawingBrush, Sommets);

                // On fait les récursions pour les huit rectangles restants
                DrawTapis(new Point(X, Y), LongueurPetit, LargeurPetit, Iterations - 1);
                DrawTapis(new Point(X + LongueurPetit, Y), LongueurPetit, LargeurPetit, Iterations - 1);
                DrawTapis(new Point(X + LongueurPetit*2, Y), LongueurPetit, LargeurPetit, Iterations - 1);
                DrawTapis(new Point(X, Y + LargeurPetit), LongueurPetit, LargeurPetit, Iterations - 1);
                DrawTapis(new Point(X, Y + LargeurPetit * 2), LongueurPetit, LargeurPetit, Iterations - 1);
                DrawTapis(new Point(X + LongueurPetit, Y + LargeurPetit * 2), LongueurPetit, LargeurPetit, Iterations - 1);
                DrawTapis(new Point(X + LongueurPetit * 2, Y + LargeurPetit * 2), LongueurPetit, LargeurPetit, Iterations - 1);
                DrawTapis(new Point(X + LongueurPetit * 2, Y + LargeurPetit), LongueurPetit, LargeurPetit, Iterations - 1);
            }
        }
    }
}


Bye et merci ;)
Hors ligne guimers8 # Posté le 10/07/2007 à 19:35:49
Cocoa/ObjC
Avatar

Ville : Grenoble
Pays : France métropolitaine

Je rêve ou tu as dessiné ton tapis avec comme motif une fractale de Lyapunov ? :o

Image utilisateur

Mac mini, Intel Core Duo à 1,83GHz avec 2 Go RAM.
iPhone 3GS 32 Go
 
Hors ligne Artefact2 # Posté le 10/07/2007 à 19:54:06
Avatar

Ville : Reims
Pays : France métropolitaine
Études : Université de Reims

Peut être, c'est une image plaquée que j'ai prise parce que ca rendait bien :)
Hors ligne Nanoc # Posté le 11/07/2007 à 11:23:23
Aimez-vous le C++ ?
Avatar
Validateurs

Ville : Durham
Pays : Royaume-Uni
Études : EPFL

Je vous propose une n-ième variation sur le même thème.

Un tapis de Sierpinski mappé sur une sphère. J'aime bien l'effet que ça donne.

Image utilisateur

Pour le faire, c'est très simple. On fait un tapis via un des algos proposé ci-dessus et on plaque cette image sur une sphère OpenGL.
 
Hors ligne Artefact2 # Posté le 11/07/2007 à 12:00:40
Avatar

Ville : Reims
Pays : France métropolitaine
Études : Université de Reims

Original :D

Hors ligne Hilaia # Posté le 11/07/2007 à 12:44:52
C'est la fin du début...
Avatar
Groupe : Anciens

Ville : Profondeville
Pays : Belgique

Bien joué Nanoc ^^
C'est superbe

Dropbox: Obtenez 250Mo supplémentaires en étant parrainé sur ce service de synchronisation de données.
Peut servir à tout, et juste génial pour gérer ses projets gratuitement.
 
Hors ligne nabmoloc # Posté le 11/07/2007 à 18:27:12
Avatar

Ville : Compiegne
Pays : France métropolitaine
Études : UTC

Pour ceux qui ont envie de s'amuser un peu avec openGL on peut faire la même chose mais avec des cubes dans l'espace

"Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." Albert Einstein

"Nombreux sont les vivants qui mériteraient la mort et les morts qui mériteraient la vie" JRR Tolkien
 
Hors ligne Nanoc # Posté le 11/07/2007 à 19:34:22
Aimez-vous le C++ ?
Avatar
Validateurs

Ville : Durham
Pays : Royaume-Uni
Études : EPFL

Hors ligne guimers8 # Posté le 12/07/2007 à 10:54:48
Cocoa/ObjC
Avatar

Ville : Grenoble
Pays : France métropolitaine

Vraiment excellent la sphère !

Le rendu est meilleur en "trouant" le cube qu'en mettant une image dessus.

Image utilisateur

Mac mini, Intel Core Duo à 1,83GHz avec 2 Go RAM.
iPhone 3GS 32 Go
 
Hors ligne Nanoc # Posté le 12/07/2007 à 10:56:59
Aimez-vous le C++ ?
Avatar
Validateurs

Ville : Durham
Pays : Royaume-Uni
Études : EPFL

Hors ligne geenux # Posté le 23/02/2008 à 12:02:16
Vive Qt
Avatar

Ville : Brest
Pays : France métropolitaine

Bon voilà, ma première fractale, mon premier programme c++ utilisant la SFML.
voilà le rendu de mon tapis: Tapis de Sierpinski

et voilà le code:
Code : C++ - Afficher / masquer les numéros de ligne
  1. /*******************************************************
  2.  *Auteur: Tanguy Arnaud
  3.  *Tapis de Sierpinski
  4.  ******************************************************/
  5.  
  6. #include <SFML/Graphics.hpp>
  7. #include <vector>
  8. using namespace std;
  9.  
  10. int main()
  11. {
  12.   int w=600;
  13.   int h=600;
  14.     // Create the main window
  15.     sf::RenderWindow App(sf::VideoMode(w,h, 32), "SFML: Tapis de Sierpinski");
  16.     App.SetBackgroundColor(sf::Color(200, 0, 0));
  17.  
  18.     // Start main loop
  19.     bool Running = true;
  20.     while (Running)
  21.     {
  22.         // Process events
  23.         sf::Event Event;
  24.         while (App.GetEvent(Event))
  25.         {
  26.             // Close window : exit
  27.             if (Event.Type == sf::Event::Closed)
  28.                 Running = false;
  29.  
  30.             // Escape key : exit
  31.             if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
  32.                 Running = false;
  33.            
  34.  
  35.         }
  36.        
  37.         /***** DEBUT DE L'ALGORYTHME DE GENERATION DU TAPIS *****/
  38.         int nbrCarre = 6;       // le nombre de carré de taille différentes
  39.         float carre = w/3;      // le coté d'en carré
  40.         int carreLigne=1;       // le nombre de carrés par ligne
  41.        
  42.         vector<sf::Sprite> vectorSprite; // le vecteur contenant tout les sprites générés
  43.        
  44.         for (int i=0;i<nbrCarre;i++) // on répête l'action pour toutes les tailles de carré
  45.           {
  46.             for(int x=0;x<carreLigne;x++)
  47.               {
  48.                 for (int y=0;y<carreLigne;y++)
  49.                   {
  50.                     sf::Sprite Sprite;
  51.                     Sprite.Resize(carre,carre); // on met le carré à la bonne taille
  52.                     Sprite.SetLeft((1+3*x)*carre); /* on positionne le carré par rapport à la partie gauche de l'écran:
  53.                                                     x correspond au grand carré, on le multiplie par 3 puis le divise par la taille du côté du carre pour le centrer horizontalement dans le grand carré
  54.                                                     */
  55.                     Sprite.SetTop((1+3*y)*carre);   //idem verticalement
  56.                     Sprite.SetColor(sf::Color(i*20,i,i)); // on le colorie
  57.                     vectorSprite.push_back(Sprite);            // on ajoute au vecteur contenant tous les sprites
  58.                    
  59.                   }
  60.                
  61.               }
  62.             carre = carre/3;    // on divise la taille du côté du carré par 3 pour qu'il soit 3 fois plus petit lors de l'itération suivante
  63.             carreLigne = carreLigne*3; // a l'itération suivante, il y aura 3 fois plus de carrés
  64.            
  65.           }
  66.  
  67.         /***** AFFICHAGE ****/
  68.         vector<sf::Sprite>::iterator it;
  69.         for(it=vectorSprite.begin();it!=vectorSprite.end();it++)
  70.           {
  71.             App.Draw((*it));
  72.           }
  73.        
  74.         // Display window on screen
  75.         App.Display();
  76.     }
  77.  
  78.     return EXIT_SUCCESS;
  79. }
Édité le 23/02/2008 à 12:03:33 par geenux
Hors ligne robocop # Posté le 21/10/2008 à 21:09:20
Avatar

Études : Lycée Condorcet - Paris 9ème

Ma version en ocaml, rapidement, et de façon moche :
http://quentin.cormier.free.fr/blog/?p [...] iski-en-ocaml

Code : OCaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
let rec tapis x y lng htr =
	if lng > 3 && htr > 3 then
	begin
		let l = lng/3 and h = htr/3 in
		Graphics.fill_rect (x+l) (y+l) l h;
		(* On trace les 8 petits carrés voisins*)
		tapis x (y+2*h) l h;
		tapis (x+l) (y+2*h) l h;
		tapis (x+2*l) (y+2*h) l h;
		tapis x (y+h) l h;
		tapis (x+l*2) (y+h) l h;
		tapis x y l h;
		tapis (x+l) y l h;
		tapis (x+l*2) y l h;
	end
 
let () = 
	Graphics.open_graph " 800x800";
	tapis 0 0 800 800;
	ignore (Graphics.read_key ());
Édité le 22/10/2008 à 17:02:40 par robocop
 

Retour au forum "Autres langages, outils et approches" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx