首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 自訂繪圖進階(三):幾何圖形布爾運算 - GeometryGroup、CombinedGeometry 與 Geometry.Combine

     編輯:關於.NET

三種幾何合併方式對比

類別/方法繼承支援運算元素數量適用場景
GeometryGroup`Geometry`單純聯集 (Union)任意多個 (`Children` 集合)簡單疊加、填充規則控制
CombinedGeometry`Geometry`Union、Intersect、Xor、Exclude固定兩個 (`Geometry1`、`Geometry2`)需要布爾運算的雙圖形合併
Geometry.Combine()靜態方法Union、Intersect、Xor、Exclude固定兩個,可附加變換需先變換再合併、或程式碼動態合併

1. GeometryGroup:簡單疊加與填充規則

protected override void OnRender(DrawingContext dc)
{
    base.OnRender(dc);
    EllipseGeometry ellipse = new EllipseGeometry(new Point(50, 50), 50, 20);
    RectangleGeometry rect = new RectangleGeometry(new Rect(50, 50, 50, 20), 5, 5);

    GeometryGroup group = new GeometryGroup();
    group.FillRule = FillRule.EvenOdd; // 或 Nonzero
    group.Children.Add(ellipse);
    group.Children.Add(rect);

    dc.DrawGeometry(Brushes.LightBlue, new Pen(Brushes.Green, 2), group);
}

EvenOdd 填充規則 - 中空效果 Nonzero 填充規則 - 實心效果

FillRule.EvenOdd:射線穿越奇數段填充、偶數段不填 → 重疊區中空。
FillRule.Nonzero:考慮方向性,重疊區通常實心。

2. CombinedGeometry:四種布爾運算

CombinedGeometry combin = new CombinedGeometry(
    GeometryCombineMode.Xor, ellipse, rect);
// 模式可換為 Union, Intersect, Exclude
dc.DrawGeometry(Brushes.LightBlue, new Pen(Brushes.Green, 2), combin);

Exclude (A-B) Intersect (A∩B) Union (A∪B) Xor (AΔB)

  • Exclude:$A - B$ (A 減去 B)
  • Intersect:$A \cap B$ (交集)
  • Union:$A \cup B$ (聯集)
  • Xor:$(A-B) \cup (B-A)$ (對稱差集,不重疊區域)

3. Geometry.Combine() 靜態方法

PathGeometry combin = Geometry.Combine(
    ellipse, rect, GeometryCombineMode.Xor, null); // null 為無額外變換
dc.DrawGeometry(Brushes.LightBlue, new Pen(Brushes.Green, 2), combin);

優勢:第 4 參數接受 `Transform`,可在合併前對任一幾何套用旋轉、縮放、平移,靈活性最高。

選擇指南

  • 單純疊加多圖形 → GeometryGroup (效能最好)。
  • 兩圖形需 Union/Intersect/Xor/Exclude → CombinedGeometry (宣告式,適合 XAML)。
  • 需先變換再合併、或純程式碼動態計算 → Geometry.Combine()。

結語

WPF 提供完整的幾何布爾運算體系,從簡單的 `GeometryGroup` 到功能全面的 `CombinedGeometry`/`Geometry.Combine()`,滿足從靜態 XAML 宣告到動態程式碼計算的各種需求。善用填充規則與布爾運算,能以極簡代碼構建複雜剪裁路徑、遮罩、複合圖形,是進階向量繪圖的核心技巧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved