GdiPlus[47]: IGPMatrix 矩阵(二)
GdiPlus[47]: IGPMatrix 矩阵(二)
涂孟超 发表于3年前
GdiPlus[47]: IGPMatrix 矩阵(二)
  • 发表于 3年前
  • 阅读 2
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   


IGPMatrix 的属性与方法:

//方法
IGPMatrix.Reset;              { 重置 Matrix 得到单位矩阵(斜对角线是1其他是0) }
IGPMatrix.Translate();        { 平移 }
IGPMatrix.Scale();            { 放缩 }
IGPMatrix.Rotate();           { 旋转(沿(0,0)点, 顺时针) }
IGPMatrix.RotateAt();         { 沿指定点, 顺时针旋转 }
IGPMatrix.Shear();            { 剪切(或叫错切、斜切) }
IGPMatrix.Invert;             { 反转 }
IGPMatrix.Multiply();         { 与指定的 Matrix 相乘 }
IGPMatrix.TransformPoint();   { 对指定点应用此 Matrix 变换 }
IGPMatrix.TransformPoints();  { 对点数组应用此 Matrix 变换 }
IGPMatrix.TransformVector();  { 对指定点应用此 Matrix 变换中的缩放和旋转变换 }
IGPMatrix.TransformVectors(); { 对点数组应用此 Matrix 变换中的缩放和旋转变换 }
IGPMatrix.SetElements();      { 设置 Matrix 各元素 }
IGPMatrix.Clone;              { 克隆副本 }
IGPMatrix.Equals();           { 判断是否相等 }

//属性
IGPMatrix.Elements;           { 获取 Matrix 各元素构成的数组 }
IGPMatrix.OffsetX;            { 获取 Matrix.Elements.DX }
IGPMatrix.OffsetY;            { 获取 Matrix.Elements.DY }
IGPMatrix.IsInvertible;       { 判断 Matrix 是否可逆转 }
IGPMatrix.IsIdentity;         { 判断 Matrix 是否是单位矩阵(斜对角线是1其他是0) }

 
 
 
 
 

 

 

  

下面的例子用到了其中的 Reset、Translate、Scale、Rotate、Shear、Invert 方法:



代码:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  GdiPlus;

var
  Matrix: IGPMatrix;

//用字符串的形式返回 Matrix 数据, 用于查看
function ViewMatrix(Matrix: IGPMatrix): string;
const
  fmt = '%f'#9'%f'#9'0'#13#10#13#10'%f'#9'%f'#9'0'#13#10#13#10'%f'#9'%f'#9'1';
begin
  Result := Format(fmt, [Matrix.Elements.M11,
                         Matrix.Elements.M12,
                         Matrix.Elements.M21,
                         Matrix.Elements.M22,
                         Matrix.Elements.DX,
                         Matrix.Elements.DY]);
end;

//初识化
procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Caption := '重置 (Reset)';
  Button2.Caption := '反转 (Invert)';
  Button3.Caption := '平移 (Translate)';
  Button4.Caption := '比例 (Scale)';
  Button5.Caption := '旋转 (Rotate)';
  Button6.Caption := '错切 (Shear)';
  Matrix := TGPMatrix.Create;
end;

//绘图
procedure TForm1.FormPaint(Sender: TObject);
var
  Image: IGPImage;
  Graphics: IGPGraphics;
  Rect: TGPRect;
begin
  Image := TGPImage.Create('C:\GdiPlusImg\Apple.gif');
  Rect.Initialize(20, 20, 80, 80);
  Graphics := TGPGraphics.Create(Handle);
  Graphics.MultiplyTransform(Matrix);
  Graphics.DrawImage(Image, Rect);
  Graphics.DrawRectangle(TGPPen.Create($FFFF0000, 2), Rect);
end;

//重置到单位矩阵
procedure TForm1.Button1Click(Sender: TObject);
begin
  Matrix.Reset;
  Memo1.Text := ViewMatrix(Matrix);
  Repaint;
end;

//反转变换
procedure TForm1.Button2Click(Sender: TObject);
begin
  Matrix.Invert;
  Memo1.Text := ViewMatrix(Matrix);
  Repaint;
end;

//平移变换
procedure TForm1.Button3Click(Sender: TObject);
begin
  Matrix.Translate(1.5, 3);
  Memo1.Text := ViewMatrix(Matrix);
  Repaint;
end;

//比例变换
procedure TForm1.Button4Click(Sender: TObject);
begin
  Matrix.Scale(0.75, 1.5);
  Memo1.Text := ViewMatrix(Matrix);
  Repaint;
end;

//旋转变换
procedure TForm1.Button5Click(Sender: TObject);
begin
  Matrix.Rotate(15);
  Memo1.Text := ViewMatrix(Matrix);
  Repaint;
end;

//错切变换
procedure TForm1.Button6Click(Sender: TObject);
begin
  Matrix.Shear(0.2, 0.5);
  Memo1.Text := ViewMatrix(Matrix);
  Repaint;
end;

end.

 
 
 
 
 

 

 

  

窗体:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 200
  ClientWidth = 377
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 185
    Top = 8
    Width = 90
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 281
    Top = 8
    Width = 90
    Height = 25
    Caption = 'Button2'
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 185
    Top = 39
    Width = 90
    Height = 25
    Caption = 'Button3'
    TabOrder = 2
    OnClick = Button3Click
  end
  object Button4: TButton
    Left = 281
    Top = 39
    Width = 90
    Height = 25
    Caption = 'Button4'
    TabOrder = 3
    OnClick = Button4Click
  end
  object Button5: TButton
    Left = 185
    Top = 70
    Width = 90
    Height = 25
    Caption = 'Button5'
    TabOrder = 4
    OnClick = Button5Click
  end
  object Memo1: TMemo
    Left = 185
    Top = 111
    Width = 181
    Height = 81
    Lines.Strings = (
      'Memo1')
    TabOrder = 5
  end
  object Button6: TButton
    Left = 281
    Top = 70
    Width = 90
    Height = 25
    Caption = 'Button6'
    TabOrder = 6
    OnClick = Button6Click
  end
end

 
 
 
 
 

 

 

  
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 12
博文 2004
码字总数 14107
×
涂孟超
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: