圖形合並
有時候我們需要將多個圖形合並成一個然後進行繪制,比如將一個圓形與一個矩形進行合並等. 在WPF的自定義繪制中,有三種方法可以做到,分別是(1)利用GeometryGroup對象;(2)利用CombinedGeometry對象;(3)使用Geometry.Combin()靜態方法。其中第一種方式是利用集合並可以向集合中添加任意多個元素,而後面兩種方式只能兩兩合並,但後面兩者的合並方式更靈活,可以是兩圖形的“交集”“並集”“差集”以及“異或”。
1 ,使用GeometryGroup對象進行圖形合並
參考以下代碼,我們合並了一個橢圓與一個矩形:
protected override void OnRender(DrawingContext dc)
{
base.OnRender(dc);
//public sealed class GeometryGroup : Geometry
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;
group.Children.Add(ellipse);
group.Children.Add(rect);
dc.DrawGeometry(Brushes.LightBlue, new Pen(Brushes.Green, 2), group);
}
效果圖如下:
我們只是簡單地將兩個圖形以相加的方式合並在了一起,注意到合並後的圖形中間部分出現一個镂空的無色區域,是由合並後的圖形的FillRull決定的,如果我們把group.FillRule = FillRule.EvenOdd;更改為 group.FillRule = FillRule.Nonzero;則填充效果將是如下這樣:
2, 使用CombinedGeometry對象進行圖形合並
參考以下代碼,我們合並了一個橢圓與一個矩形:
protected override void OnRender(DrawingContext dc)
注意到GeometryCombineMode枚舉,它有四個枚舉值,如果我們有A,B分別表示兩個圖形的話,那麼:
{
base.OnRender(dc);
//public sealed class CombinedGeometry : Geometry
EllipseGeometry ellipse = new EllipseGeometry(new Point(50, 50), 50, 20);
RectangleGeometry rect = new RectangleGeometry(new Rect(50, 50, 50, 20), 5, 5);
CombinedGeometry combin = new CombinedGeometry(GeometryCombineMode.Xor, ellipse, rect);
dc.DrawGeometry(Brushes.LightBlue, new Pen(Brushes.Green, 2), combin);
}
GeometryCombineMode.Exclude: 合並結果為A-B
GeometryCombineMode.Intersect: 合並結果為A與B的相交部分
GeometryCombineMode.Union: 合並結果為A+B
GeometryCombineMode.Xor: 合並結果為(A-B)+(B-A)
3, 使用Geometry.Combin()靜態方法進行圖形合並
Geometry.Combin()靜態方法與使用CombinedGeometry對象進行圖形合並差不多
protected override void OnRender(DrawingContext dc)
{
base.OnRender(dc);
//Geometry.Combin()
EllipseGeometry ellipse = new EllipseGeometry(new Point(50, 50), 50, 20);
RectangleGeometry rect = new RectangleGeometry(new Rect(50, 50, 50, 20), 5, 5);
PathGeometry combin = Geometry.Combine(ellipse, rect, GeometryCombineMode.Xor, null);
dc.DrawGeometry(Brushes.LightBlue, new Pen(Brushes.Green, 2), combin);
}
其中Geometry.Combin()靜態方法中有用於圖形變換的參數(旋轉,縮放等),如果不需要變換則填寫null