unit Unit6; { This software has been designed and it is CopyLefted by Han de Bruijn: (===) @-O^O-@ #/_\# ### Just ONE Voronoi region ----------------------- } INTERFACE uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Grafisch; type TForm1 = class(TForm) Image1: TImage; procedure Toetsdruk(Sender: TObject; var Key: Char); procedure Scheppen(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; IMPLEMENTATION {$R *.dfm} type punt = record x,y : double; c : TColor; end; vlak = array of punt; function Kleur : TColor; { Generates random color } var even,k : byte; effe : Tcolor; begin effe := 0; for k := 1 to 3 do begin even := Round(255*(Random)); effe := (effe shl 8) or even; end; Kleur := $00000000 or effe; end; procedure tekenen(N : integer); { Draw Image } const d : integer = 3; var i,j,k,L : integer; rij : vlak; xm,ym,t,x,y,x1,x2,y1,y2,f : double; OK : boolean; begin { Random Sites } SetLength(rij,N); Random; Random; Random; Random; Form1.Image1.Canvas.Brush.Color := clBlack; for k := 0 to N-1 do begin rij[k].x := Random; rij[k].y := Random; i := x2i(rij[k].x); j := y2j(rij[k].y); if k > 0 then Form1.Image1.Canvas.Ellipse(i-d,j-d,i+d,j+d); end; { Site has random color } for k := 0 to N-1 do begin rij[k].c := Kleur; end; { Consider region at site (0) } i := x2i(rij[0].x); j := y2j(rij[0].y); Form1.Image1.Canvas.Ellipse(i-5,j-5,i+5,j+5); t := sqrt(sqr(xmax-xmin)+sqr(ymax-ymin)); for i := 0 to 0 do begin { Draw Perpendicular Bisectors } for j := i+1 to N-1 do begin xm := (rij[i].x+rij[j].x)/2; ym := (rij[i].y+rij[j].y)/2; k := x2i(xm-t*(rij[j].y-rij[i].y)); L := y2j(ym+t*(rij[j].x-rij[i].x)); Form1.Image1.Canvas.MoveTo(k,L); k := x2i(xm+t*(rij[j].y-rij[i].y)); L := y2j(ym-t*(rij[j].x-rij[i].x)); { with color belonging to site (j) } Form1.Image1.Canvas.Pen.Color := rij[j].c; Form1.Image1.Canvas.LineTo(k,L); end; end; { Loop through all pixels } for j := 0 to Hoog-1 do begin y := j2y(j); for i := 0 to Wijd-1 do begin x := i2x(i); OK := true; { Voronoi region (0) definition } for k := 0 to 0 do begin for L := k+1 to N-1 do begin x1 := rij[k].x; y1 := rij[k].y; x2 := rij[L].x; y2 := rij[L].y; { with Perpendicular Bisectors } xm := (x1+x2)/2; ym := (y1+y2)/2; f := (x-xm)*(x2-x1)+(y-ym)*(y2-y1); OK := OK and (f < 0); end; end; if OK then Form1.Image1.Canvas.Pixels[i,j] := clRed; end; end; i := x2i(rij[0].x); j := y2j(rij[0].y); Form1.Image1.Canvas.Pen.Color := clBlack; Form1.Image1.Canvas.Ellipse(i-5,j-5,i+5,j+5); for i := 0 to 0 do begin { Draw radii from (i) to (j) } for j := i+1 to N-1 do begin k := x2i(rij[i].x); L := y2j(rij[i].y); Form1.Image1.Canvas.MoveTo(k,L); k := x2i(rij[j].x); L := y2j(rij[j].y); { with color belonging to site (j) } Form1.Image1.Canvas.Pen.Color := rij[j].c; Form1.Image1.Canvas.LineTo(k,L); end; end; end; procedure TForm1.Toetsdruk(Sender: TObject; var Key: Char); { On KeyPress } begin Exit; end; procedure TForm1.Scheppen(Sender: TObject); { At moment of creation } begin xmin := 0; xmax := 1; ymin := 0; ymax := 1; TV(Form1.Image1); ClearDevice; Tekenen(25); Form1.Image1.Picture.SaveToFile('voronoi.bmp'); end; END.