unit Unit0; { This software has been designed and is CopyLefted by Han de Bruijn (===) @-O^O-@ #/_\# ### All I ask is to be credited when it is appropriate. Main unit for Project0 ====================== } interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Grafisch, Contours; 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} const x : array[0..4] of double = (0, 0.5, 0 , -0.5, 0 ); y : array[0..4] of double = (0, 0 , 0.5, 0 , -0.5); { Positions of "quasars" in Einstein cross } var tel : integer; beeld : array of array of double; max : double; procedure Schetsen; { First picture } var i,j,k : integer; begin for k := 0 to 4 do begin i := x2i(x[k]); j := y2j(y[k]); Form1.Image1.Canvas.MoveTo(i,j); Form1.Image1.Canvas.Ellipse(i-5,j-5,i+5,j+5); end; end; function P(r,d : double) : double; { Fuzzy Optics @ http://www.alternatievewiskunde.nl/MijnBoek/vaagzien.htm } begin P := d/(2*Pi*(r*r+d*d)*sqrt(r*r+d*d)); end; procedure VaagZien; { Second picture = fuzzyfication of first one } const d : double = 0.2; var i,j,k : integer; a,b,r : double; begin max := 0; for k := 0 to 4 do begin for j := 0 to Hoog-1 do begin for i := 0 to Wijd-1 do begin a := i2x(i); b := j2y(j); r := sqrt((a-x[k])*(a-x[k])+(b-y[k])*(b-y[k])); beeld[i,j] := beeld[i,j] + P(r,d); if beeld[i,j] > max then max := beeld[i,j]; end; end; end; for i := 0 to Wijd-1 do for j := 0 to Hoog-1 do Form1.Image1.Canvas.Pixels[i,j] := Grijs(beeld[i,j]/max); end; procedure Verband; { Contouring of second picture } const grens : integer = 10; var O : Omtrekken; g,i,j,k : integer; nivo : double; begin O := Omtrekken.Create; O.Scherm := Form1.Image1.Picture.Bitmap; O.afmetingen(Wijd,Hoog); for g := 0 to grens do begin nivo := (g/grens)*max; for j := 0 to Hoog-1 do begin for i := 0 to Wijd-1 do begin O.funktie[i,j] := beeld[i,j]-nivo; end; end; O.Rondom(false); for k := 0 to O.Aantal do O.Schetsen(k,Grijs((max-nivo)/max),2); end; end; procedure TForm1.Toetsdruk(Sender: TObject; var Key: Char); { On KeyPress } begin if tel = 0 then begin ClearDevice; Form1.Image1.Canvas.Pen.Width := 2; Form1.Image1.Canvas.Pen.Color := clBlack; Form1.Image1.Canvas.Brush.Color := clBlack; Schetsen; Form1.Image1.Picture.SaveToFile('mike1.bmp'); end; if tel = 1 then begin VaagZien; Form1.Image1.Picture.SaveToFile('mike2.bmp'); end; if tel = 2 then begin Verband; Form1.Image1.Picture.SaveToFile('mike3.bmp'); end; tel := tel+1; if tel = 3 then tel := 0; end; procedure TForm1.Scheppen(Sender: TObject); { On Create } var i,j : integer; begin xmin := -1; xmax := +1; ymin := -1; ymax := +1; TV(Form1.Image1); ClearDevice; tel := 0; SetLength(beeld,Wijd,Hoog); for i := 0 to Wijd-1 do for j := 0 to Hoog-1 do beeld[i,j] := 0; max := 0; end; end.