2009-11-23 8 views
2

En utilisant System.Drawing.Graphics trucs GDI .NET, j'ai une forme consting de deux tableaux de points. Ils sont les pixels rouges et verts dans l'image ci-dessous. Maintenant, j'essaye de remplir l'intérieur de cette forme avec une couleur. Le dessiner comme de simples lignes fonctionne très bien. Comme ceci:Comment remplir un GraphicsPath avec des courbes qui se chevauchent?

g.DrawCurve(Pens.Red, points1); 
    g.DrawCurve(Pens.Green, points2); 

Cela donne l'image de gauche (1).

alt text http://lisa.xms.se/wic/filled.png

Pour remplir cette chose, j'ai essayé d'utiliser un GraphicsPath comme ceci:

GraphicsPath gp = new GraphicsPath(); 
    gp.AddCurve(points1); 
    gp.AddCurve(points2); 
    g.FillPath(Brushes.Blue, gp); 

Il fonctionne ... sorta. Le problème est lorsque la forme se chevauche comme vous pouvez le voir dans l'image du milieu (2) et ne remplira pas la partie qui se chevauche.

J'ai essayé d'utiliser gp.widen() pour obtenir le contour, puis remplir après:

 gp.Widen(new Pen(Color.Blue, 3)); 
     g.FillPath(Brushes.Blue, gp); 

Cela devrait fonctionner, mais il semble que pour remplir la tranche 3 pixels extérieur la forme et non la chose entière , comme on le voit sur l'image (3).

Des idées pour résoudre ce problème?

+0

Pouvez-vous ajouter l'initialisation de points1 et points2? –

Répondre

4

Par défaut, GraphicsPath utilise l'énumération FillMode.Alternate. Vous avez besoin FillMode.Winding

GraphicsPath gp = new GraphicsPath(FillMode.Winding); 

Le mode d'enroulement considère la direction des segments de chemin à chaque intersection. Il en ajoute un pour chaque intersection dans le sens des aiguilles d'une montre et en soustrait un pour chaque intersection dans le sens antihoraire. Si le résultat est différent de zéro, le point est considéré dans la zone de remplissage ou de clip. Un compte zéro signifie que le point se trouve en dehors de la zone de remplissage ou de clip.

Plus d'info here

+0

J'ai effectivement essayé le mode Winding plus tôt, mais il a complètement foiré le remplissage. Il s'est finalement avéré être un problème avec le dernier point! = Premier point dans les tableaux. J'ai donc inversé le tableau de points2 et, voilà, FillMode.Winding fonctionne! Je vais vérifier à nouveau demain et marquer comme réponse (à moins que quelque chose d'autre ne se présente :-) –

Questions connexes