unit Unit2; { This software has been designed and it is CopyLefted by Han de Bruijn: (===) @-O^O-@ #/_\# ### } INTERFACE uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Generaal, Contours, Momenten, Math; 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 Wijd,Hoog : integer; O : Omtrekken; links,rechts,boven,onder : integer; function dubbel(C : TColor; nivo : double) : double; { Convert to double } var R,G,B : integer; w : double; begin R := C and $000000FF; G := (C and $0000FF00) shr 8; B := (C and $00FF0000) shr 16; w := (R + G + B)/3; dubbel := nivo - w/255; end; procedure eerste; { Load Bitmap } var i,j : integer; begin Form1.Image1.Picture.LoadFromFile('sbVut.bmp'); Form1.Image1.Picture.Bitmap.Pixelformat := pf24bit; with Form1.Image1.Picture.Bitmap do begin Wijd := Width; Hoog := Height; Writeln(Width:5,Height:5); end; O := Omtrekken.Create; O.Afmetingen(Wijd,Hoog); O.Scherm := Form1.Image1.Picture.Bitmap; for j := 0 to Hoog-1 do begin for i := 0 to Wijd-1 do begin O.funktie[i,j] := dubbel(O.Scherm.Canvas.Pixels[i,j],0.8); end; end; end; procedure tweede; { Contours & Boundaries } var k : integer; begin O.Rondom(true); for k := 1 to O.Aantal do begin O.Schetsen(k,clRed,1); end; links := Round(Wijd*0.24); rechts := Round(Wijd*0.65); boven := Round(Hoog*0.04); onder := Round(Hoog*0.90); O.Scherm.Canvas.Pen.Width := 2; O.Scherm.Canvas.Pen.Color := clBlack; O.Scherm.Canvas.MoveTo(links,0); O.Scherm.Canvas.LineTo(links,Hoog); O.Scherm.Canvas.MoveTo(rechts,0); O.Scherm.Canvas.LineTo(rechts,Hoog); O.Scherm.Canvas.MoveTo(0,boven); O.Scherm.Canvas.LineTo(Wijd,boven); O.Scherm.Canvas.MoveTo(0,onder); O.Scherm.Canvas.LineTo(Wijd,onder); end; procedure derde; { Second order Moments of Isolines & Angles } var k,tel : integer; sigma : tensor; hoek, totaal, fout, H : double; p : punt; OK : boolean; begin totaal := 0; fout := 0; tel := 0; for k := 1 to O.Aantal do begin p := O.StartPunt(k); OK := (links < p.x) and (p.x < rechts) and (boven < p.y) and (p.y < onder); if not OK then Continue; if Lijn_NuldeOrde(O.Kromme(k)) < 25 then Continue; sigma := Lijn_TweedeOrde(O.Kromme(k)); hoek := arctan(2*sigma.xy/(sigma.xx-sigma.yy))/2; { Writeln(hoek/Pi*180:5:2); } if hoek > 0 then Continue; totaal := totaal + hoek; tel := tel + 1; fout := fout + sqr(hoek); end; totaal := totaal/tel; O.Scherm.Canvas.Pen.Color := clGreen; O.Scherm.Canvas.MoveTo(links,boven); H := boven+tan(totaal+Pi/2)*(rechts-links); O.Scherm.Canvas.LineTo(rechts,Round(H)); fout := sqrt(fout/tel-sqr(totaal)); totaal := totaal/Pi*180; fout := fout/Pi*180; Writeln('Alpha =',-totaal:3:0,' +/-',fout:2:0,' degrees'); end; procedure TForm1.Toetsdruk(Sender: TObject; var Key: Char); { On KeyPress } begin tweede; derde; O.Scherm.SaveToFile('sbVut_out.bmp'); end; procedure TForm1.Scheppen(Sender: TObject); { At moment of creation } begin eerste; end; END.