Drole de truc (jl'ai pas fait exprés!!!)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 574 fois - Téléchargée 36 fois

Contenu du snippet

Cherchant a crée une "lumiere" sur un bitmap, et n'y arrivant pas je suis tombé sur des genres de fractales... g hesité a les mettre ici mais sa fait joli lol... sinon sa sert a rien :)

Source / Exemple :


//Les Types a rajouters
TRGBTripleArray = array[0..32767] of TRGBTriple;
  pRGBTripleArray = ^TRGBTripleArray;

procedure MakeLight(X,Y:integer;Intensity:byte;Bmp:TBitmap);
        var
        I,J:integer;
        RowOriginal: pRGBTripleArray;
        Adding:integer;
        begin
          for I:= X-(Intensity div 2) to X+(Intensity div 2) do begin
          RowOriginal:=bmp.ScanLine[I];

            for J:= Y-(Intensity div 2) to Y+(Intensity div 2) do begin
            adding:=((Intensity div 2)-sqr(J-Y)-sqr(I-X)) xor 255;

             if RowOriginal[J].rgbtRed+adding > 255 then
             RowOriginal[J].rgbtRed:=255 else
             inc(RowOriginal[J].rgbtRed,adding);

             if RowOriginal[J].rgbtGreen+adding > 255 then
             RowOriginal[J].rgbtGreen:=255 else
             inc(RowOriginal[J].rgbtGreen,adding);

             if RowOriginal[J].rgbtBlue+adding > 255 then
             RowOriginal[J].rgbtBlue:=255 else
             inc(RowOriginal[J].rgbtBlue,adding);

            end;
          end;
        end;

//Vous pouvez changer adding par differente fonction
//ex:
//un triangle
adding:=((Intensity div 2)-sqr(J-Y)+sqr(I-X)) xor 255;
//un genre de viseur transparent qui illumine...
adding:=(trunc(Intensity-sqrt(sqr(J-Y)+sqr(I-X)))) and 192;
//Autre et Bizzare:
adding:=-(trunc(sqrt(sqr(J-Y)+sqr(I-X))));
adding:=((sqr(Y-J)-sqr(X-I)))-intensity;
adding:=(trunc(Intensity+sqr(Y-J)-sqr(X-I)));

Conclusion :


Voila donc SVP trouvé moi la fonction qui permet de creer un cercle d'intensité forte au centre et null au bout lol je vous fremercie ;)

A voir également

Ajouter un commentaire Commentaires
Messages postés
16
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
29 décembre 2004

Voilà la procédure corrigée et optimisée qui fonctionne à présent à merveille !
Une unité à ajouter : Math.
Remarques :
- j'ai inversé X et Y pour que X corresponde à la colonne et non à la ligne de pixels du bitmap à modifier.
- j'ai ajouté un contrôle des variables de boucle "for" pour que le programme ne plante plus lorsque les X et Y entrés sont "trop près du bord" et que le programme cherche en conséquence à modifier des pixels hors de l'image.

procedure MakeLight(X, Y : Integer; D : Byte ; Bmp : TBitmap);
var
I, J, Adding : Integer;
P : pRGBTripleArray;
begin
D := D div 2;
for j := max(0, Y-D) to min(Y+D, bmp.Height-1) do begin
P := bmp.ScanLine[j];
for i := max(0, X-D) to min(X+D, bmp.Width-1) do begin
adding := 255 - min(trunc(255*(sqrt(sqr(i-X)+sqr(j-Y))/D)),255);
P[i].rgbtRed := min(255, P[i].rgbtRed + adding);
P[i].rgbtGreen := min(255, P[i].rgbtGreen + adding);
P[i].rgbtBlue := min(255, P[i].rgbtBlue + adding);
end;
end;
end;
Messages postés
16
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
29 décembre 2004

Voilà la procédure corrigée qui fonctionne à présent à merveille :
Une unité à ajouter : Math.

procedure MakeLight(X, Y : Integer; Intensity : Byte ; Bmp : TBitmap);
var
I, J, Adding : integer;
RowOriginal : pRGBTripleArray;
begin
for I:= max(0, X-(Intensity div 2)) to min(X+(Intensity div 2), bmp.Height-1) do begin
RowOriginal:=bmp.ScanLine[I];
for J:= max(0, Y-(Intensity div 2)) to min(Y+(Intensity div 2), bmp.Width-1) do begin
adding := 255 - min(trunc(255*(sqrt(sqr(I-X)+sqr(J-Y))/(Intensity div 2))),255);
if RowOriginal[J].rgbtRed+adding > 255 then
RowOriginal[J].rgbtRed:=255 else
inc(RowOriginal[J].rgbtRed,adding);
if RowOriginal[J].rgbtGreen+adding > 255 then
RowOriginal[J].rgbtGreen:=255 else
inc(RowOriginal[J].rgbtGreen,adding);
if RowOriginal[J].rgbtBlue+adding > 255 then
RowOriginal[J].rgbtBlue:=255 else
inc(RowOriginal[J].rgbtBlue,adding);
end;
end;
end;
Messages postés
52
Date d'inscription
vendredi 26 avril 2002
Statut
Membre
Dernière intervention
28 octobre 2003

heu... le bitmap doi tetre au pixelformat:=pf24bit;
voila, bye.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.