Das folgende Beispiel zeigt, wie man eine Matrix-Grafik ohne Komponenten zeichnet, dazu wird nur die TMatrix Library benötigt. Hier handelt es sich um eine 2D-Grafik, die in eine PaintBox gemalt wird.
Malen:
Edit1 + Edit2 = Seite A
Edit3 + Edit4 = Seite B
Edit5 + Edit6 = Seite C
Button3 = Malen
Verschiebung:
Edit7 + Edit8
Button1 = Verschieben
Drehung:
Edit9 + Edit10 + Edit11
Button2 = Drehen
Transformation:
Edit13 + Edit14 + Edit15
Button4 = Transformieren
type TMatrix = array[1..3,1..3] of real;
tp = array[1..3] of record x,y:real end;
var
Form1: TForm1;
p:tp;
matrix: TMatrix;
punkt:array[0..2] of tpoint;
//
procedure matrixrechnen(matrix:tmatrix);
var h:tp;
i:integer;
begin
for i:=1 to 3 do begin
h[i].x:=matrix[1,1]*p[i].x+matrix[1,2]*p[i].y+matrix[1,3]*1;
h[i].y:=matrix[2,1]*p[i].x+matrix[2,2]*p[i].y+matrix[2,3]*1;
end;
for i:=1 to 3 do begin
p[i].x:=h[i].x;
p[i].y:=h[i].y;
end;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
b,h,i:integer;
begin
b:=paintbox1.width;
h:=paintbox1.height;
paintbox1.canvas.pen.color:=clgray;
paintbox1.canvas.moveto(10,h div 2);
paintbox1.canvas.lineto(b-10,h div 2);
paintbox1.canvas.moveto(b div 2,10);
paintbox1.canvas.lineto(b div 2,h-10);
for i:=1 to 3 do begin
punkt[i-1].x:=round(b/2+50*p[i].x);
punkt[i-1].y:=round(h/2-50*p[i].y);
end;
paintbox1.canvas.Pen.color:=clblue;
paintbox1.canvas.brush.style:=bsclear;
paintbox1.canvas.polygon(slice(punkt,3));
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
p[1].x:=strtofloat(edit1.text);
p[1].y:=strtofloat(edit2.text);
p[2].x:=strtofloat(edit3.text);
p[2].y:=strtofloat(edit4.text);
p[3].x:=strtofloat(edit5.text);
p[3].y:=strtofloat(edit6.text);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
b,h,i:integer;
begin
fillchar(matrix,sizeof(matrix),0);
matrix[1,1]:=1;
matrix[2,2]:=1;
matrix[3,3]:=1;
matrix[1,3]:=strtofloat(edit7.text);
matrix[2,3]:=strtofloat(edit8.text);
matrixrechnen(matrix);
b:=paintbox1.width;
h:=paintbox1.height;
for i:=1 to 3 do begin
punkt[i-1].x:=round(b/2+50*p[i].x);
punkt[i-1].y:=round(h/2-50*p[i].y);
end;
paintbox1.canvas.Pen.color:=clblue;
paintbox1.canvas.brush.style:=bsclear;
paintbox1.canvas.polygon(slice(punkt,3));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
b,h,i:integer; w:real;
begin
fillchar(matrix,sizeof(matrix),0);
matrix[1,1]:=1;
matrix[2,2]:=1;
matrix[3,3]:=1;
matrix[1,3]:=-strtofloat(edit9.text);
matrix[2,3]:=-strtofloat(edit10.text);
matrixrechnen(matrix);
w:=-strtofloat(edit11.text)*pi/180;
fillchar(matrix,sizeof(matrix),0);
matrix[1,1]:=cos(w);
matrix[1,2]:=sin(w);
matrix[2,1]:=-sin(w);
matrix[2,2]:=cos(w);
matrix[1,3]:=0;
matrix[2,3]:=0;
matrix[3,3]:=1;
matrixrechnen(matrix);
fillchar(matrix,sizeof(matrix),0);
matrix[1,1]:=1;
matrix[2,2]:=1;
matrix[3,3]:=1;
matrix[1,3]:=strtofloat(edit9.text);
matrix[2,3]:=strtofloat(edit10.text);
matrixrechnen(matrix);
b:=paintbox1.width;
h:=paintbox1.height;
for i:=1 to 3 do begin
punkt[i-1].x:=round(b/2+50*p[i].x);
punkt[i-1].y:=round(h/2-50*p[i].y);
end;
paintbox1.canvas.Pen.color:=clblue;
paintbox1.canvas.brush.style:=bsclear;
paintbox1.canvas.polygon(slice(punkt,3));
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
p[1].x:=strtofloat(edit1.text);
p[1].y:=strtofloat(edit2.text);
p[2].x:=strtofloat(edit3.text);
p[2].y:=strtofloat(edit4.text);
p[3].x:=strtofloat(edit5.text);
p[3].y:=strtofloat(edit6.text);
paintbox1.canvas.brush.color:=clwhite;
paintbox1.canvas.rectangle(-1,-1,paintbox1.width+1,paintbox1.height+1);
paintbox1paint(sender);
end;
procedure TForm1.Button4Click(Sender: TObject);
var
b,h,i:integer;
begin
fillchar(matrix,sizeof(matrix),0);
matrix[3,3]:=1;
matrix[1,1]:=strtofloat(edit12.text);
matrix[1,2]:=strtofloat(edit15.text);
matrix[2,1]:=strtofloat(edit13.text);
matrix[2,2]:=strtofloat(edit14.text);
matrixrechnen(matrix);
b:=paintbox1.width;
h:=paintbox1.height;
for i:=1 to 3 do begin
punkt[i-1].x:=round(b/2+50*p[i].x);
punkt[i-1].y:=round(h/2-50*p[i].y);
end;
paintbox1.canvas.Pen.color:=clblue;
paintbox1.canvas.brush.style:=bsclear;
paintbox1.canvas.polygon(slice(punkt,3));
end;
Keine Kommentare:
Kommentar veröffentlichen