unit Unit4; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Grafiek, Math; type TForm1 = class(TForm) Image1: TImage; procedure Scheppen(Sender: TObject); procedure Toetsdruk(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var keer : integer; procedure Histogram(maal : integer); const N : integer = 100; L : double = 1/4; var k : integer; x,v,D,A,y,M : double; begin D := 1/N; A := L/(2*pi)/maal; x := 0; M := 0; for k := 1 to N do begin v := x; x := k*D + A*sin(2*pi/L*k*D); y := 1/(x-v); if y > M then M := y; end; x := 0; Form1.Image1.Canvas.Pen.Width := 1; Form1.Image1.Canvas.MoveTo(x2i(0),y2j(0)); for k := 1 to N do begin v := x; x := k*D + A*sin(2*pi/L*k*D); y := 1/(x-v)/M; Form1.Image1.Canvas.LineTo(x2i(v),y2j(0)); Form1.Image1.Canvas.LineTo(x2i(v),y2j(y)); Form1.Image1.Canvas.LineTo(x2i(x),y2j(y)); Form1.Image1.Canvas.LineTo(x2i(x),y2j(0)); end; if maal = 2 then Form1.Image1.Picture.SaveToFile('golf1.bmp'); if maal = 8 then Form1.Image1.Picture.SaveToFile('golf2.bmp'); end; procedure Driehoeken(maal : integer); const N : integer = 100; L : double = 1/4; var k : integer; D,A,y,M : double; x : array of double; begin D := 1/N; A := L/(2*pi)/maal; SetLength(x,N+1); for k := 0 to N do begin x[k] := k*D + A*sin(2*pi/L*k*D); end; M := 0; for k := 1 to N-1 do begin y := 2/(x[k+1]-x[k-1]); if y > M then M := y; end; Form1.Image1.Canvas.Pen.Width := 2; Form1.Image1.Canvas.MoveTo(x2i(0),y2j(0)); for k := 1 to N-1 do begin y := 2/(x[k+1]-x[k-1])/M; Form1.Image1.Canvas.LineTo(x2i(x[k]),y2j(y)); end; Form1.Image1.Canvas.LineTo(x2i(x[N]),y2j(0)); for k := 1 to N do begin Form1.Image1.Canvas.MoveTo(x2i(x[k]),y2j(0)); Form1.Image1.Canvas.LineTo(x2i(x[k]),y2j(0.1)); end; if maal = 2 then Form1.Image1.Picture.SaveToFile('golf3.bmp'); if maal = 8 then Form1.Image1.Picture.SaveToFile('golf4.bmp'); end; procedure Gaussians(N : integer); const L : double = 1/4; eps : double = 1/256; maal : integer = 2; var k,i : integer; D,A,M,v : double; mu,sigma,factor,norm : double; x,y : array of double; begin D := 1/N; A := L/(2*pi)/2; factor := sqrt(2*ln(2/eps))/(2*Pi)*maal; Writeln(factor); SetLength(x,N+1); for k := 0 to N do begin x[k] := k*D + A*sin(2*pi/L*k*D); end; M := 0; SetLength(y,Wijd); for i := 0 to Wijd-1 do y[i] := 0; for k := 1 to N do begin mu := (x[k]+x[k-1])/2; sigma := (x[k]-x[k-1])*factor; norm := 1/sqrt(sigma*2*Pi); for i := 0 to Wijd-1 do begin v := i2x(i); y[i] := y[i] + exp(-sqr((v-mu)/sigma)/2)*norm; end; end; for i := 0 to Wijd-1 do if y[i] > M then M := y[i]; Form1.Image1.Canvas.Pen.Width := 2; Form1.Image1.Canvas.MoveTo(x2i(0),y2j(y[0]/M)); for i := 1 to Wijd-1 do begin v := i2x(i); Form1.Image1.Canvas.LineTo(x2i(v),y2j(y[i]/M)); end; for k := 1 to N do begin Form1.Image1.Canvas.MoveTo(x2i(x[k]),y2j(0)); Form1.Image1.Canvas.LineTo(x2i(x[k]),y2j(0.2)); end; Form1.Image1.Picture.SaveToFile('golf6.bmp'); end; procedure Omgekeerd(N : integer); const L : double = 1/4; var k : integer; D,A,x,y,f : double; function P(x : double) : double; begin P := (1-A*2*Pi/L*cos(2*Pi/L*x))/D; end; function Q(x : double) : double; begin Q := A*sqr(2*Pi/L)*cos(2*Pi/L*x)/D; end; begin D := 1/N; A := L/(2*Pi)/2; Form1.Image1.Canvas.Pen.Width := 2; Form1.Image1.Canvas.MoveTo(x2i(0),y2j(0)); x := 0; for k := 1 to N do begin x := x + 1/(sqrt(sqr(P(x)/2)+Q(x)/2)+P(x)/2); Form1.Image1.Canvas.MoveTo(x2i(x),y2j(0)); Form1.Image1.Canvas.LineTo(x2i(x),y2j(0.2)); end; y := P(0)*D; f := (1+A*2*Pi/L); Form1.Image1.Canvas.MoveTo(x2i(0),y2j(y/f)); for k := 1 to Wijd do begin x := i2x(k); y := P(x)*D; Form1.Image1.Canvas.LineTo(k,y2j(y/f)); end; Form1.Image1.Picture.SaveToFile('golf5.bmp'); end; procedure TForm1.Scheppen(Sender: TObject); begin TV(Form1.Image1); ClearDevice; xmin := 0; xmax := 1; ymin := 0; ymax := 1; Histogram(2); end; procedure TForm1.Toetsdruk(Sender: TObject; var Key: Char); begin keer := keer + 1; if keer > 5 then keer := 0; ClearDevice; case keer of 0 : Histogram(2); 1 : Histogram(8); 2 : Driehoeken(2); 3 : Driehoeken(8); 4 : Omgekeerd(50); 5 : Gaussians(25); end; end; end.