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 : 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 | |
Furzel
|
# Posté le 05/07/2007 à 19:29:59 |
|
Vive open arena ! 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 :
Cet image est en fait le composé des trois couleurs : Rouge : x+y
Vert : x-y
Bleu : x*y
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 |
Kados
|
# Posté le 05/07/2007 à 19:35:44 |
102013![]() Groupe : Membres |
Voila ce que j'ai :
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 :
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 ? Perles de profs Compatibilité amoureuse Jeux gratuits a télécharger Enigmes mathématiques Wallpapers Jeux de rôle en ligne Roller Citations Vidéo drôle Jeux flash |
bluestorm
|
# Posté le 05/07/2007 à 19:45:30 |
dont ask to ask![]() 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
|
bracor
|
# Posté le 05/07/2007 à 19:47:16 |
Ravioli.![]() 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...
|
delroth
|
# Posté le 05/07/2007 à 21:25:53 |
Un Python, ça mord !![]() 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
.
|
Blackhole
|
# Posté le 05/07/2007 à 21:47:45 |
Bear, and forbear![]() 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. |
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 |
Blackhole
|
# Posté le 05/07/2007 à 22:50:06 |
Bear, and forbear![]() 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. |
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 |
bluestorm
|
# Posté le 05/07/2007 à 22:56:15 |
dont ask to ask![]() 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
|
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 |
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
|
poxbox
|
# Posté le 06/07/2007 à 00:23:43 |
Langue natale = PHP![]() Groupe : Membres |
Citation : Kados
Voila ce que j'ai :
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: 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 |
Pmol
|
# Posté le 06/07/2007 à 00:26:53 |
Mangez du Python![]() 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 » |
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
|
myman
|
# Posté le 06/07/2007 à 00:34:20 |
ÉléPHPant o_0![]() 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% |
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. |
Jules
|
# Posté le 06/07/2007 à 01:24:28 |
|
Hey, that's Kool and the Gang. 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 :
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 |
