J´ai pensé à un truc tout simple :
Voici un petit code qui permet de creer et sauver une image TGA.
Le but de l´exercice est de reussir a generer de jolies images en un minimum de ligne.
Le code est simplifié au maximum. Il y a juste la fonction " ComputeImage" a remplir et la seule fonction a appeller est " PutPixel".
L´image generée est en 1024x768 en 32 bits.
Le code peut etre copiler sur n´importe quel compilateur et n´importe quelle machine. C´est juste un petit fichier . cpp utilisant le minimum de fonctions.
Je ferais une belle page internet dés que mon provider sera plus en travaux.
Pour ceux qui veulent deja tenter le coup, voici le code et voici une exemple qui genere un beau degradé.
unsigned char image[1024*768*4];
void PutPixel(int x, int y, unsigned char R, unsigned char G, unsigned char B, unsigned char A);
/ / -- Remplir la fonction ci dessous, afficher des pixels avec la fonction " PutPixel"
void ComputeImage()
{
int x,y;
for ( x=0; x<1024; x++)
{
for ( y=0; y<768; y++)
{
PutPixel(x,y,x*y/256,y/4,x/4,0);
}
}
}
/ / -- Ne rien modifier en dessous de cette ligne
void PutPixel(int x, int y, unsigned char R, unsigned char G, unsigned char B, unsigned char A)
{
image[((y*1024)+x)*4+0]=R;
image[((y*1024)+x)*4+1]=G;
image[((y*1024)+x)*4+2]=B;
image[((y*1024)+x)*4+3]=A;
}
/ / --
void ClearImage()
{
int x,y;
for ( x=0; x<1024; x++)
{
for ( y=0; y<768; y++)
{
PutPixel(x,y,0,0,0,0);
}
}
}
/ / --
void SaveImage(char* name)
{
// Sauve TGA
int vide[3];
short pipo;
vide[0]=0; vide[1]=0; vide[2]=0;
FILE* fichier=fopen(name, " wb");
fwrite(&, 1, 2, fichier);
pipo=2; / / type of image 0=none,1=indexed,2=rgb,3=grey,+8=rle packed
fwrite(&, 1, 1, fichier);
fwrite(&, 1, 9, fichier);
pipo=1024; / / image width in pixels
fwrite(&, 2, 1, fichier);
pipo=768; / / image height in pixels
fwrite(&, 2, 1, fichier);
pipo=32; / / image bits per pixel 8,16,24,32
fwrite(&, 1, 1, fichier);
pipo=0x30; / / image descriptor bits ( vh flip bits) ( 00vhaaaa)
fwrite(&, 1, 1, fichier);
fwrite(&, 4, 1024*768, fichier);
fclose(fichier);
}
/ / --
int main(int argc, char *argv[])
{
ClearImage();
ComputeImage();
SaveImage("MyPicture.tga");
}
Vous pouvez poster ici vos proposition de code ( poster uniquement la fonction " ComputeImage", le reste ne doit pas etre modifier).
Evidement, faut remettre les tabulation enlevees par ce sal forum
Pour les feneant, je peux mailer le code.
interessant, j´essayerais peut-être de te sortir de jolie fractale en peu de ligne.
le problème du tga, c´est que ya pas bcp de programme qui le lise.
donc j´ai fait une version de ton programme qui enregistre en bitmap.
http://pepinlebref.free.fr/image_lapintade.txt
les fonctions sont exactement les même et on peu encore faire du TGA si on veut.
ah, j´ai oublié de préciser que le bitmap ne marchera que sur windows par contre.
Tous les bons programmes lisent le TGA
( AcdSee, Photoshop, IfranView . .).
Evidement le viewer tout pourri de windows doit pas savoir.
Merci pour cette variante. Ton programme est plus complet, on repartira de ta version.
Une petite fractale serait en effet une bonne idée.
Je posterai sur une page, les images proposées ici.
C´est un sujet qui reviens de nombreuses fois, certains contests java sous gamedev ( de tete), et meme moi sur mon site
(http://membres.lycos.fr/amycoders/compo/texcompoc<BR>ontrib.html sont les images, max code pour la generation: 128 bytes). En general, ca n´a AUCUN interet, sauf pour les demomakers..
/ kUfa.scoopex^scarab
membres.lycos.fr/amycoders/compo/texcompocontrib.h
tml en esperant que celui la passe..
En general, ca n´a AUCUN interet
Je comprends pas trop le sens de ta remarque. Ce genre d´exercice est toujours bon pour s´amuser, apprendre et se perfectionner. C´est des interet ca non ?
Je pense que ce qu´il veut dire, c´est que sans un contexte d´utilisation autour ( entre autres demos dont il parlait), l´interet reste restreint.
Certes, ca n´enleve rien a l´amusement de l´exercice
Faites chauffer les noyaux, ca va convoluer...
lgv: t enfou, tu blur ; )
Ben vi l´interet c´est l´amusement.
On peut etablir un comptage qui est le nombre de caracteres de la fonction ComputeImage().
Ce nombre sera simplement donné a titre indicatif.
Il n´y a pas vraiment de competition
Tout ca c´est pour le fun.
j´ai mis à jour le fichier de manière à ce que le tga utilise les coordonné de manière logique ( avec les x de gauche à droite plutot que le contraire).
et voila ma première contribution :
void ComputeImage()
{
double zr,zi,cr,ci,zrt;
int X,Y,I;
for ( Y=0,X=0;Y<IMAGE_Y;X++,X==IMAGE_X?Y++,X=0:0)
{
cr=zr=-.77+X*(.005)/IMAGE_X;ci=zi=-0.106+Y*(.003)/
IMAGE_Y;
for ( I=1;I<255;I++)
{
zrt=zr;
zr=zr*zr-zi*zi+cr;
zi=2*zrt*zi+ci;
if ( (zr*zr+zi*zi)>4)
{
PutPixel(X,Y,0,0,I<<4);
break;
}
}
}
}
Petit conseil, les break pour sortir d´une boucle for sont à éviter.
Normallement si tu fait bien t´as boucle, elle doit pourvoir s´arreter toute seule.
Pour le TGA, il y avait pas besoin d´inverser les x, ca marchait trés bien normallement.
Le flip est fait avec un flag au moment de la sauvegarde :
pipo=0x30; / / image descriptor bits ( vh flip bits) ( 00vhaaaa)
Ca permets de garder un tableau toujours dans le meme sens.
Il y a des walls si vous voulez paster vos codes, ça sera p´tet plus propre
http://walljv.free.fr par exemple
dnob700> Elle est cool ton image. C´est une mandelbrot ? ?
Bravo.
ShellShock > Tu fais comment pour arretter une boucle " toute seule" ? ? ( a part mettre une condition d´arret dans la ligne du for ? )
Le break ( et continue) ne sont pas dangereux en soit. Ce qui est dangereux c´est de les mettre dans un des boucles imbriquées et ensuite on sait plus trop ce que le break arrette ( un break arrette un for ou while,c´est ca ? )
gollumkawder > Merci, c´est en effet plus pratique pour poster du code.
En theorie une boucle doit respecter uniquement ses conditions d´arret : donc pas de break.
Le break s´utilise seulement si on trouve pas d´autre solution, mais dans le cas présent il peut utiliser un while.
non, dans le cas présent un while est un peu inutile parce qu´il y a plusieurs condition d´arret, donc soit j´utilise un break ( mais dans ce cas là on revient au point de départ) soit je doit utiliser une variable suplémentaire ( sans compter le compteur qu´il faut incrémenter dans la boucle).
enfin, si t´as un bout de code avec un while, ej suis bien sur tout ouïe a voir ton idée.
lapintade: t´es sur que c´est pas system dependant les coordonné du tga, parce que chez moi, si je n´inverse pas les x, x=0 c´est tout à droite de l´image.
pour les walls leproblème c´est que ça finit par disparaitre.
http://pepinlebref.free.fr/ComputeImage.txt
une meilleures version de mon images, encore moins compréhensible, mais qui affiche plus de couleurs.
et effectivement, c´est un petit bout de l´ensemble de mandelbrot que j´aime bien ( ce petit bout, l´ensemble aussi d´ailleur).
bon, allez vous autres qui lisez cela, quelques création aussi.
Sympa la nouvelle version. Les couleurs reste encore un peu sombre, il y a moyen de faire plus gai je pense . ..
Si tu aime mandelbrot, regarde ce programme qui affiche en temps reel un zoom dessus :
http://leonard.oxg.free.fe.fr/demos/tiny/MandelZoom.zip
C´est un ami qui a fait ca, ca tient en 4Kb.
bon, allez vous autres qui lisez
cela, quelques création aussi.
Vi vi je cherche des idées
Manque de temps en ce moment aussi . .. Les autres peuvent essayer aussi . ..
Je sais pas si on autorise la creation de fonctions. C´est un challenge interressant de tout faire dans une seule fonction.