Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Autres langages > [Cod'Art] Triangle de Sierpinski > Lecture du sujet

[Cod'Art] Triangle de Sierpinski

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Auteur Message
0 visiteur sur ce sujet ()
Page : 1 
Hors ligne Cygal # Posté le 05/07/2007 à 16:07:53
Enfin Libre
Avatar
Groupe : Membres
Bonjour bonjour,

Triangle de Sierpinski



Postez toutes vos créations autour du triangle de Sierpinski ! Que ce soit une approche particulière, un dessin qui s'en rapproche, l'utilisation de couleur, ce topic est là pour ça :)

L'article qui va bien sur wikipédia : Triangle de Sierpiński


Voilà ce que j'ai fait pour l'instant :

Sans couleurs (je vous épargne le code, c'est presque pareil qu'en dessous) :

Image utilisateur


Et un exemple avec couleur :

Image utilisateur


Code : Ocaml

(* // est ici un opérateur infixe (donc on va écrire a // b, et pas // a b) *)
(* Il permet d'obtenir le milieu d'un segment, les coordonnées des extremités étant des doublets *)
let ( // ) (x1, y1) (x2, y2) = ((x1 + x2)/2, (y1 + y2)/2)

open Graphics

(* C'est la fonction récursive qui va tracer un triangle, connaissant la longueur *)
(* d'un côté et un des points, puis demander le tracé des autres points *)
let rec sierpinsky (x, y) base n couleur =
  (* Je commence par changer de couleur (c'est un entier, et je lui ajoute un nombre totalement arbitraire) *)
  let new_color = couleur + 20000 in
    (* Si j'ai déjà tracé n sous-triangles, j'arrête *)
    if n > 0 then
      begin
        (* On crée le triangle, en se placant d'abord à l'origine *)
        Graphics.moveto x y;
        (* Puis on trace les trois segments du triangle (c'est possible, *)
        (* on connaît un point, et la longueur de la base) *)
        Graphics.lineto (x + (base / 2)) (y + base);
        Graphics.lineto (x + base) y;
        Graphics.lineto x y;
        (* Ensuite on change de couleur, puis on dessine un disque *)
        (* au milieu du triangle, de rayon base/10 *)
        Graphics.set_color new_color;
        Graphics.fill_circle (x + base / 2) (y + base / 2) (base / 10);
        (* Ensuite on appelle la fonction qui va créer les trois triangles, *)
        (* c'est-à-dire, celui du haut, de droite, et de gauche (en gardant la nouvelle couleur)*)
        sierpinsky ((x, y) // (x + (base / 2), y + base)) (base/2) (n-1) new_color;
        sierpinsky ((x + base, y) // (x, y)) (base/2) (n-1) new_color;
        sierpinsky (x, y) (base/2) (n-1) new_color;
      end

(* 400 pixels de côté, 5 itérations *)
let len = 400
let iter = 5

(* Ceci me permet d'avoir la fenêtre que j'ai montrée plus haut, avec l'appel à la fonction récursive sierpinski *)
let () =
  Random.self_init ();
  open_graph (Printf.sprintf " %dx%d" len len);
  auto_synchronize false;
  sierpinsky (0, 0) len iter white;
  synchronize ();
  ignore (read_key ())
 


Surtout n'hésitez pas à vous lancer, demander de l'aide (ou me ridiculiser, au choix :-° ), et montrer ce que vous avez fait !

edit de playest : correction du titre.
Édité le 05/07/2007 à 18:12:05 par playest


Le Blog de l'Homme Moderne
« Un peu de curiosité, voyons. »
 
Hors ligne iPoulet # Posté le 05/07/2007 à 17:30:00
Avatar
Groupe : Membres
Je pense que ça serait bien que les codes soient un peu commentés.

Étoilé
« Eĉ guto malgranda, konstante frapante, traboras la monton granitan »
 
Hors ligne Cygal # Posté le 05/07/2007 à 17:41:44
Enfin Libre
Avatar
Groupe : Membres
Merci du conseil.
C'est fait, j'espère que c'est plus clair maintenant :)


Le Blog de l'Homme Moderne
« Un peu de curiosité, voyons. »
 
Hors ligne zulon # Posté le 05/07/2007 à 17:59:40
The shrieker shrieks.
Avatar
Groupe : Membres
Voici mon « mognifique » ( :D ) Triangle de Sierpinski:
Code : Ocaml
open Graphics;;
(* Dessine un triangle, no comment *)
let draw_triangle (a1, a2) (b1, b2) (c1, c2) =
  moveto a1 a2;
  lineto b1 b2;
  lineto c1 c2;
  lineto a1 a2;
;;

(* Récupère le milieu du segment *)
let ( // ) (x1, y1) (x2, y2) = ((x1 + x2)/2, (y1 + y2)/2)

(* Dessine un triangle de Sierpinski cette fois *)
(* Prend en paramètres les trois extrémités du grand triangle *)
let rec triangle_sierpinski (a1, a2) (b1, b2) (c1, c2) =
  function
    | 0 -> ()    (* Si iter arrive à zéro, fini *)
    | iter -> (  (* Sinon, on continue *)
        (* En gros, dessine un triangle et récurse pour les trois petits des côtés *)
        draw_triangle (a1, a2) (b1, b2) (c1, c2);
        triangle_sierpinski (a1, a2) ((a1, a2) // (b1, b2)) ((a1, a2) // (c1, c2)) (iter-1);
        triangle_sierpinski (b1, b2) ((b1, b2) // (a1, a2)) ((b1, b2) // (c1, c2)) (iter-1);
        triangle_sierpinski (c1, c2) ((c1, c2) // (a1, a2)) ((b1, b2) // (c1, c2)) (iter-1);
      )
;;

(* Désactive la synchronisation, plus rapide *)
auto_synchronize false;
open_graph " 800x800";
(* Affiche un triangle de Sierpinski *)
triangle_sierpinski (0,0) (400,800) (800,0) 9;;
(* Sync l'affichage *)
synchronize ();;
(* Pause *)
ignore (read_key ());;
 

Image utilisateur
Édité le 05/07/2007 à 18:04:20 par zulon

Image utilisateur
 
Hors ligne Nanoc # Posté le 05/07/2007 à 18:07:25
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Je vous propose un petit triangle de Sierpinski en SDL (C++)

triangle de Sierpinski en SDL

L'algorithme utilisé, est le suivant:

Je construit un triangle de Pascal, puis je colorie en dégradé les nombre impairs de mon tableau.

Le code source est ici: Code source C++
 
Hors ligne Sanco95 # Posté le 05/07/2007 à 22:04:31
C
Avatar
Groupe : Membres
Salut, sur wikipédia il y a un algorythme de C, je l'ai lu rapidement et j'ai fais le même.

Image utilisateur

Code : C++
void triangleSierpinski(SDL_Surface* ecran, int x, int y, int longu, int nbHomotheties)
{
    if(nbHomotheties > 0) {
        double b = -longu * (sqrt(3.0)/2);

        Sint16 tx[3] = {x, x+longu, x+longu/2};
        Sint16 ty[3] = {y, y,        y+b};
        polygonColor(ecran, &tx[0], &ty[0], 3, SDL_MapRGB(ecran->format, 0, 0, 255));

        triangleSierpinski(ecran, x, y, longu/2, nbHomotheties-1);
        triangleSierpinski(ecran, x+longu/4, y+b/2, longu/2, nbHomotheties-1);
        triangleSierpinski(ecran, x+longu/2, y, longu/2, nbHomotheties-1);
    }
}
Connecté SouCaline # Posté le 05/07/2007 à 22:44:52
Utilisateur Mac OS X.4.11
Avatar
Groupe : Membres
Je me suis permis de transformer le code de delroth qui est en language C en PHP.

Tout d'abord voici le résultat que j'obtiens en php:
Image utilisateur

Et maintenant le code que j'ai transformé en php:
Code : PHP

<?php

header ("Content-type: image/png");


$w = '300';     //   Taille en pixel de la largeur de l'image
$h = '250';     //   Taille en pixel de la hauteur de l'image

$image = imagecreate($w, $h);     //   On crée l'image aux dimentions voulues
$couleur0 = imagecolorallocate($image, 255, 255, 255)//        On définie la premiere couleur (blanc)
$couleur1 = imagecolorallocate($image, 0, 0, 0);        //      On définie la seconde couleur (noir)



$x = rand(0, $w);       //     On défini un chiffre aléatoirement entre 0 et ce que vaut $w
$y = rand(0, $h);       //     On défini un chiffre aléatoirement entre 0 et ce que vaut $h

$i=0;
while($i < 10000) {
        $n = rand(0, 1000); // A chaque boucle on défini un chiffre aléatoirement entre 0 et 1000
        if($n <= '333') {
                $x /= 2;
                $y /= 2;
        }
        elseif($n > '333' && $n <= '666') {
                $x = ($x + $w / 2) / 2;
                $y = ($y + $h) / 2;
        }
        else {
                $x = ($x + $w) / 2;
                $y = ($y + $h / 2) / 2;
        }
       
        ImageSetPixel ($image, $x, $y, $couleur1);      //    On écrit le pixel au coordonnée obtenue
        $i++;
}

imagepng($image);    //  On affiche l'image

?>
 
 
Hors ligne lastsseldon # Posté le 06/07/2007 à 06:39:42
Avatar
Groupe : Membres
sierpinski


Pourquoi ne pas essayer de colorier les différents triangles ? :)
Je ne fournis pas le code source, c'est un bon entraînement... Bref, même si cette fractale est une des plus simples, il n'est pas interdit d'essayer de la rendre plus belle encore :D . Jouer sur les couleurs lors de la récursion est un grand classique que vous réutiliserez sûrement dans vos autres oeuvres.


[gnustep,etoile,Io ,haskell, erlang ]
 
Hors ligne wichtounet # Posté le 06/07/2007 à 09:04:53
Certes...
Avatar
Groupe : Membres
Voilà aussi une petite version en Java :

Image utilisateur

Et voilà 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 Triangle extends JPanel {
        private static final long serialVersionUID = 6899161860200488093L;

        private final int recursion = 8;
        private final int insets = 25;
       
        public Triangle(){
                super();
               
                setOpaque(false);
                setBackground(Color.white);
                setPreferredSize(new Dimension(800,700));
        }
       
        public static void main(String[] args) {
                JFrame frame = new JFrame("Triangle de sierpinski");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new Triangle());
                frame.pack();
                frame.setVisible(true);
        }
       
        private int getBaseSize(){
                return getSize().width - (insets * 2);
        }
       
        public void paint(Graphics g) {
        int hauteur  = (int)(getBaseSize() * Math.sqrt(3)/2);
       
        int xA = insets;
        int xB = insets + getBaseSize();
        int xC = insets + getBaseSize() / 2;

        int[] sommetsX = {xA, xB, xC};
       
        int yA = insets + hauteur;
        int yB = insets + hauteur;
        int yC = insets;
       
        int[] sommetsY = {yA, yB, yC};
       
        drawTriangle(sommetsX, sommetsY, getBaseSize() / 2 , g);
       
        super.paint(g);
    }

    private void drawTriangle(int[] sommetsX, int[] sommetsY, int d , Graphics g) {
        if (d > recursion) {
                int[] s1 = {2, 2, 1};
                int[] s2 = {1, 0, 0};
               
                int[] x = {     (sommetsX[1] + sommetsX[2]) / 2,
                                        (sommetsX[0] + sommetsX[2]) / 2,
                                        (sommetsX[0] + sommetsX[1]) / 2};
               
                int[] y = {     (sommetsY[1] + sommetsY[2]) / 2,
                                        (sommetsY[0] + sommetsY[2]) / 2,
                                        (sommetsY[0] + sommetsY[1]) / 2};
               
            for(int i = 0; i < 3; i++){
                int[] newX = {sommetsX[i], x[s1[i]], x[s2[i]]};
                int[] newY = {sommetsY[i], y[s1[i]], y[s2[i]]};
               
                drawTriangle(newX, newY, d / 2 , g);
            }
        } else {
                g.fillPolygon(sommetsX, sommetsY, 3);
        }
    }
}


Et juste pour rire, voici ce que ça donne avec une petite erreur :


Image utilisateur
 
Hors ligne Teriblus # Posté le 06/07/2007 à 09:33:55
Groupe : Membres
Excelent on dirait une montagne :) !

Ca à l'air bien sympathique tout ca faudra que je m'y mette un jour.
Connecté Pmol # Posté le 06/07/2007 à 20:27:24
Mangez du Python
Avatar
Groupe : Membres
http://the.pmol.free.fr/codart/triangleSierpinski/
Je m'attaque à la coloration des triangles. :)

Edit: Voilà. La couleur change à chaque "niveau" d'itération (c'est le fichier triangleDegrade.py qu'il faut regarder). Sex hein ? :D
Édité le 12/07/2007 à 18:43:39 par Pmol

Le Blog de l'Homme Moderne
« Il est plus facile de faire sortir le dentifrice du tube que de l'y faire rentrer »
 
Hors ligne Blackhole # Posté le 06/07/2007 à 23:38:17
Bear, and forbear
Avatar
Groupe : Membres
Ca y est, j'ai enfin compris le principe des fractals !

Voilà mon image ( le bleu c'est mieux que le rose, d'abord :p )

Image utilisateur

Edit : Ah oui, le code !

Code : PHP
<?php
header('Content-type: image/png');

$taille_image = 500;
$image = imageCreateTrueColor($taille_image, $taille_image);

$couleur = imageColorAllocate($image, 0, 0, 255);

imageFilledPolygon($image, array(       $taille_image/2, 0,
                                                        0, $taille_image,
                                                        $taille_image, $taille_image),
                                        3, $couleur);
                                       
imagecolordeallocate($image, $couleur);
                                       
function traceNouveauTriangle($point1, $point2, $point3, $i)
{
        global $image, $blanc;
        $new_point1 = array(($point1[0] + $point2[0])/2, ($point1[1] + $point2[1])/2);
        $new_point2 = array(($point1[0] + $point3[0])/2, ($point1[1] + $point3[1])/2);
        $new_point3 = array(($point2[0] + $point3[0])/2, ($point2[1] + $point3[1])/2);
       
        $couleur = imageColorAllocate($image, 255-$i*20, 255-$i*20, 255);
       
        imageFilledPolygon($image, array( $new_point1[0], $new_point1[1],
                                                                $new_point2[0], $new_point2[1],
                                                                $new_point3[0], $new_point3[1]),
                                        3, $couleur);
        imagecolordeallocate($image, $couleur);
        $i++;
        if ($i < 7)
        {
                traceNouveauTriangle($new_point1, $new_point3, $point2, $i);
                traceNouveauTriangle($new_point3, $new_point2, $point3, $i);
                traceNouveauTriangle($new_point2, $new_point1, $point1, $i);
        }
}

traceNouveauTriangle(array($taille_image/2, 0),
                                         array(0, $taille_image),
                                         array($taille_image, $taille_image), 0);

imagePng($image);
?>
Édité le 06/07/2007 à 23:40:16 par Blackhole

- Le moteur de templates le plus rapide, le plus pratique et le plus effiace ? Par ici !
- N'oubliez pas le de marquer votre message comme résolu !
- Pour trouver une aiguille dans une botte de foin, on met le feu à la botte et on passe un aimant dans les cendres.
 
Hors ligne stefbuet # Posté le 07/07/2007 à 12:26:10
Avatar
Groupe : Membres
Salut, moi j'ai un pti probleme, lorsque j'appele une fonction dans elle même en C++ avec sql/open gl, le programme se ferme :'(
Que faire ?

Flash forever :p
 
Hors ligne Nanoc # Posté le 07/07/2007 à 13:59:56
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Est-ce que tu as bien mis une condition d'arrêt a la récursion ?
 
Hors ligne Skydreamer # Posté le 07/07/2007 à 14:16:26
Groupe : Membres
Tentative de dessin de triangle équilatéral en SDL
Moi, j'ai un léger problème au niveau du dessin de triangle équilatéral en SDL...

Le triangle est aplati en hauteur.

Code : C++
void triangleEquilateral(int basex, int basey, int cote, SDL_Surface *ecran)
{
    ligne(basex, basey, basex + cote, basey, ecran);
    int sommetx = basex + (cote / 2);
    int sommety = sqrt(HAUTEUR - (HAUTEUR - basey) - (pow(cote / 2, 2) - pow(cote, 2))) - (HAUTEUR - basey);
    ligne(basex, basey, sommetx, sommety, ecran);
}


C'est surement le calcul de la hauteur qui ne marche pas. Ca utilise le théorème de Pythagore en coupant le triangle en deux triangles rectangles. Si quelqu'un aurait une formule moins complexe ?

Merci d'avance.

Edit : Je met l'image en miniature.
Édité le 07/07/2007 à 14:28:13 par Skydreamer
Hors ligne Nanoc # Posté le 07/07/2007 à 14:29:01
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
En utilisant la trigo, on trouve que la hauteur d'un triangle équilatéral est donnée par:

Code : Autre

h = sin(60) * a = racine(3) / 2 * a = 0.86603... * a


où a est le coté de ton triangle
 
Hors ligne Skydreamer # Posté le 07/07/2007 à 14:32:14
Groupe : Membres
Edit : C'est réglé
Édité le 07/07/2007 à 16:24:15 par Skydreamer
Hors ligne stefbuet # Posté le 07/07/2007 à 17:28:11
Avatar
Groupe : Membres
Youpi ! j'ai réussi ! voila mes réalisations :D :

Image utilisateur

Image utilisateur

Image utilisateurImage utilisateur

Et maintenant je file au niveau superieur :)

Flash forever :p
 
Hors ligne Nanoc # Posté le 07/07/2007 à 18:28:30
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Je rappelle à tout le monde qu'il faut fournir le code source avec ses créations
 
Hors ligne stefbuet # Posté le 07/07/2007 à 21:39:43
Avatar
Groupe : Membres
je m'apperçois avec horreur que j'ai prix le même fichier pour faire le tapis de sierpinski et que je n'ais donc plus le code O_o
Mais je vous promet sur l'honneur que c'est moi qui est faire sa !

Flash forever :p
 
Hors ligne iPoulet # Posté le 07/07/2007 à 21:43:28
Avatar
Groupe : Membres
La question n'est pas de savoir qui, à la limite on s'en fout, c'est juste que dans le cadre d'un atelier on est là pour "apprendre" et que c'est mieux d'avoir des codes sources à étudier.

Mais bon.

Étoilé
« Eĉ guto malgranda, konstante frapante, traboras la monton granitan »
 
Hors ligne Artefact2 # Posté le 08/07/2007 à 01:14:06
Avatar
Groupe : Membres
Ca y est, j'ai enfin réussi le mien :o)

Voila le résultat (super innovant) :

Image utilisateur

Et voici mon code source (je passe sous la trappe le code généré par le concepteur Windows Forms, qui est inutile ici) :

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 Dessin2D
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // Le triangle se mettra automatiquement à échelle :o)
            this.Height = 600;
            this.Width = 600;
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            // On initialise un nouveau triangle de Sierpinski
            Triangle sierpinski = new Triangle(new Pen(Color.Red), e);

            // On dessine le triangle (notez qu'on peut changer la taille/orientation du triangle simplement en changeant cette ligne)
            sierpinski.DrawTriangle(new Point(0, 0), new Point(pictureBox1.Width, 0), new Point(pictureBox1.Width/2, pictureBox1.Height), 7);       
        }

        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);

        }
    }

    public class Triangle
    {
        // Le stylo qui nous sert à dessiner le triangle (Classe .Net)
        private Pen DrawingPen;

        // Le moteur graphique qui nous permet de tracer des droites
        private Graphics g;


        public Triangle(Pen Crayon, PaintEventArgs e)
        {
            // On assigne les valeurs du constructeur
            DrawingPen = Crayon;
            g = e.Graphics;
        }

        private Point Milieu(Point A, Point B)
        {
            // Petite fonction pratique pour calculer le milieu de deux points. Elle renvoie un point.
            return new Point((A.X + B.X) / 2, (A.Y + B.Y) / 2);
        }

        public void DrawTriangle(Point BaseX, Point BaseY, Point BaseZ, int Iterations)
        {
            // Si on a fini toutes les itérations, on quitte
            if (Iterations == 0)
                return;

            // On dessine le triangle
            Point[] Arretes = {BaseX, BaseY, BaseZ};
            g.DrawPolygon(DrawingPen, Arretes);

            // On continue ;)
            DrawTriangle(BaseX, Milieu(BaseX, BaseY), Milieu(BaseX, BaseZ), Iterations - 1);
            DrawTriangle(BaseY, Milieu(BaseY, BaseZ), Milieu(BaseY, BaseX), Iterations - 1);
            DrawTriangle(BaseZ, Milieu(BaseZ, BaseY), Milieu(BaseZ, BaseX), Iterations - 1);
        }
    }
}


Commentaires sur mon code


J'ai choisi le C# pour réaliser mon premier programme "graphique". Je ne connaissais absolument pas les classes .Net, alors j'ai utilisé la documentation MSDN et j'ai été agréablement surpris. Les classes intégrées sont vraiment simples à utiliser. Je le conseille à vous tous ;)

J'ai crée une classe "triangle" assez commentée. Libre à vous de l'exploiter :p

Merci ;)

Edit : j'essaie de faire un truc plus beau, et je poste le screen et le code après :-°
Édité le 08/07/2007 à 01:15:56 par Artefact2
 
Hors ligne M@cros # Posté le 11/07/2007 à 13:49:22
Avatar
Groupe : Membres
Voici mon programme créateur de triangle de Sierpinski en OpenGL et SDL :

Code : C++

#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <iostream>
#include <SDL/SDL_getenv.h>

#define LARGEUR_ECRAN   1024
#define HAUTEUR_ECRAN   728
#define LONGUEUR    700         //longueur d'un coté du rectangle de départ

using namespace std;

void dessiner(int nb);
void carre(int nb, float x, float y, float longu);

int main(int argc, char *argv[])
{
    int nb = 0;         //nb d'étapes : au début 0
    SDL_Init(SDL_INIT_VIDEO);
    SDL_WM_SetCaption("Fractale",NULL);
    putenv("SDL_VIDEO_WINDOW_POS=0,20 ");
    SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_OPENGL);
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity( );
    gluOrtho2D(0,LARGEUR_ECRAN,0,HAUTEUR_ECRAN);

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity( );




    dessiner(nb);           //on déssine le carré de base

    bool continuer = true;
    SDL_Event event;

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = false;
                break;
            case SDL_KEYDOWN:

                switch(event.key.keysym.sym)
                {
                    case SDLK_UP:           //si flèche du haut -> on dessine avec une étape en plus
                    if (nb<10)
                    nb++;
                        dessiner(nb);
                        break;
                    case SDLK_DOWN:         //si flèche du bas -> on dessine avec une étape en moins
                    if(nb > 0)
                    nb--;
                        dessiner(nb);
                        break;

                }
                break;


        }


    }

    SDL_Quit();

    return 0;
}

void dessiner(int nb)
{
        glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity( );
    glTranslated(LARGEUR_ECRAN/2-LONGUEUR/2,HAUTEUR_ECRAN/2-LONGUEUR/2,0);
    glBegin(GL_QUADS);
            glColor3ub(255,0,0);
            glVertex2d(0,0);
            glColor3ub(0,255,0);
            glVertex2d(LONGUEUR,0);
            glColor3ub(0,0,255);
            glVertex2d(LONGUEUR,LONGUEUR);
            glColor3ub(255,255,0);
            glVertex2d(0,LONGUEUR);
    glEnd();

    carre(nb,LARGEUR_ECRAN/2-LONGUEUR/2,HAUTEUR_ECRAN/2-LONGUEUR/2,LONGUEUR);
    glFlush();
    SDL_GL_SwapBuffers();
}

void carre(int nb, float x, float y, float longu)
{
    if(nb)          //important tant que nb > 0 -> on refait une étape
    {

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity( );

    glTranslated(x,y,0);            //on se place en bas à gauche du carre a modifier

    glTranslated(0,longu/2,0);
    glBegin(GL_QUADS);
            glColor3ub(0,0,0);          //on efface un rectangle en haut à droite
            glVertex2d(0,0);
            glVertex2d(longu/4,0);
            glVertex2d(longu/4,longu/2);
            glVertex2d(0,longu/2);
    glEnd();

    glTranslated(3*longu/4,0,0);
    glBegin(GL_QUADS);                  //puis en haut à gauche
            glColor3ub(0,0,0);
            glVertex2d(0,0);
            glVertex2d(longu/4,0);
            glVertex2d(longu/4,longu/2);
            glVertex2d(0,longu/2);
    glEnd();

        //pour chaque étape suplementaire, nb diminu de 1
    carre(nb-1,x+longu/4,y+longu/2,longu/2);    //on refait cette étape pour le carre entre les deux rectangle
    carre(nb-1,x,y,longu/2);                    //meme chose pour celui en bas a gauche
    carre(nb-1,x+longu/2,y,longu/2);            //et enbas a droite
    }
}



 


Ce programme permet non seulement de créer une fractale, mais elle permet aussi de voir toutes les étapes de sa création :

étape 1 étape 2

et voici le résultat :

étape finale
Édité le 12/07/2007 à 13:11:20 par M@cros

Le Site du Zero, c'est vraiment : :) :D ;) :p :lol: :euh: :( :o o_O ^^ :-° !!!
 
Hors ligne Artefact2 # Posté le 13/07/2007 à 14:01:16
Avatar
Groupe : Membres
Je me permets de reposter...

J'ai cette fois ci recrée ce fameux triangle en utilisant Direct3D, l'API graphique incluse dans DirectX. C'est plus dur, plus complexe, mais c'est fun et j'aime ca :p

Voici sans plus attendre le rendu, avec les couleurs qui vont bien :

Image utilisateur

Et voici le code, commenté (je suis suis pas sûr que vous comprendrez tout d'un coup, si vous voulez plus d'explications, pas de soucis) :
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 Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace SierpinskiDirect3D
{
    public partial class Form1 : Form
    {
        // Device utilisé par Direct3D
        private Device device;

        // Notre vertex buffer
        private VertexBuffer vBuffer;
        CustomVertex.TransformedColored[] Vertices;

        // Variable d'incrémentation pour remplir le VertexBuffer
        private int n = 0;

        // Nombre d'itérations
        private int N = 6;

        public Form1()
        {
            // Initialisation du formulaire
            InitializeComponent();

            // Initialisation du device
            InitializeGraphics();

            // On initialise notre tableau de vertices
            Vertices = new CustomVertex.TransformedColored[(int)Math.Pow(3, N) * 3 + 3];
        }

        private void ComputeIteration(int Iterations, float AX, float AY, float BX, float BY, float CX, float CY,
            Color Couleur1, Color Couleur2, Color Couleur3)
        {
            // Si on n'a plus rien à faire, on quitte
            if (Iterations == 0)
                return;

            // On ajoute notre triangle
            Vertices[n] = new CustomVertex.TransformedColored((AX + BX) / 2, (AY + BY) / 2
                , 0.6f, 1f, Couleur1.ToArgb()); n++;
            Vertices[n] = new CustomVertex.TransformedColored((BX + CX) / 2, (BY + CY) / 2,
                0.6f, 1f, Couleur2.ToArgb()); n++;
            Vertices[n] = new CustomVertex.TransformedColored((AX + CX) / 2, (AY + CY) / 2,
                0.6f, 1f, Couleur3.ToArgb()); n++;

            // On réappelle la fonction, avec les trois petits triangles ainsi crées
            ComputeIteration(Iterations - 1, AX, AY, (AX + BX) / 2, (AY + BY) / 2, (AX + CX) / 2, (AY + CY) / 2,
                Couleur1, Couleur2, Couleur3);
            ComputeIteration(Iterations - 1, (BX + AX) / 2, (BY + AY) / 2, BX, BY, (BX + CX) / 2, (BY + CY) / 2,
                Couleur1, Couleur2, Couleur3);
            ComputeIteration(Iterations - 1, (CX + AX) / 2, (CY + AY) / 2, (CX + BX) / 2, (CY + BY) / 2, CX, CY,
                Couleur1, Couleur2, Couleur3);
        }

        private void Render(object sender, PaintEventArgs e)
        {
            // On nettoie le Target et le ZBuffer
            device.Clear(ClearFlags.Target, Color.Black, 0.5f, 0);

            // Début de la scène
            device.BeginScene();

            // On crée le premier triangle
            Vertices[n] = new CustomVertex.TransformedColored(400.0f, 5.0f,
                0.5f, 1f, Color.FromArgb(255, 178, 241).ToArgb()); n++;
            Vertices[n] = new CustomVertex.TransformedCol