onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Fractale : L'ensemble de Mandelbrot Sam 5 Déc 2009 - 14:36 | |
| Voila ça c'est peut être jamais vu sous GM : une jolie fractale, l'ensemble de Mandelbrot. Sa conception nécessite la maitrise des nombres complexes mais c'est tout de même contournable ^^. Ajout d'unne dll spéciale pour l'ensemble de mandelbrot : http://host-a.net/onilink_/MandelbrotplusDll.rarVoici le code en C avec SDL pour ceux qui sont intéressés : - Spoiler:
- Code:
-
#include <SDL/SDL.h> #include <complex.h> #include <math.h>
#define rgb(r,g,b) ( (r)*256*256 + (g)*256 + (b) ) #define min(x,y) ( (x>y) ? y : x ) #define max(x,y) ( (y>x) ? y : x ) #define sqr(x) ((x)*(x))
void draw_point(SDL_Surface *surf, int x, int y, Uint32 col); int get_point_mandelbrot(double x, double y); int hsv(double h,double s,double v);
int main(int argc, char *argv[]) { Uint8 *keystates = SDL_GetKeyState(NULL); SDL_Surface *screen = NULL; SDL_Rect position, clip; SDL_Event event; int a_t = 0, p_t = 0; int x,y; SDL_Init(SDL_INIT_VIDEO); screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); for(x=0 ; x<640 ; x++) for(y=0 ; y<480 ; y++) *((Uint32*)(screen->pixels) + x + y * screen->w) = get_point_mandelbrot( ((double)x-430)/200 , ((double)y-240)/200 );
for(;;) { SDL_PollEvent(&event); if (event.type==SDL_QUIT) break; SDL_PumpEvents(); if(keystates[SDLK_ESCAPE]) break; a_t = SDL_GetTicks(); if (a_t - p_t < 20) SDL_Delay(20 - a_t + p_t); p_t = SDL_GetTicks(); SDL_Flip(screen); } SDL_FreeSurface(screen); SDL_Quit(); return EXIT_SUCCESS; }
int get_point_mandelbrot(double x, double y) { int m,iter = 30; complex z = 0, c = x + y*I; for(m=0 ; m<=iter && sqrt(sqr(creal(z))+sqr(cimag(z)))<=2 ; m+=1) z = z*z + c; if (m <= iter) return hsv(255-m*8,255,255); return 0; }
int hsv(double h,double s,double v) { double r,g,b;
r = min(255,max(510-min(h,255-h)/42.5*255,0))/255*v; g = min(255,max(510-max(85-h,h-85)/42.5*255,0))/255*v; b = min(255,max(510-max(170-h,h-170)/42.5*255,0))/255*v;
r += (v-r)*(1-s/255); g += (v-g)*(1-s/255); b += (v-b)*(1-s/255); return rgb(max(0,(int)r),max(0,(int)g),max(0,(int)b)); }
Maintenant sous GM : Voila, la seule fonction : get_color_mandelbrot(x,y) - Code:
-
var X,Y,iter,cr,ci,zr,zi,m; X = argument0 Y = argument1
iter = 12
cr = X ci = Y
zr = X zi = Y
for(m=0 ; m<iter && sqrt(zr*zr + zi*zi)<=2 ; m+=1) { p = zr*zr - zi*zi + X zi = 2*zr*zi + Y zr = p }
return make_color_hsv(m*m,255,255-m*m)
Maintenant creez un objet et mettez : CREATE - Code:
-
surf = surface_create(256,192) surface_set_target(surf) draw_clear(c_white)
for(i=0 ; i<256 ; i+=1) { for(j=0 ; j<192 ; j+=1) { in = get_color_mandelbrot( (i-256/2-30)/65, (j-192/2)/65 ) draw_point_color(i,j,in) } }
surface_reset_target()
DRAW - Code:
-
draw_surface(surf,0,0)
GAME END - Code:
-
surface_free(surf)
Voila si vous avez des problème de lenteur diminuez la variable iter dans la fonction, bien entendu il y auras une perte de précision... Je vous précise que les fractales, surtout celle-ci nécessitent beaucoup de calcul donc le temps de lancement est de quelques secondes pour un ordinateur moyen mais risque de prendre pas mal de temps sur les vielles machines ^^. Un conseil, amusez vous a changer les paramètres de coloration de la fractale, c'est la dernière ligne de la fonction : default : make_color_hsv(m*m,255,255-m*m) d'autres : - make_color_hsv(m*10,m*m,255) - make_color_rgb(0,ln(m)*90,0)*(m!=iter) - make_color_rgb(m*m*3,m*m*3,m*m*3)*(m!=iter) Je posterais d'autres types de coloration par la suite, sinon j'espere que ça vous plairas et @++ !
Dernière édition par onilink_ le Ven 18 Juin 2010 - 1:00, édité 4 fois |
|
Invité Invité
| Sujet: Re: Fractale : L'ensemble de Mandelbrot Sam 5 Déc 2009 - 14:56 | |
| triforce powaa excellent boulot, comme d'habitude |
|
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Fractale : L'ensemble de Mandelbrot Sam 5 Déc 2009 - 15:19 | |
| Merci, Et VIVE LA TRIFORCE ! ^^ |
|
M@d_Doc Modérateur
Messages : 6600 Localisation : 47°44'8.04 Projet Actuel : aucun
| Sujet: Re: Fractale : L'ensemble de Mandelbrot Sam 5 Déc 2009 - 15:23 | |
| gm n'est pas installé sur mon PC. un screenshot? [edit] et voilà : - Spoiler:
_________________ Tous les icones de gm utilisables sur le cbna ICI |
|
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Fractale : L'ensemble de Mandelbrot Jeu 24 Déc 2009 - 13:22 | |
| Voila j'ai mis la source d'un projet C avec SDL pour les intéressés :pac_dr: . |
|
nicoulas *Excellent utilisateur*
Messages : 6030 Localisation : Dordogne Projet Actuel : Croustaface Tower Defense
| Sujet: Re: Fractale : L'ensemble de Mandelbrot Ven 25 Déc 2009 - 11:04 | |
| Waw, génial, ça doit être ma fractale préférée |
|
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Fractale : L'ensemble de Mandelbrot Ven 18 Juin 2010 - 1:02 | |
| creation d'une dll a source visible pour generer la fractale plus vite. Par contre draw_point etant relativement lent la generation de la surface reste plus ou moins longue en fonction de sa taille >.< |
|
glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: Re: Fractale : L'ensemble de Mandelbrot Ven 18 Juin 2010 - 14:26 | |
| salut, je voulais posé une question. Je me demandais qu'est ce que c'est ce fractale, pourquoi il est uniforme, y a-t-il quelque chose de special dans celui ci ? |
|
arthuro Utilisateur confirmé: Rang ****
Messages : 1483 Localisation : Paris Projet Actuel : Diagon https://arthursonzogni.com/Diagon
| Sujet: Re: Fractale : L'ensemble de Mandelbrot Ven 18 Juin 2010 - 15:37 | |
| bin une fractal, c'est une figure où on peux la retrouver elle même à une échelle plus petite (dans elle même). Si on zoom dans celle ci, on peux la retrouver à l'identique.
Pour faire la fractal de mendigote.
A tous point (x,y), on regarde si la suite (en prenant l'affixe Z du point)
U(0)=0 U(n+1) = U(n)² + Z
Si sa ne diverge pas, le point appartient à l'ensemble.
Bon, sinon a part que c'est beau, il est dure d'y trouver un intérêt pour l'instant (peu être qu'un jour ? ...) |
|
Chulien Utilisateur confirmé: Rang *****
Messages : 2232
| Sujet: Re: Fractale : L'ensemble de Mandelbrot Ven 18 Juin 2010 - 17:03 | |
| |
|
Contenu sponsorisé
| Sujet: Re: Fractale : L'ensemble de Mandelbrot | |
| |
|