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

再學GDI+[73]: 區域運算詳解 - 交集、聯集、差集與補集操作

     編輯:Delphi

前言

在 GDI+ 中,TGPRegion 類別提供了強大的區域運算功能,允許開發者對圖形區域進行布林運算。本文將詳細介紹五種核心運算模式:交集、聯集、排他或、排除 以及 補集,並透過完整的 Delphi 範例程式碼示範如何在實際專案中應用這些操作。

區域運算模式對照表

方法英文名稱中文說明運算邏輯
IntersectIntersection交集保留兩個區域重疊的部分
UnionUnion聯集合併兩個區域,包含所有範圍
Xor_Exclusive Or排他或保留不重疊的部分(移除交集)
ExcludeExclude排除從第一個區域中移除第二個區域
ComplementComplement補集取第一個區域中不與第二個區域重疊的部分

程式碼實作解析

範例程式建立一個橢圓路徑並轉換為區域,再建立一個矩形區域,透過 TRadioGroup 讓使用者即時切換運算模式觀察結果。

核心程式碼片段

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
  path: TGPGraphicsPath;
  b: TGPBrush;
  rgn: TGPRegion;
  rt: TGPRect;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  p := TGPPen.Create(MakeColor(100, 255, 0, 0));
  b := TGPHatchBrush.Create(HatchStyleSmallGrid, aclSilver, aclCornflowerBlue);
  
  {建立橢圓路徑並轉為區域}
  path := TGPGraphicsPath.Create;
  path.AddEllipse(20, 20, 100, 80);
  rgn := TGPRegion.Create(path);
  
  {取得路徑外接矩形並下移}
  path.GetBounds(rt);
  rt.Y := rt.Y + rt.Height div 2;
  
  {根據選項執行區域運算}
  case RadioGroup1.ItemIndex of
    1: rgn := TGPRegion.Create(rt);           {單純顯示矩形}
    2: rgn.Intersect(rt);                     {交集}
    3: rgn.Union(rt);                         {聯集}
    4: rgn.Xor_(rt);                          {排他或}
    5: rgn.Exclude(rt);                       {排除}
    6: rgn.Complement(rt);                    {補集}
  end;
  
  g.FillRegion(b, rgn);      {填充運算後的區域}
  g.DrawPath(p, path);       {繪製原始橢圓路徑}
  g.DrawRectangle(p, rt);    {繪製參考矩形}
  
  {釋放資源}
  b.Free; rgn.Free; p.Free; g.Free; path.Free;
end;

執行效果預覽

區域運算效果圖

關鍵技術點總結

  • 區域建立來源:GDI+ 區域可從矩形、路徑、現有區域建立,支援靈活的幾何組合。
  • 運算不可逆性:Intersect、Union 等方法會直接修改呼叫物件本身,若需保留原始區域請先複製。
  • 視覺化除錯:同時繪製原始路徑與運算參考矩形,有助於理解運算結果的幾何意義。
  • 資源管理:嚴格遵循 Create/Free 配對原則,避免 GDI+ 物件洩漏。

表單定義檔

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 167
  ClientWidth = 238
  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
    Left = 137
    Top = 8
    Width = 91
    Height = 151
    Caption = 'RadioGroup1'
    TabOrder = 0
    OnClick = RadioGroup1Click
  end
end
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved