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軸平移
| 軌條 | 矩陣參數 | 效果 | 初始值 |
|---|---|---|---|
| TrackBar1 | m11 | X 縮放 / 水平翻轉 | 1.0 |
| TrackBar2 | m12 | X 傾斜 (Shear X) | 0.0 |
| TrackBar3 | m21 | Y 傾斜 (Shear Y) | 0.0 |
| TrackBar4 | m22 | Y 縮放 / 垂直翻轉 | 1.0 |
| TrackBar5 | dx | X 平移 (×10) | 0.0 |
| TrackBar6 | dy | Y 平移 (×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;

| 特性 | 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