Aller au menu - Aller au contenu

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

Atelier Cod'Art

Vous devez être inscrit pour pouvoir poster des messages

Page : Précédente  1  2  3  4  5  6  ...  11  12  13  14  Suivante
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : Précédente  1  2  3  4  5  6  ...  11  12  13  14  Suivante
Hors ligne Furzel # Posté le 05/07/2007 à 19:29:59
Vive open arena !
Avatar
Groupe : Membres
Reprise du dernier message de la page précédente :
Je vais expliquer vite fait le principe que j'ai utilisé pour mes 3-4 dessins :

_ tout d'abord le but va etre de remplir l'écran pixel par pixel d'ou l'utilisation des deux boucles for
_ ensuite pour arriver a quelque chose de jolie on va jouer sur la couleur de chaque pixel en definissant la couleur en fonction des coordonée du pixel, par exemple le pixel situé aux cordonnées (42,42) donc x=42 et y=42 sera de couleur verte avec la definition de couleur qui suit en RGB : R = x-y G = x+y B = 0

en fait chaque opération formera une figure : exemple, l'image suivante a la configuration suivante : R = x+y G = x-y B = x*y

Le resultat est le suivant :

Image utilisateur

Cet image est en fait le composé des trois couleurs :

Rouge : x+y

Image utilisateur

Vert : x-y

Image utilisateur

Bleu : x*y

Image utilisateur

En esperant vous avoir éclairer ^^

Sinon pour les fractales comme le triangle de Sierpinski, il faut reflechir a un algorythme capable d'afficher les bons triangles aux bons endroits, le tapis de Sierpinski est plus simple a réalisser pour commencer je pensse
Hors ligne Kados # Posté le 05/07/2007 à 19:35:44
102013
Avatar
Groupe : Membres
Voila ce que j'ai :
Image utilisateur
Et la code :
Code : PHP
<?php

$taillecarre = 300;

$img = imagecreate($taillecarre, $taillecarre);
$noir = imagecolorallocate($img, 255, 255, 255);

$col_poly = imagecolorallocate($img, 0, 0, 0);

for ($a=0;$a<=$taillecarre/2;$a+=$taillecarre/100) {
        imagepolygon($img, array (
                0+$a,   0,
                $taillecarre, 0+$a,
                $taillecarre-$a, $taillecarre,
                        0, $taillecarre-$a
            ),
            4,
            $col_poly);
}

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

?>


Et ca :
Image utilisateur
Code : PHP
<?php

$a1 = -1.5;
$a2 = 0.6;
$b1 = -1.2;
$b2 = 1.2;

$zoom = 100;

$precision = 1/$zoom;

$img = imagecreate(($a2-$a1)*$zoom, ($b2-$b1)*$zoom);
$noir = imagecolorallocate($img, 0, 0, 0);

for ($a = $a1; $a<$a2; $a+=$precision) {

        for ($b = $b1; $b<$b2; $b+=$precision) {
       
                $x = 0;
                $y = 0;
                for ($i=0; $i<30; $i++) {
               
                        $tmp = $x;
                        $x = $x*$x - $y*$y + $a;
                        $y = 2*$tmp*$y + $b;
                                               
                        if (($x*$x+$y*$y) < 4) {
                                ImageSetPixel($img, ($a-$a1)*$zoom, ($b-$b1)*$zoom, $noir);
                        } else {
                                ImageSetPixel($img, ($a-$a1)*$zoom, ($b-$b1)*$zoom, imagecolorallocate($img, 255, 255, 255));
                                break;
                        }
                       
                }
               
        }
       
}

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

?>

(Pour ce dernier j'ai un problème : j'aimerai bien pouvoir afficher les différentes couches de différentes couleurs, mais je n'y arrive pas. Une solution ?
 
Hors ligne bluestorm # Posté le 05/07/2007 à 19:45:30
dont ask to ask
Avatar
Groupe : Membres
Citation : Zolix
Bonjour à tous :)

Vous avez tous fait des dessins supers sympas!
Mais on a parler d'atelier,
et comme déjà 2/3 ont demandé il me semble,
j'ai regardé vite fait le topic et pourtant,
je n'ai vu aucune explication ou tuto pour les personnes qui ne savent pas le faire!

Merci d'avance au(x) sauveur(s) =) ^^


Regarde les codes des gens, comprends les, et lance toi !
Tu crois qu'on a suivi un tuto "comment faire une image rigolote dans le langage de mon choix" ?

Le but, c'est d'expérimenter ;)
 
Hors ligne bracor # Posté le 05/07/2007 à 19:47:16
Ravioli.
Avatar
Groupe : Membres
Kados, ton deuxième code marche pas chez moi, mais tu peut peut-être essayer ma "méthode" (voir quelque post plus haut), histoire de...
Hors ligne delroth # Posté le 05/07/2007 à 21:25:53
Un Python, ça mord !
Avatar
Groupe : Bannis
Je vous propose une autre sorte d'images, ce sont les premières que l'on voit dans le premier message de ce topic : les superformulas. J'ai codé un algorithme en OCaml pour les générer, les résultats sont assez bon. Vous pouvez tout trouver sur mon espace dédié à Cod'Art :) .

Image utilisateur
 
Hors ligne Blackhole # Posté le 05/07/2007 à 21:47:45
Bear, and forbear
Avatar
Groupe : Membres
@bracor ==> Bien sur que son code marche, il faut juste changer la couleur du dessin ;) !

@Tix. ==> En PHP ( dévellopement plus rapide qu'en C ou qu'en C++, je trouve ;) )
Pour l'algo, voir mon premier message ;)

Edit : Je vais me lancer dans des trucs genre Mandelbrot, maintenant ^^ !
Édité le 05/07/2007 à 22:02:04 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 serial # Posté le 05/07/2007 à 22:44:14
Groupe : Membres
@blackhole -> euh son code marche pas chez moi non plus pour le madelbrot..je me suis pas plongé dedans mais avec un bete copier coller ca sort une image tte noire.

et sinon j'a ifait l'algo en php de la figure proposée au debut avec les cercle : www.e-caveavin.com/codart4.php?cote=600&largeur=500&n=3000

vous pouvez changer les parametre bien sur (cote = taile de limage, largeur = diametre du cercle, n = nombre de racine)

