Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 120. - umíme sprej

Jan Šindelář - 10.12.2003

Začneme tedy od slibovaného spreje. Hodně grafických editorů již od dřevních dob počítačů obsahovalo tento jednoduchý efekt. I když je jeho reálné využití sporné (ovšem nejsem grafik, možná se mi to jen na první pohled zdá), rozhodně vypadá efektně a alespoň na minutu vás zabaví.

Nejedná se vlastně o nic jiného, než o určitý počet (v našem případě 100) náhodně vygenerovaných pixelů, které jsou vykresleny do určitého tvaru. Obvykle se pro zjednodušení používá kruh, který více méně odpovídá reálnému stavu. Na každé kliknutí myší se tak na danou pozici kurzoru vykreslí 100 pixelů do pomyslného kruhu, jehož středem je právě kurzor myši. Rovněž při pohybu myši při události OnMouseMove dojde k vykreslení dalších náhodných bodů, takže pak můžeme po celé ploše vytvářet spojitou stopu.

Pro náš příklad si tedy připravíme prázdný formulář, na který umístíme komponentu Image. Právě na její "plátno" pak budeme kreslit. Využít ale můžete i přímo plátno formuláře, ale předpoklad je takový, že tuto funkci budeme implementovat do nějakého jednoduchého grafického editoru, kde pravděpodobně pro kreslení přímo plochu formuláře nepoužijeme.

Naše procedura Spray má pak jasné parametry. Prvním z nich je plátno, na které kreslíme, dále souřadnice středu a poloměr pomyslného kruhu a konečně barva generovaných pixelů.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure Spray(Canvas: TCanvas; x, y, r: Integer; Color: TColor);
var
  rad, a: Single;
  i: Integer;
begin
  for i := 0 to 100 do
  begin
    a := Random * 2 * pi;
    rad := Random * r;
    Canvas.Pixels[x + Round(rad * Cos(a)), y + Round(rad * Sin(a))] := Color;
  end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then Spray(Image1.Canvas, x, y, 50, clLime);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then Spray(Image1.Canvas, x, y, 50, clLime);
end;

end.

Perfekcionisty bude jistě trápit to, že pokud nepohybujeme kurzorem, je nutné pro generování dalších pixelů na stejné místo znovu a znovu klikat myší. Vylepšení příkladu však již nechám na vás jako domácí úkol.