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それに応じて Geometry グループのを設定する必要があります。の値が必要です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 に答える