Mon site : www.e-caveavin.com
Mon cv : Mon cv
Un projet pour l'ecole : Le passe livre
Mon blog pro avec plein de tuto (googlemaps/flickr/drag'n drop/navigation en ajax non intrusif/etc) : http://antoine.guiral.info
 
Hors ligne Blackhole # Posté le 05/07/2007 à 22:50:06
Bear, and forbear
Avatar
Groupe : Membres
...

Change la variable $noir pour qu'elle affiche du blanc, ou définie une autre couleur juste au dessus de la définition de $noir, tu verra bien ;) !

- 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 serial # Posté le 05/07/2007 à 22:55:09
Groupe : Membres
ben ecoute j'ai mis du gris comme ca j'ai 3 couleur, du coup j'ai une image tte noir lol

voila mon code (enfin son code modifié):
Code : PHP
<?php

$a1 = -1.5;
$a2 = 0.6;
$b1 = -1.2;
$b2 = 1.2;

$zoom = 100;

$precision = 1/$zoom;

$img = imagecreate(($a2-$a1)*$zoom, ($b2-$b1)*$zoom);
$noir = imagecolorallocate($img, 0, 0, 0);

for ($a = $a1; $a<$a2; $a+=$precision) {

        for ($b = $b1; $b<$b2; $b+=$precision) {
       
                $x = 0;
                $y = 0;
                for ($i=0; $i<30; $i++) {
               
                        $tmp = $x;
                        $x = $x*$x - $y*$y + $a;
                        $y = 2*$tmp*$y + $b;
                                               
                        if (($x*$x+$y*$y) < 4) {
                                ImageSetPixel($img, ($a-$a1)*$zoom, ($b-$b1)*$zoom, imagecolorallocate($img, 100, 100, 100));
                        } else {
                                ImageSetPixel($img, ($a-$a1)*$zoom, ($b-$b1)*$zoom, imagecolorallocate($img, 255, 255, 255));
                                break;
                        }
                       
                }
               
        }
       
}

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

?>



Mon site : www.e-caveavin.com
Mon cv : Mon cv
Un projet pour l'ecole : Le passe livre
Mon blog pro avec plein de tuto (googlemaps/flickr/drag'n drop/navigation en ajax non intrusif/etc) : http://antoine.guiral.info
 
Hors ligne bluestorm # Posté le 05/07/2007 à 22:56:15
dont ask to ask
Avatar
Groupe : Membres
serial > on pourrait voir le code de la version PHP ?

edit : hum, pour le cercle ^^
Édité le 05/07/2007 à 22:58:25 par bluestorm
 
Hors ligne serial # Posté le 05/07/2007 à 23:00:33
Groupe : Membres
pas de prob!
code php du cercle :

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


if(!isset($_REQUEST['cote']))
{
        $cote = 500;
}
else
{
        $cote=$_REQUEST['cote'];
}
if(!isset($_REQUEST['largeur']))
{
        $largeur = 400;
}
else
        {$largeur=$_REQUEST['largeur'];}
if(!isset($_REQUEST['n']))
{
$n = 2000;
}
else{$n=$_REQUEST['n'];}

$image = imagecreate($cote, $cote);     //   On crée l'image aux dimentions voulues
imageantialias( $image, 1 );
$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)

ImageEllipse ($image, $cote/2, $cote/2, $largeur, $largeur, $couleur1);


//cos(2kpi/n)+isin(nkpi/n) 0<=k<n
for($i=0;$i<$n;$i++)
{
        for($j=$i+1;$j<$n;$j++)
        {
                if(($i*$j)%$n==1)
                {
                        $x1=$cote/2 + $largeur/2*cos((2*$i*M_PI)/$n);
                        $y1=$cote/2 + $largeur/2*sin((2*$i*M_PI)/$n);
                        $x2=$cote/2 + $largeur/2*cos((2*$j*M_PI)/$n);
                        $y2=$cote/2 + $largeur/2*sin((2*$j*M_PI)/$n);
                       
                        ImageLine ($image, $x1, $y1, $x2, $y2, $couleur1);
                }
        }
}

imagepng($image);   
imagedestroy( $image );

?>

pourrais tu me passer le code pour un mandelbrot qui marche stp?

Mon site : www.e-caveavin.com
Mon cv : Mon cv
Un projet pour l'ecole : Le passe livre
Mon blog pro avec plein de tuto (googlemaps/flickr/drag'n drop/navigation en ajax non intrusif/etc) : http://antoine.guiral.info
 
Hors ligne Locke # Posté le 05/07/2007 à 23:40:11
Groupe : Membres
(bon je sais pas si c'est mieux ici où dans l'autre topic sur le triangle de Sierpinski et dérivés, je vous laisse juges)

En partant du triangle de Sierpinski et en représentant mes triangles comme des polygones réguliers à trois côté définis par un centre et un sommet, je me suis dit : et si on "généralisait" un peu ça avec d'autres polygones réguliers ? faire un genre de carré de Sierpinski, ou même un pentagone, etc... on peut jouer sur deux facteurs : le nombre de côtés du polygone n, et un facteur k qui est, disons, la fraction représentant la distance entre le centre d'un polygone et le centre du polygone "suivant" (en terme de profondeur dans l'algorithme, si je puis dire) sur la droite centre-sommet du polygone. Enfin, c'est peut-être pas super clair comme ça, mais faites un dessin, vous verrez.

Après expérience, on remarque qu'avec k = 0.5, et n = 3 on retombe sur le triangle de Sierpinski, un résultat que je ne m'explique pas encore, je pensais que ce k aurait eut une expression un brin moins rationnelle, mais, bon.

Dès qu'on change k et/ou n, on tombe sur des résultats assez fantastiques :

k=0.3, n=3 - L'effet de flou est du à une redimention de l'image, et il rend plutôt pas mal parce qu'il faut avouer que le rendu graphique de CamlLight est assez... déplorable, quelque part
k=0.4, n=4 - Bon, d'accord, rien de très génial mais j'trouvais ça marrant. Ca serait probablement beaucoup mieux avec des couleurs de partout, mais je ne connais vraiment pas bien la librairie graphique de Caml.
k=0.2, n=5 - Ca pourrait être plus beau si on allait plus loin dans l'alhorithme, mais d'une part ça serait long (oui il est pas du tout optimisé, comme ça je dirais une complexité en O(n^m) où m est la profondeur) et d'autre part, avec caml ça donne un rendu assez ignoble si on met trop de lignes partout
k=0.5, n=5 - Histoire de voir vraiment ce que ferait un "pentagone de Sierpinski". Mais, quand k est plus petit que 0.5, en définitive, ça fait des trucs plus beau.

Bon donc euh voilà. Mon code est le suivant (et, non, je connais pas l'OCaml, c'est du Caml normal, tant pis) :
Code : Ocaml

#open "graphics";;

(* la constante pi *)
let pi = 4.*.atan(1.);;

(* deux fonctions pratiques pour tracer des trucs *)
let centre = function (a,b),(c,d) -> (a+.c)/.2.,(b+.d)/.2.;;
let similitude = function (a,b),(x,y),k,theta ->
    k*.((cos theta)*.(a-.x) -. (sin theta)*.(b-.y)) +. x,
    k*.((cos theta)*.(b-.y) +. (sin theta)*.(a-.x)) +. y;;

(* on décurryfie un peu les fonctions caml - en profitant pour convertir les float en int *)
let placerPoint (x,y) = moveto (int_of_float x) (int_of_float y);;
let tracerLigne (x,y) = lineto (int_of_float x) (int_of_float y);;

(* trace un polygone régulier de centre w, dont un sommet est p et de n côtés *)
let polygone = function w,p,n ->
    let pas = 2.*.pi/.(float_of_int n) in
    placerPoint p;
    for i = 1 to n do
        tracerLigne (similitude (p,w,1.,(float_of_int i)*.pas));
    done;;

(* la fonction proprement dite : trace en partant d'un centre w et d'un sommet p *)
let rec polys (w,p,k,n) = function
    | 0 -> ()
    | m -> polygone(w,p,n);
        let centres = make_vect n (0.,0.) and sommets = make_vect n (0.,0.) and pas = 2.*.pi/.(float_of_int n) in
        sommets.(0) <- p;
        for i = 1 to n-1 do
            sommets.(i) <- similitude(p,w,1.,(float_of_int i)*.pas);
            centres.(i) <- centre(sommets.(i),sommets.(i-1));
        done;
        centres.(0) <- centre(sommets.(n-1),p);
        for i=0 to n-1 do
            polys (similitude(w,sommets.(i),k,0.),centres.(i),k,n) (m-1);
        done;;

(* un appel pour faire exemple - ici, k=0.3 et n=3*)
open_graph("");;
polys ((300.,300.),(500.,500.),0.3,3) 10;;

 


Bon voilà, c'est mignon tout ça. J'ai essayé des k supérieurs à 1 aussi mais ça rend pas vraiment génialement, enfin j'ai pas trouvé. De même, prendre des polygones à plus de 6 ou 7 côtés c'est pas très intéressant.
Édité le 06/07/2007 à 00:36:35 par Locke
Hors ligne poxbox # Posté le 06/07/2007 à 00:23:43
Langue natale = PHP
Avatar
Groupe : Membres
Citation : Kados
Voila ce que j'ai :
Image utilisateur
Et la code :
Code : PHP
<?php

$taillecarre = 300;

$img = imagecreate($taillecarre, $taillecarre);
$noir = imagecolorallocate($img, 255, 255, 255);

$col_poly = imagecolorallocate($img, 0, 0, 0);

for ($a=0;$a<=$taillecarre/2;$a+=$taillecarre/100) {
        imagepolygon($img, array (
                0+$a,   0,
                $taillecarre, 0+$a,
                $taillecarre-$a, $taillecarre,
                        0, $taillecarre-$a
            ),
            4,
            $col_poly);
}

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

?>




Je me suis permis de colorer un peut le code de 1506377,

Voila ce que j'ai:

Image utilisateur

Et si on rafraichi la page, on obtient des couleures différente a chaque fois, rien de plus simple que quelques bon 'rand'

Voila le code:

Code : PHP
<?php


$taillecarre = 600;

$img = imagecreate($taillecarre, $taillecarre);
$noir = imagecolorallocate($img, 255, 255, 255);

$rand_couleur1= mt_rand(0,255);
$rand_couleur2= mt_rand(0,255);
$rand_couleur3= mt_rand(0,255);
$rand_couleur4= mt_rand(0,255);

$rand = array($col_poly1 = imagecolorallocate($img, $rand_couleur1, $rand_couleur4, $rand_couleur2),
                         $col_poly2 = imagecolorallocate($img, $rand_couleur2, $rand_couleur2, $rand_couleur1),
                         $col_poly3 = imagecolorallocate($img, $rand_couleur3, $rand_couleur3, $rand_couleur3),
                         $col_poly = imagecolorallocate($img, $rand_couleur4, $rand_couleur1, $rand_couleur4));

for ($a=0;$a<=$taillecarre/2;$a+=$taillecarre/600)
{
        $rand2 = array_rand($rand);
        imagepolygon($img, array (
                0+$a,   0,
                $taillecarre, 0+$a,
                $taillecarre-$a, $taillecarre,
                        0, $taillecarre-$a
            ),
            4,
            $rand2);
}

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

?>

Code : Console
cd /pub; who | grep -i blonde | date; cd ~ ; unzip ; strip ; touch ; finger ; uptime ; mount ; fsck ; more ; yes ; umount ; make mrproper ; sleep
 
Hors ligne Pmol # Posté le 06/07/2007 à 00:26:53
Mangez du Python
Avatar
Groupe : Membres
Comme delroth, un générateur de superformulas :) .
Le code n'est pas super beau par contre.
http://the.pmol.free.fr/python/superformula/

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 pH # Posté le 06/07/2007 à 00:29:57
Groupe : Membres
Mon ensemble de Mandelbrot en C :
J'ai utilisé la SDL.
Les fonctions definirPixel et obtenirPixel sont directement repompées du tuto de Piwaï Modifier une image pixel par pixel (merci à lui !!!)

La base du programme est facilement réutilisable pour d'autres dessins puisque on parcourt chaque pixel, et pour chaque pixel on peut modifier la couleur.
J'ai pas encore trouvé de fonctions qui rendaient des couleurs interessantes, celle là est la meilleure que j'ai trouvée.
Je me suis basé sur l'algorithme suivant.

Code : C
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <math.h>
#include <time.h>

void pause()
{
    int continuer = 1;
    SDL_Event event;

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
        }
    }
}

