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

再學GDI+[53]: 路徑填充模式 - SetFillMode 交替模式與繞數模式差異解析

     編輯:Delphi

前言

TGPGraphicsPath.SetFillMode 決定複雜自相交路徑的填充判斷規則。兩種模式——交替模式與繞數模式——對重疊區域的填充結果截然不同,是向量圖形渲染的核心概念。

兩大填充模式深度對比

模式常數判斷規則視覺特徵適用場景
交替模式FillModeAlternate (0)射線法:穿越路徑奇數次→填充,偶數次→不填充重疊區呈「鎖鏈」狀交替填充一般圖形、字形、SVG 預設
繞數模式FillModeWinding (1)繞數法:路徑繞數非零→填充,零→不填充重疊區整體填充(視方向)複雜幾何、CAD、3D 渲染

雙橢圓重疊測試範例

兩個部分重疊的橢圓,RadioGroup 切換填充模式即時對比。

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  b: TGPBrush;
  p: TGPPen;
  path: TGPGraphicsPath;
  rect: TRect;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  b := TGPHatchBrush.Create(HatchStyleCross, aclSilver, aclKhaki);
  p := TGPPen.Create(aclRed, 1.75);
  path := TGPGraphicsPath.Create;
  rect := Bounds(10, 20, 150, 100);
  path.AddEllipse(MakeRect(rect));
  OffsetRect(rect, 60, 0);  {第二個橢圓右移 60,產生重疊}
  path.AddEllipse(MakeRect(rect));
  
  if RadioGroup1.ItemIndex = 1 then
    path.SetFillMode(FillModeWinding);  {預設為 Alternate}
  
  g.FillPath(b, path);
  g.DrawPath(p, path);  {繪製邊框輔助觀察}
  
  p.Free; b.Free; path.Free; g.Free;
end;

執行效果預覽

填充模式對比

視覺差異解析

  • 交替模式:重疊透鏡區域呈現「空心」效果(兩個橢圓邊界各穿越一次→偶數→不填充)
  • 繞數模式:重疊區域實心填充(兩橢圓同向繞行→繞數 ±2 ≠ 0 → 填充)
  • 路徑方向影響:繞數模式下,若第二個橢圓逆向繞行,重疊區繞數歸零→不填充

字形渲染關鍵知識

  • TrueType 字形使用 繞數模式 定義輪廓
  • 字形內部「孔洞」(如 'O', 'A', '8')由逆向繞數路徑定義
  • GDI+ AddString 自動建立正確方向的路徑

表單定義檔

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 184
  ClientWidth = 233
  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 RadioGroup1: TRadioGroup ... {Alternate / Winding 兩選項}
end
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved