unit Unit2; { This software has been designed and is CopyLefted by Han de Bruijn: (===) @-O^O-@ #/_\# ### } interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Grafisch; 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 Tekst(nr : integer); { Display Enumerations } var Ox,Oy : integer; begin with Form1.Image1.Canvas do begin Ox := PenPos.x; Oy := PenPos.y; TextOut(Ox,Oy,IntToStr(nr)); MoveTo(Ox,Oy); end; end; procedure Tekenen; { Pictures } const eps : double = 0.02; var x,y,D : array[1..4] of double; xi,eta,p,q,G : double; k,i,j,m,n : integer; scherm : array of array of double; nr : string[2]; begin { Random Quadrilateral } for k := 1 to 4 do begin x[k] := Random-1/2; y[k] := Random-1/2; end; { Jacobian Determinant } D[1] := (x[2]-x[1])*(y[3]-y[1])-(x[3]-x[1])*(y[2]-y[1]); D[2] := (x[2]-x[1])*(y[4]-y[2])-(x[4]-x[2])*(y[2]-y[1]); D[3] := (x[4]-x[3])*(y[3]-y[1])-(x[3]-x[1])*(y[4]-y[3]); D[4] := (x[4]-x[3])*(y[4]-y[2])-(x[4]-x[2])*(y[4]-y[3]); SetLength(scherm,Wijd,Hoog); for i := 0 to Wijd-1 do begin for j := 0 to Hoog-1 do begin scherm[i,j] := 0; end; end; { -1/2 < xi,eta < +1/2 } for j := 0 to Hoog do begin eta := j/Hoog-1/2; for i := 0 to Wijd do begin xi := i/Wijd-1/2; p := (1/2-xi)*(1/2-eta)*x[1] + (1/2+xi)*(1/2-eta)*x[2] + (1/2-xi)*(1/2+eta)*x[3] + (1/2+xi)*(1/2+eta)*x[4]; q := (1/2-xi)*(1/2-eta)*y[1] + (1/2+xi)*(1/2-eta)*y[2] + (1/2-xi)*(1/2+eta)*y[3] + (1/2+xi)*(1/2+eta)*y[4]; { G := (1/2-xi)*(1/2-eta)*D[1] + (1/2+xi)*(1/2-eta)*D[2] + (1/2-xi)*(1/2+eta)*D[3] + (1/2+xi)*(1/2+eta)*D[4]; } G := (D[1]+D[2]+D[3]+D[4])/4 + (D[2]-D[1]+D[4]-D[3])/2*xi + (D[3]-D[1]+D[4]-D[2])/2*eta; m := x2i(p); n := y2j(q); { 1:1 mapping + or - } if (G < 0) and (scherm[m,n] = 0) then scherm[m,n] := 1; if (G > 0) and (scherm[m,n] = 0) then scherm[m,n] := 2; { double valued mapping } if (G < 0) and (scherm[m,n] = 2) then scherm[m,n] := 3; if (G > 0) and (scherm[m,n] = 1) then scherm[m,n] := 4; { approximately zero } if abs(G) < eps then scherm[m,n] := 5; end; end; for j := 0 to Hoog-1 do begin for i := 0 to Wijd-1 do begin if scherm[i,j] = 1 then Form1.Image1.Canvas.Pixels[i,j] := clRed; if scherm[i,j] = 2 then Form1.Image1.Canvas.Pixels[i,j] := clGreen; if scherm[i,j] = 3 then Form1.Image1.Canvas.Pixels[i,j] := clGray; if scherm[i,j] = 4 then Form1.Image1.Canvas.Pixels[i,j] := clGray; if scherm[i,j] = 5 then Form1.Image1.Canvas.Pixels[i,j] := clBlue; end; end; Form1.Image1.Canvas.Pen.Color := clBlack; Form1.Image1.Canvas.Moveto(x2i(x[1]),y2j(y[1])); Tekst(1); Form1.Image1.Canvas.Lineto(x2i(x[2]),y2j(y[2])); Tekst(2); Form1.Image1.Canvas.Lineto(x2i(x[4]),y2j(y[4])); Tekst(4); Form1.Image1.Canvas.Lineto(x2i(x[3]),y2j(y[3])); Tekst(3); Form1.Image1.Canvas.Lineto(x2i(x[1]),y2j(y[1])); nr[1] := char((keer div 10)+byte('0')); nr[2] := char((keer mod 10)+byte('0')); Form1.Image1.Picture.SaveToFile('film\2P'+nr+'.bmp'); end; procedure TForm1.Scheppen(Sender: TObject); { On Create } begin TV(Form1.Image1); ClearDevice; xmin := -0.6; xmax := +0.6; ymin := -0.6; ymax := +0.6; Form1.Image1.Canvas.Font.Size := 15; Form1.Image1.Canvas.Pen.Width := 2; keer := 0; Tekenen; end; procedure TForm1.Toetsdruk(Sender: TObject; var Key: Char); { On KeyPress } begin ClearDevice; keer := keer + 1; Tekenen; end; end.