2009-10-16 1 views
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); 

이전의 모든 형태를 "클리어". 이 코드를 실행하면 아무 것도 볼 수 없지만 일부 줄의 주석을 제거하면 원이 표시됩니다. 아무도이 이상한 행동을 설명 할 수 있습니까?

답변

2

따라서 Geometry 그룹의 FillRule을 설정해야합니다. 값은 NonZero이어야합니다.

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; 
: EvenOdd 기본 채우기 규칙 때문에 현재 당신은 모양의 짝수 흰색으로 영역을 일으키는 원인이 정확히 서로의 상단에 각각의 모양을 그릴
+0

작동합니다. 감사! – Overdose

1

타원이 정확히 겹치기 때문에 발생합니다. GeometryGroup의 기본 FillRule은 EvenOdd입니다. 즉, 점에서 외부로가는 선이 홀수의 경계를 교차하면 점 내부가 점 내부로 간주됩니다. 이는 모양에 대한 XOR 규칙과 조금 비슷합니다. 귀하의 경우, 모양 안의 점은 항상 짝수 개의 경계 (e1과 e2 모두 또는 전혀 아님)를 교차합니다. 따라서 지오메트리 내부의 점은 고려되지 않으며 점이 채워지지 않습니다. 비공식적으로, e2는 e1에 "구멍"을 만들어 e1 전체를 소모합니다. GeometryGroup page on MSDN의 그림을 참조하십시오.

FillRule을 NonZero로 변경하면 달성하고자하는 "결합"과 유사한 효과가 더 많이 나타납니다.