Uint32 obtenirPixel(SDL_Surface *surface, int x, int y)
{
    int nbOctetsParPixel = surface->format->BytesPerPixel;
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel;

    switch(nbOctetsParPixel)
    {
        case 1:
            return *p;
        case 2:
            return *(Uint16 *)p;
        case 3:
            if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
                return p[0] << 16 | p[1] << 8 | p[2];
            else
                return p[0] | p[1] << 8 | p[2] << 16;
        case 4:
            return *(Uint32 *)p;
        default:
            return 0;
    }
}

void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
    int nbOctetsParPixel = surface->format->BytesPerPixel;
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel;

    switch(nbOctetsParPixel)
    {
        case 1:
            *p = pixel;
            break;

        case 2:
            *(Uint16 *)p = pixel;
            break;

        case 3:
            if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
            {
                p[0] = (pixel >> 16) & 0xff;
                p[1] = (pixel >> 8) & 0xff;
                p[2] = pixel & 0xff;
            }
            else
            {
                p[0] = pixel & 0xff;
                p[1] = (pixel >> 8) & 0xff;
                p[2] = (pixel >> 16) & 0xff;
            }
            break;

        case 4:
            *(Uint32 *)p = pixel;
            break;
    }
}

int main (int argc, char** argv) {

        SDL_Surface *screen;
        Uint32 pixel;
        Uint8 r,g,b,a;
        int j,i,n;
        float k,m,x1,x,y;
        int nmax = 255;

        srand(time(NULL));

        SDL_Init (SDL_INIT_VIDEO);

        screen = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE);
        SDL_LockSurface(screen);

        for (j=0; j<600; j++) {
                m=(300.-j)/200.;
                for (i=0; i<800; i++) {
                        k=(-500.+i)/200.;
                        x=0;
                        y=0;
                        n=0;
                        do {
                                x1=x*x-y*y+k;
                                y=2*x*y+m;
                                x=x1;
                                n++;
                        } while (((x*x+y*y) <4) && (n<nmax));
                        pixel = obtenirPixel(screen,i,j);
                        SDL_GetRGBA(pixel, screen->format, &r,&g,&b,&a);
                        r=rand()*n%256;
                        g=(255-n)*rand()%256;
                        b=cos(n)*(rand()%256);     
                        pixel=SDL_MapRGBA(screen->format,r,g,b,a);
                        definirPixel(screen,i,j,pixel);
                }
        }



        SDL_UnlockSurface(screen);


        SDL_Flip(screen);

        pause();


        SDL_Quit();

        return EXIT_SUCCESS;
}
 
