Sabtu, 14 Mei 2016

Tutorial Transformasi 2D di Delphi 7




Assalamualaikum...
kembali lagi untuk berbagi ilmu nih...






 full code :
unit Utama;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    editx1: TEdit;
    edity1: TEdit;
    editx2: TEdit;
    edity2: TEdit;
    ScrollBox1: TScrollBox;
    Image1: TImage;
    btnbintang: TButton;
    btnclear: TButton;
    btnclose: TButton;
    Label5: TLabel;
    Label6: TLabel;
    editTX: TEdit;
    editTy: TEdit;
    Label8: TLabel;
    editR: TEdit;
    btnTrans: TButton;
    btnScaling: TButton;
    btnRotasi: TButton;
    Label9: TLabel;
    editS: TEdit;
    Timer1: TTimer;
    Button1: TButton;
    editTimer: TEdit;
    Timer2: TTimer;
    Timer3: TTimer;
    Button2: TButton;
    Button3: TButton;
    Label10: TLabel;
    btnppscaling: TButton;
    btnpprotasi: TButton;
    Label7: TLabel;
    Label11: TLabel;
    editPx: TEdit;
    editPy: TEdit;
    btnPivot: TButton;
    procedure btnbintangClick(Sender: TObject);
    procedure btnclearClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btncloseClick(Sender: TObject);
    procedure btnRotasiClick(Sender: TObject);
    procedure btnTransClick(Sender: TObject);
    procedure btnScalingClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure btnppscalingClick(Sender: TObject);
    procedure btnpprotasiClick(Sender: TObject);
    procedure btnPivotClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
uses Math;
  var
    a, b, i : integer;
    x1, y1, x2, y2 : integer;
    x,y : array[1..5] of double;
    Px, Py : double;
    Tx, Ty : double;
    S : single;
    R : double;
    simpanX : double;
{$R *.dfm}

procedure TForm1.btnbintangClick(Sender: TObject);
begin
  x1 := StrToInt(editx1.Text);
  y1 := StrToInt(edity1.Text);
  x2 := StrToInt(editx2.Text);
  y2 := StrToInt(edity2.Text);
  x[1] := x1;
  y[1] := y2;
  x[2] := x1+(x2-x1) div 2;
  y[2] := y1;
  x[3] := x2;
  y[3] := y2;
  x[4] := x1;
  y[4] := y2+2*(y1-y2) div 3;
  x[5] := x2;
  y[5] := y[4];
  Image1.Canvas.Pen.Color := clBlue;
  Image1.Canvas.Pen.Style := psSolid;
  Image1.Canvas.MoveTo(a+Round(x[5]),b-Round(y[5]));
  for i := 1 to 5 do
  begin
    Image1.Canvas.LineTo(a+Round(x[i]),b-Round(y[i]));
  end;
end;

procedure TForm1.btnclearClick(Sender: TObject);
begin
  Image1.Canvas.Pen.Color := clWhite;
  Image1.Canvas.Pen.Style := psSolid;
  Image1.Canvas.Brush.Color := clWhite;
  Image1.Canvas.Brush.Style := bsSolid;
  Image1.Canvas.Rectangle(1,1,Image1.Width,Image1.Height);
  Image1.Canvas.Pen.Color := clRed;
  Image1.Canvas.Pen.Style := psDot;
  Image1.Canvas.MoveTo(a,0);
  Image1.Canvas.LineTo(a,Image1.Height);
  Image1.Canvas.MoveTo(0,b);
  Image1.Canvas.LineTo(Image1.Width,b);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  a := Image1.Width div 2;
  b := Image1.Height div 2;
  btnclearClick(nil);
  {ScrollBox1.VertScrollBar.Position := b;
  ScrollBox1.HorzScrollBar.Position := a; }
end;

procedure TForm1.btncloseClick(Sender: TObject);
begin
  close;
end;

procedure TForm1.btnRotasiClick(Sender: TObject);
begin
  R := StrToFloat(editR.Text);
  //rotasi biasa
  Px := StrToFloat(editPx.Text);
  Py := StrToFloat(editPy.Text);
  simpanX := Px;
  Px := Px * Cos(R * pi/180) - Py * Sin(R * pi/180);
  Py := simpanX * Sin(R * pi/180) + Py * Cos(R * pi/180);
  editPx.Text := FloatToStr(Px);
  editPy.Text := FloatToStr(Py);

  for i := 1 to 5 do
  begin
    simpanX := x[i];
    x[i] := x[i] * Cos(R * pi/180) - y[i] * Sin(R * pi/180);
    y[i] := simpanX * Sin(R * pi/180) + y[i] * Cos(R * pi/180);
  end;

  btnclearClick(Sender);
  Image1.Canvas.Pen.Color := clBlue;
  Image1.Canvas.Pen.Style := psSolid;
  Image1.Canvas.MoveTo(a+Round(x[5]),b-Round(y[5]));
  for i := 1 to 5 do
  begin
    Image1.Canvas.LineTo(a+Round(x[i]),b-Round(y[i]));
  end;
end;

