cercles disparaissant
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?
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.