Édité le 06/07/2007 à 00:32:22 par pH
Hors ligne myman # Posté le 06/07/2007 à 00:34:20
ÉléPHPant o_0
Avatar
Groupe : Membres
Citation : pH
Mon ensemble de Mandelbrot en C :
J'ai utilisé la SDL.
Les fonctions definirPixel et obtenirPixel sont directement repompées du tuto de Piwaï Modifier une image pixel par pixel (merci à lui !!!)

La base du programme est facilement réutilisable pour d'autres dessins puisque on parcourt chaque pixel, et pour chaque pixel on peut modifier la couleur.
J'ai pas encore trouvé de fonctions qui rendaient des couleurs interessantes, celle là est la meilleure que j'ai trouvée.
Je me suis basé sur l'algorithme suivant.

Code : C
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <math.h>
#include <time.h>

void pause()
{
    int continuer = 1;
    SDL_Event event;

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
        }
    }
}

Uint32 obtenirPixel(SDL_Surface *surface, int x, int y)
{
    int nbOctetsParPixel = surface->format->BytesPerPixel;
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel;

    switch(nbOctetsParPixel)
    {
        case 1:
            return *p;
        case 2:
            return *(Uint16 *)p;
        case 3:
            if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
                return p[0] << 16 | p[1] << 8 | p[2];
            else
                return p[0] | p[1] << 8 | p[2] << 16;
        case 4:
            return *(Uint32 *)p;
        default:
            return 0;
    }
}

