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

再學GDI+[57]: 路徑加寬轉區域 - Widen 方法將線條轉為填充範圍

     編輯:Delphi

前言

TGPGraphicsPath.Widen 是一個獨特且強大的方法:根據指定畫筆的寬度、線帽、連接樣式、虛線模式,將路徑中的「線條」展開為「填充區域」。轉換後的路徑只能用 FillPath 繪製,不再適用 DrawPath。

Widen 方法簽名

procedure Widen(const pen: TGPPen; matrix: TGPMatrix = nil; flatness: Single = 0.25);
  • pen:定義線條寬度、端點樣式、連接樣式、虛線模式的畫筆
  • matrix:可選矩陣變換(預設 nil)
  • flatness:曲線平坦化精度(預設 0.25)

互動式範例:CheckBox 控制 Widen 與顯示頂點

  • CheckBox1:執行 Widen(使用 20px 箭頭畫筆)
  • CheckBox2:顯示路徑所有頂點(紅色小方塊)

核心實作

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
  b1, b2: TGPBrush;
  path: TGPGraphicsPath;
  pts: array of TGPPoint;
  i: Integer;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  p := TGPPen.Create(aclSlateGray, 20);  {寬 20 像素}
  p.SetEndCap(LineCapArrowAnchor);       {箭頭終點}
  b1 := TGPSolidBrush.Create(aclRed);
  b2 := TGPHatchBrush.Create(HatchStyleDiagonalCross, aclSilver, aclSlateGray);
  path := TGPGraphicsPath.Create;
  path.AddLine(40, 50, ClientWidth-40, 50);  {水平線}
  
  if CheckBox1.Checked then begin
    path.Widen(p);           {關鍵:線條→區域}
    g.FillPath(b2, path);    {必須用 FillPath}
  end else
    g.DrawPath(p, path);     {原始線條用 DrawPath}
  
  if CheckBox2.Checked then begin
    SetLength(pts, path.GetPointCount);
    path.GetPathPoints(PGPPoint(pts), Length(pts));
    TGPSolidBrush(b1).SetColor(aclRed);
    for i := 0 to Length(pts) - 1 do
      g.FillRectangle(b1, pts[i].X-3, pts[i].Y-3, 6, 6);
  end;
  
  path.Free; b1.Free; b2.Free; p.Free; g.Free;
end;

執行效果預覽

Widen 線條轉區域效果

Widen 實戰應用場景

場景說明
線條碰撞偵測將細線擴寬為區域,簡化點擊/碰撞測試
筆觸效果模擬毛筆、鋼筆筆觸的寬度變化
虛線區域化虛線畫筆 Widen 後產生獨立矩形區域陣列
文字輪廓文字路徑 Widen 產生描邊效果
路徑布林運算將線條轉區域後可參與 Union/Intersect 等運算

重要限制與注意事項

  • 不可逆:Widen 會永久修改路徑結構,原始線條資訊遺失
  • 繪製方式改變:Widen 後必須用 FillPath,DrawPath 會產生錯誤結果
  • 畫筆屬性全採用:寬度、LineCap、LineJoin、DashStyle 皆影響結果
  • 效能考量:複雜路徑 Widen 會產生大量頂點,影響後續運算速度

表單定義檔

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 136
  ClientWidth = 287
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
  object CheckBox1: TCheckBox ... {兩個 CheckBox}
end
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved