this slowpoke moves

Draw Matrix 2D

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

Beliebte Posts

Translate