void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
    int nbOctetsParPixel = surface->format->BytesPerPixel;
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel;

    switch(nbOctetsParPixel)
    {
        case 1:
            *p = pixel;
            break;

        case 2:
            *(Uint16 *)p = pixel;
            break;

        case 3:
            if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
            {
                p[0] = (pixel >> 16) & 0xff;
                p[1] = (pixel >> 8) & 0xff;
                p[2] = pixel & 0xff;
            }
            else
            {
                p[0] = pixel & 0xff;
                p[1] = (pixel >> 8) & 0xff;
                p[2] = (pixel >> 16) & 0xff;
            }
            break;

        case 4:
            *(Uint32 *)p = pixel;
            break;
    }
}

int main (int argc, char** argv) {

        SDL_Surface *screen;
        Uint32 pixel;
        Uint8 r,g,b,a;
        int j,i,n;
        float k,m,x1,x,y;
        int nmax = 255;

        srand(time(NULL));

        SDL_Init (SDL_INIT_VIDEO);

        screen = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE);
        SDL_LockSurface(screen);

        for (j=0; j<600; j++) {
                m=(300.-j)/200.;
                for (i=0; i<800; i++) {
                        k=(-500.+i)/200.;
                        x=0;
                        y=0;
                        n=0;
                        do {
                                x1=x*x-y*y+k;
                                y=2*x*y+m;
                                x=x1;
                                n++;
                        } while (((x*x+y*y) <4) && (n<nmax));
                        pixel = obtenirPixel(screen,i,j);
                        SDL_GetRGBA(pixel, screen->format, &r,&g,&b,&a);
                        r=rand()*n%256;
                        g=(255-n)*rand()%256;
                        b=cos(n)*(rand()%256);     
                        pixel=SDL_MapRGBA(screen->format,r,g,b,a);
                        definirPixel(screen,i,j,pixel);
                }
        }



        SDL_UnlockSurface(screen);


        SDL_Flip(screen);

        pause();


        SDL_Quit();

        return EXIT_SUCCESS;
}
 


