0

我发现偶数的重叠形状像这样添加到画布中:

GeometryGroup gg = new GeometryGroup();
EllipseGeometry e1 = new EllipseGeometry(new Point(10, 10),  20, 20);
EllipseGeometry e2 = new EllipseGeometry(new Point(10, 10),  20, 20);
//EllipseGeometry e3 = new EllipseGeometry(new Point(10, 10),  20, 20);
gg.Children.Add(e1);
gg.Children.Add(e2);
//gg.Children.Add(e3);

Path p = new Path();
p.Data = gg;
p.Fill = Brushes.Red;

MyCanvas.Children.Add(p);

“清除”所有以前的形状。如果您运行这些代码,您将什么也看不到,但如果您取消注释某些行,则会出现一个圆圈。有人能解释这种奇怪的行为吗?

4

2 回答 2

2

您需要相应地设置FillRule几何组的。它的值必须为NonZero。当前,您将每个形状完全绘制在彼此之上,导致该区域为偶数个形状的白色,因为这EvenOdd是默认填充规则:

替代文字 http://i.msdn.microsoft.com/ms595394.ref_mil_fillrule_stars(en-us,VS.90).png

(图片来自http://msdn.microsoft.com/en-us/library/system.windows.media.geometrygroup.fillrule.aspx

GeometryGroup gg = new GeometryGroup();
gg.FillRule = FillRule.Nonzero;
EllipseGeometry e1 = new EllipseGeometry(new Point(10, 10), 20, 20);
EllipseGeometry e2 = new EllipseGeometry(new Point(10, 10), 20, 20);
gg.Children.Add(e1);
gg.Children.Add(e2);

Path p = new Path();
p.Data = gg;
p.Fill = Brushes.Red;
于 2009-10-16T21:04:00.687 回答
1

发生这种情况是因为您的椭圆完全重叠。GeometryGroup 的默认 FillRule 是 EvenOdd,这意味着如果从该点到外部的线穿过奇数个边界,则认为该点位于形状内部。这有点像形状的 XOR 规则。在您的情况下,您的形状内的点将始终跨越偶数个边界(e1 和 e2,或根本没有):因此,在几何图形内不会考虑任何点,也不会填充任何点。非正式地,e2 在 e1 中创建了一个“洞”,它消耗了整个 e1。请参阅MSDN 上 GeometryGroup 页面上的插图。

如果您将 FillRule 更改为 NonZero,您将看到更类似于“联合”的效果,这可能是您想要达到的效果。

于 2009-10-16T20:57:25.020 回答