TutorielsVous débutez ? C'est ici qu'on commence !
Mon compte
Recherche
Livre d'or
PublicitéVous devez être inscrit pour pouvoir poster des messages
| Page : 1 | |
| Auteur | Message |
|---|---|
| 0 visiteur sur ce sujet () | |
| Page : 1 | |
Cygal
|
# Posté le 05/07/2007 à 16:07:53 |
Enfin Libre![]() Groupe : Membres |
Bonjour bonjour,
Triangle de SierpinskiPostez 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) : ![]() Et un exemple avec couleur : ![]() 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
|
iPoulet
|
# Posté le 05/07/2007 à 17:30:00 |
![]() Groupe : Membres |
Je pense que ça serait bien que les codes soient un peu commentés.
|
Cygal
|
# Posté le 05/07/2007 à 17:41:44 |
Enfin Libre![]() Groupe : Membres |
Merci du conseil.
C'est fait, j'espère que c'est plus clair maintenant
|
zulon
|
# Posté le 05/07/2007 à 17:59:40 |
The shrieker shrieks.![]() Groupe : Membres |
Voici mon « mognifique » (
) 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 ());;
Édité
le 05/07/2007 à 18:04:20
par zulon
![]() |
Nanoc
|
# Posté le 05/07/2007 à 18:07:25 |
Apprenez à utiliser la STL !!![]() Groupe : Membres |
Je vous propose un petit triangle de Sierpinski en SDL (C++)
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++ Exercices de C++ pour tous les niveaux ! Mes tutos: Tri de Shell --- [C++] Manipulateurs de flux --- [C++] Notions avancées (suite du cours de M@teo21) |
Sanco95
|
# Posté le 05/07/2007 à 22:04:31 |
C![]() 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.
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); } } |
SouCaline
|
# Posté le 05/07/2007 à 22:44:52 |
Utilisateur Mac OS X.4.11![]() 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:
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 ?> |
lastsseldon
|
# Posté le 06/07/2007 à 06:39:42 |
![]() Groupe : Membres |
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 . Jouer sur les couleurs lors de la récursion est un grand classique que vous réutiliserez sûrement dans vos autres oeuvres.
|
wichtounet
|
# Posté le 06/07/2007 à 09:04:53 |
|
Certes... Groupe : Membres |
Voilà aussi une petite version en Java :
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 : |
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. |
Pmol
|
# Posté le 06/07/2007 à 20:27:24 |
Mangez du Python![]() 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 ?
É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 » |
Blackhole
|
# Posté le 06/07/2007 à 23:38:17 |
Bear, and forbear![]() 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 )
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. |
stefbuet
|
# Posté le 07/07/2007 à 12:26:10 |
![]() 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 |
Nanoc
|
# Posté le 07/07/2007 à 13:59:56 |
Apprenez à utiliser la STL !!![]() Groupe : Membres |
Est-ce que tu as bien mis une condition d'arrêt a la récursion ?
Exercices de C++ pour tous les niveaux ! Mes tutos: Tri de Shell --- [C++] Manipulateurs de flux --- [C++] Notions avancées (suite du cours de M@teo21) |
Skydreamer
|
# Posté le 07/07/2007 à 14:16:26 |
|
Groupe : Membres |
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
|
Nanoc
|
# Posté le 07/07/2007 à 14:29:01 |
Apprenez à utiliser la STL !!![]() 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 Exercices de C++ pour tous les niveaux ! Mes tutos: Tri de Shell --- [C++] Manipulateurs de flux --- [C++] Notions avancées (suite du cours de M@teo21) |
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
|
stefbuet
|
# Posté le 07/07/2007 à 17:28:11 |
![]() Groupe : Membres |
Youpi ! j'ai réussi ! voila mes réalisations
:
![]()
Et maintenant je file au niveau superieur
Flash forever |
Nanoc
|
# Posté le 07/07/2007 à 18:28:30 |
Apprenez à utiliser la STL !!![]() Groupe : Membres |
Je rappelle à tout le monde qu'il faut fournir le code source avec ses créations
Exercices de C++ pour tous les niveaux ! Mes tutos: Tri de Shell --- [C++] Manipulateurs de flux --- [C++] Notions avancées (suite du cours de M@teo21) |
stefbuet
|
# Posté le 07/07/2007 à 21:39:43 |
![]() 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 |
iPoulet
|
# Posté le 07/07/2007 à 21:43:28 |
![]() 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. |
Artefact2
|
# Posté le 08/07/2007 à 01:14:06 |
![]() Groupe : Membres |
Ca y est, j'ai enfin réussi le mien :o)
Voila le résultat (super innovant) :
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 codeJ'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
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
![]() Venez tous sur Freenet 0.7 ! Comment ? Pourquoi ? FreeBSD, best Operating System ever ! |
M@cros
|
# Posté le 11/07/2007 à 13:49:22 |
![]() 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 :
et voici le résultat :
Édité
le 12/07/2007 à 13:11:20
par M@cros
Le Site du Zero, c'est vraiment : !!! |
Artefact2
|
# Posté le 13/07/2007 à 14:01:16 |
![]() 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
Voici sans plus attendre le rendu, avec les couleurs qui vont bien :
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 |