j'ai tester ton code sur dev c++
et cela m'affichais une erreur ...

GalaxieRPG
Avancement :
Code : ||||||||||||||||||||15%
Scénario :|||||||||||||||||||| 0%
 
Hors ligne pH # Posté le 06/07/2007 à 00:38:54
Groupe : Membres
C'est peut-être pas la peine de tout quoter, vu la taille du code ;) .
Je pourrais peut-être t'aider si seulement tu me disais de quelle erreur il s'agit.
Il doit sans doute s'agir d'un problème de linkage parce que chez moi ça marche.
Hors ligne Jules # Posté le 06/07/2007 à 01:24:28
Hey, that's Kool and the Gang.
Avatar
Groupe : Membres
Salut,
J'ai codé ça depuis quelques temps, si vous avez des questions n'hésitez pas car je n'ai presque rien commenté. Les paramètres du programme sont à régler par les defines et il faut avoir la SDL.
Cette fractale s'appelle le flocon de Koch, plus d'informations par ici : http://fr.wikipedia.org/wiki/Flocon_de_Koch

Edit : Une image :
Image utilisateur

Le code :
Code : C
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <math.h>

//Qualité
#define NOMBREDEFOI 4 //itération de la fractale
//forme
#define NOMBRE_SOMMETS 3
#define CST_RAYON 400.0
//Répetition
#define NOMBRE_INTERNE 4.0 //float
#define DECREMENTATION_RAYON 120
//Couleurs
#define ROUGE_DEPART 0
#define VERT_DEPART 255
#define BLEU_DEPART 0
#define ROUGE_ARRIVE 255
#define VERT_ARRIVE 0
#define BLEU_ARRIVE 0
//Tracage
#define TAILLE_PIXEL 1
#define LARGEUR 1024
#define HAUTEUR 768
//Gestion mémoire
#define DIMTAB (pow(4,NOMBREDEFOI)+1)*2*NOMBRE_SOMMETS //Ne pas toucher

void pause();
void tracer_ligne(SDL_Surface *trait,SDL_Surface *ecran, float x1, float y1, float x2, float y2);
float absolu(float a);
void iteration(int *tableau);
void afficher(SDL_Surface *trait,SDL_Surface *ecran,int *tableau);

