消失的圈子

时间:2009-10-16 20:43:39

标签: .net wpf canvas shapes

我发现在画布中偶然添加了许多重叠形状:

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);

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

2 个答案:

答案 0 :(得分:2)

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

alt text 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;

答案 1 :(得分:1)

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

如果您将FillRule更改为NonZero,您将看到更像“联合”的效果,这可能是您想要实现的效果。