Question

J'ai découvert que même nombre de formes qui se chevauchent ajoutés à la toile comme ça:

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

« efface » toutes les formes précédentes. Si vous exécutez ces codes vous ne verrez rien, mais si vous supprimez quelques lignes, un cercle apparaîtra. Est ce que quelqu'un peut donner de ce comportement explaination étrange?

Était-ce utile?

La solution

Vous devez définir le FillRule du groupe Géométrie en conséquence. Il doit avoir une valeur de NonZero. Actuellement, vous dessinez chaque forme exactement au-dessus de l'autre, ce qui provoque la zone à blanc avec un nombre pair de formes, car EvenOdd est la règle de remplissage par défaut:

alt texte http: // i. msdn.microsoft.com/ms595394.ref_mil_fillrule_stars(en-us,VS.90).png

(Image de 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;

Autres conseils

Cela se produit parce que vos ellipses se chevauchent exactement. Le FillRule par défaut pour un GeometryGroup est EvenOdd, ce qui signifie que le point est considéré à l'intérieur de la forme si une ligne du point à l'extérieur traverse un nombre impair de frontières. Ceci est un peu comme une règle XOR pour les formes. Dans votre cas, points à l'intérieur de votre forme sera toujours traverser un nombre pair de frontières (soit à la fois e1 et e2, ou rien du tout): donc, aucun point ne jamais considérer l'intérieur de la géométrie, et aucun point se remplissent. Officieusement, e2 crée un « trou » dans e1 qui consomme l'ensemble de e1. Voir l'illustration sur la la page GeometryGroup sur MSDN .

Si vous modifiez le FillRule non nulle, vous verrez plus « union » -comme effet qui est peut-être ce que vous essayez d'atteindre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top