int main(int argc, char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);

    srand(time(NULL));

    SDL_Surface *ecran = NULL;
    SDL_Surface *trait = NULL;

    SDL_Rect position;

    int i,j,k;
    i=DIMTAB;
    int tableau[i];
    float rayon;

    ecran = SDL_SetVideoMode(LARGEUR, HAUTEUR, 32, SDL_HWSURFACE);
    trait = SDL_CreateRGBSurface(SDL_HWSURFACE, TAILLE_PIXEL, TAILLE_PIXEL, 32, 0, 0, 0, 0);

    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
    SDL_FillRect(trait, NULL, SDL_MapRGB(trait->format, 0, 0, 0));

    rayon=CST_RAYON;
    for (j=0;j<NOMBRE_INTERNE;j++)
    {
        SDL_FillRect(trait, NULL, SDL_MapRGB(trait->format, (((NOMBRE_INTERNE-j-1)/(NOMBRE_INTERNE-1))*ROUGE_DEPART+(j/(NOMBRE_INTERNE-1))*ROUGE_ARRIVE)/2,
                                                            (((NOMBRE_INTERNE-j-1)/(NOMBRE_INTERNE-1))*VERT_DEPART+(j/(NOMBRE_INTERNE-1))*VERT_ARRIVE)/2,
                                                            (((NOMBRE_INTERNE-j-1)/(NOMBRE_INTERNE-1))*BLEU_DEPART+(j/(NOMBRE_INTERNE-1))*BLEU_ARRIVE)/2));

        for (i=0;i<DIMTAB;i++)
        {
            tableau[i]=0;
        }
        k=0;
        for(i=0;i<NOMBRE_SOMMETS+1;i+=1)
        {
            tableau[k]=LARGEUR/2+rayon*cos((i*2*3.14159)/NOMBRE_SOMMETS);
            tableau[k+1]=HAUTEUR/2+rayon*sin((i*2*3.14159)/NOMBRE_SOMMETS);
            k+=2;
        }

        for (i=0;i<NOMBREDEFOI;i++)
        {
            iteration(tableau);
        }
        afficher(trait,ecran,tableau);
        SDL_Flip(ecran);
        rayon-=DECREMENTATION_RAYON;
    }


    SDL_Flip(ecran);

    pause();

    SDL_FreeSurface(trait);
    SDL_Quit();

    return 0;
}

void afficher(SDL_Surface *trait,SDL_Surface *ecran,int *tableau)
{
    int i=0;
    for(i=0;i+2<DIMTAB;i+=2)
    {
        if (tableau[i+2]!=0 && tableau[i+3]!=0)
        tracer_ligne(trait,ecran, tableau[i], tableau[i+1], tableau[i+2], tableau[i+3]);
    }
}

void iteration(int *tableau)
{
    SDL_Rect milieu;
    float x1,x2,y1,y2,a,i,HAUTEUR_TRIANGLE,milieu_x,milieu_y;
    int j,k,l,m;
    for (m=0;m+8<DIMTAB;m+=8)
    {
        if(tableau[m]==0 || tableau[m+1]==0 || tableau[m+2]==0 || tableau[m+3]==0) {break;}
        x1=tableau[m];y1=tableau[m+1];
        x2=tableau[m+2];y2=tableau[m+3];
        HAUTEUR_TRIANGLE=(sqrt(pow(y2-y1,2)+pow(x2-x1,2)))/(sqrt(12));
        a=(y2-y1)/(x2-x1);
        if (absolu(a)<=1)
        {
            if (x1 > x2) {i=x2;x2=x1;x1=i;i=y2;y2=y1;y1=i;}
            a=(y2-y1)/(x2-x1);
            milieu_x=x1+(x2-x1)/2;
            milieu_y=y1+a*(x2-x1)/2;
        }
        else
        {
            if