首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

再學GDI+[54]: 路徑矩陣變換 - Transform 方法實現旋轉、縮放、傾斜、平移綜合操作

     編輯:Delphi

前言

TGPGraphicsPath.Transform 直接對路徑座標套用 TGPMatrix 3x2 仿射變換矩陣,實現旋轉、縮放、傾斜、平移的綜合幾何操作。本文提供六軌條即時控制矩陣六個參數,並展示矩形+橢圓+文字的複合路徑變換效果。

矩陣參數對應關係

matrix.SetElements(m11, m12, m21, m22, dx, dy);
對應:
m11: X軸縮放 + Y軸傾斜影響
m12: X軸傾斜
m21: Y軸傾斜
m22: Y軸縮放 + X軸傾斜影響
dx:  X軸平移
dy:  Y軸平移

六軌條矩陣控制台

軌條矩陣參數效果初始值
TrackBar1m11X 縮放 / 水平翻轉1.0
TrackBar2m12X 傾斜 (Shear X)0.0
TrackBar3m21Y 傾斜 (Shear Y)0.0
TrackBar4m22Y 縮放 / 垂直翻轉1.0
TrackBar5dxX 平移 (×10)0.0
TrackBar6dyY 平移 (×10)0.0

核心實作

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
  b: TGPBrush;
  path: TGPGraphicsPath;
  matrix: TGPMatrix;
  fontFamily: TGPFontFamily;
  StringFormat: TGPStringFormat;
  rect: TGPRect;
begin
  rect := MakeRect(20, 20, 180, 120);
  g := TGPGraphics.Create(PaintBox1.Canvas.Handle);
  p := TGPPen.Create(aclYellowGreen, 1);
  b := TGPHatchBrush.Create(HatchStyleSmallGrid, aclSilver, aclYellowGreen);
  fontFamily := TGPFontFamily.Create('Arial Black');
  StringFormat := TGPStringFormat.Create;
  StringFormat.SetAlignment(StringAlignmentCenter);
  StringFormat.SetLineAlignment(StringAlignmentCenter);
  path := TGPGraphicsPath.Create;
  path.AddRectangle(rect);
  path.AddEllipse(rect);
  path.AddString('ABC', -1, fontFamily, FontStyleRegular, 60, rect, StringFormat);
  
  matrix := TGPMatrix.Create;
  matrix.SetElements(
    TrackBar1.Position / 10,
    TrackBar2.Position / 10,
    TrackBar3.Position / 10,
    TrackBar4.Position / 10,
    TrackBar5.Position * 10,
    TrackBar6.Position * 10
  );
  path.Transform(matrix);  {關鍵:路徑座標永久變換}
  
  g.FillPath(b, path);
  g.DrawPath(p, path);
  
  path.Free; StringFormat.Free; fontFamily.Free;
  b.Free; p.Free; g.Free; matrix.Free;
end;

執行效果預覽

路徑矩陣變換效果

Transform vs Graphics 變換差異

特性path.Transform(matrix)graphics.SetTransform(matrix)
影響範圍永久修改路徑座標暫時影響後續繪圖
累積性疊加修改路徑本身可 ResetTransform 歸零
適用場景路徑編輯、永久變形、匯出動畫、相機、暫時效果
效能一次計算,重複使用快每幀重新計算

表單定義檔

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 172
  ClientWidth = 336
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object PaintBox1: TPaintBox ... {左側繪圖區}
  object Panel1: TPanel ... {右側六軌條控制面板}
end
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved