unit Unit7; { This software has been designed and it is CopyLefted by Han de Bruijn: (===) @-O^O-@ #/_\# ### DELAUNAY TRIANGULATION & VORONOI REGIONS ======================================== } INTERFACE uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Algemeen, Grafisch, Shamos; 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} var nodes : integer; procedure Some_Help; begin Writeln; writeln('Syntax: [program] [nodes]'); Writeln(' nodes = # random points'); Writeln(' Default # nodes = 10'); end; procedure Read_Parameters; var woord : string; OK : boolean; k : integer; begin nodes := 10; if not (ParamCount = 1) then Some_Help; if ParamCount = 0 then Exit; woord := ParamStr(1); OK := true; for k := 1 to Length(woord) do if not (woord[k] in ['0'..'9']) then OK := false; if not OK then begin Some_Help; Halt; end; nodes := StrToInt(woord); end; procedure tekenen(N : integer); { Make Drawing } var i,j,k,R,F,E : integer; rij,MP,u,v : punten; nrs,mesh : drietal; p,q,a,b,c,m : punt; BIG,RR : double; begin BIG := sqrt(sqr(xmax-xmin)+sqr(ymax-ymin)); { Random points in the plane } SetLength(rij,N); for k := 0 to N-1 do begin rij[k].x := Random; rij[k].y := Random; end; { Visualize the random points } Form1.Image1.Canvas.Pen.Color := clBlack; Form1.Image1.Canvas.Pen.Width := 1; Form1.Image1.Canvas.Brush.Color := clWhite; for k := 0 to N-1 do begin i := x2i(rij[k].x); j := y2j(rij[k].y); Form1.Image1.Canvas.Ellipse(i-3,j-3,i+3,j+3); end; Delaunay(rij,mesh,MP); { Visualize the triangles } F := Length(mesh); for k := 0 to F-1 do begin a := rij[mesh[k].A]; b := rij[mesh[k].B]; c := rij[mesh[k].C]; Form1.Image1.Canvas.Pen.Color := clRed; Form1.Image1.Canvas.Pen.Width := 2; teken_driehoek(a,b,c); omcirkel(a,b,c,m); RR := sqr(a.x-m.x)+sqr(a.y-m.y); Form1.Image1.Canvas.Pen.Color := clGray; Form1.Image1.Canvas.Pen.Width := 1; teken_cirkel(m,sqrt(RR)); end; convex_hull(rij,nrs); { Visualization of Convex Hull } R := Length(nrs); Form1.Image1.Canvas.Pen.Width := 2; Form1.Image1.Canvas.Pen.Color := clBlue; for k := 0 to R-1 do begin p := rij[nrs[k].A]; q := rij[nrs[k].B]; Form1.Image1.Canvas.MoveTo(x2i(p.x),y2j(p.y)); Form1.Image1.Canvas.LineTo(x2i(q.x),y2j(q.y)); end; Voronoi(rij,BIG,u,v); { Visualization of Voronoi Regions } Form1.Image1.Canvas.Pen.Color := clGreen; E := Length(u); { Writeln(E,'=',F+N-1); } for k := 0 to E-1 do begin Form1.Image1.Canvas.MoveTo(x2i(u[k].x),y2j(u[k].y)); Form1.Image1.Canvas.LineTo(x2i(v[k].x),y2j(v[k].y)); end; end; procedure TForm1.Toetsdruk(Sender: TObject; var Key: Char); { On KeyPress } begin Tijdmeting(''); ClearDevice; Tekenen(nodes); Form1.Image1.Picture.SaveToFile('hull.bmp'); Tijdmeting('Duur'); end; procedure TForm1.Scheppen(Sender: TObject); { At moment of creation } begin Tijdmeting(''); Read_Parameters; xmin := -0.1; xmax := 1.1; ymin := -0.1; ymax := 1.1; TV(Form1.Image1); ClearDevice; Tekenen(nodes); Form1.Image1.Picture.SaveToFile('hull.bmp'); Tijdmeting('Duur'); end; END.