procedure TForm1.btnTransClick(Sender: TObject);
begin
  Tx := StrToFloat(editTx.Text);
  Ty := StrToFloat(editTy.Text);
  //translasi biasa
  Px := StrToFloat(editPx.Text);
  Py := StrToFloat(editPy.Text);
  Px := Px + Tx;
  Py := Py + Ty;
  editPx.Text := FloatToStr(Px);
  editPy.Text := FloatToStr(Py);

  for i := 1 to 5 do
  begin
    x[i] := x[i] + Tx;
    y[i] := y[i] + Ty;
  end;

  btnclearClick(Sender);
  Image1.Canvas.Pen.Color := clBlue;
  Image1.Canvas.Pen.Style := psSolid;
  Image1.Canvas.MoveTo(a+Round(x[5]),b-Round(y[5]));
  for i := 1 to 5 do
  begin
    Image1.Canvas.LineTo(a+Round(x[i]),b-Round(y[i]));
  end;
end;

procedure TForm1.btnScalingClick(Sender: TObject);
begin
  S := StrToFloat(editS.Text);
  //scaling biasa
  Px := StrToFloat(editPx.Text);
  Py := StrToFloat(editPy.Text);
  Px := Px * S;
  Py := Py * S;
  editPx.Text := FloatToStr(Px);
  editPy.Text := FloatToStr(Py);

  for i := 1 to 5 do
  begin
    x[i] := x[i] * S;
    y[i] := y[i] * S;
  end;

  btnclearClick(Sender);
  Image1.Canvas.Pen.Color := clBlue;
  Image1.Canvas.Pen.Style := psSolid;
  Image1.Canvas.MoveTo(a+Round(x[5]),b-Round(y[5]));
  for i := 1 to 5 do
  begin
    Image1.Canvas.LineTo(a+Round(x[i]),b-Round(y[i]));
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  btnTransClick(Sender);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Interval := StrToInt(editTimer.Text);
  Timer1.Enabled := NOT Timer1.Enabled;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  btnScalingClick(Sender);
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
  btnRotasiClick(Sender);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer2.Interval := StrToInt(editTimer.Text);
  Timer2.Enabled := NOT Timer2.Enabled;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Timer3.Interval := StrToInt(editTimer.Text);
  Timer3.Enabled := NOT Timer3.Enabled;
end;

procedure TForm1.btnppscalingClick(Sender: TObject);
begin
  Px := StrToFloat(editPx.Text);
  Py := StrToFloat(editPy.Text);
  //translasi titik pivot ke 0,0 diikuti titik lainnya
  Tx := -Px;
  Ty := -Py;
  for i := 1 to 5 do
  begin
    x[i] := x[i] + Tx;
    y[i] := y[i] + Ty;
  end;
  //scaling
  S := StrToFloat(editS.Text);
  for i := 1 to 5 do
  begin
    x[i] := x[i] * S;
    y[i] := y[i] * S;
  end;
  //kembalikan titik pivot ke titik semula
  Tx := Px;
  Ty := Py;
  for i := 1 to 5 do
  begin
    x[i] := x[i] + Px;
    y[i] := y[i] + Py;
  end;
  //gambarkan
  btnclearClick(Sender);
  Image1.Canvas.Pen.Color := clBlue;
  Image1.Canvas.Pen.Style := psSolid;
  Image1.Canvas.MoveTo(a+Round(x[5]),b-Round(y[5]));
  for i := 1 to 5 do
  begin
    Image1.Canvas.LineTo(a+Round(x[i]),b-Round(y[i]));
  end;
end;

procedure TForm1.btnpprotasiClick(Sender: TObject);
begin
  Px := StrToFloat(editPx.Text);
  Py := StrToFloat(editPy.Text);
  //translasi titik pivot ke 0,0 diikuti titik lainnya
  Tx := -Px;
  Ty := -Py;
  for i := 1 to 5 do
  begin
    x[i] := x[i] + Tx;
    y[i] := y[i] + Ty;
  end;
  //rotasi
  R := StrToFloat(editR.Text);
  for i := 1 to 5 do
  begin
    simpanX := x[i];
    x[i] := x[i] * Cos(R * pi/180) - y[i] * Sin(R * pi/180);
    y[i] := simpanX * Sin(R * pi/180) + y[i] * Cos(R * pi/180);
  end;
  //kembalikan titik pivot ke titik semula
  Tx := Px;
  Ty := Py;
  for i := 1 to 5 do
  begin
    x[i] := x[i] + Px;
    y[i] := y[i] + Py;
  end;
  //gambarkan
  btnclearClick(Sender);
  Image1.Canvas.Pen.Color := clBlue;
  Image1.Canvas.Pen.Style := psSolid;
  Image1.Canvas.MoveTo(a+Round(x[5]),b-Round(y[5]));
  for i := 1 to 5 do
  begin
    Image1.Canvas.LineTo(a+Round(x[i]),b-Round(y[i]));
  end;
end;

procedure TForm1.btnPivotClick(Sender: TObject);
begin
  Px := x1 + (x2-x1) div 2;
  Py := y2 + (y1-y2) div 2;
  editPx.Text := FloatToStr(Px);
  editPy.Text := FloatToStr(Py);
end;

end.

1 komentar: