2 votes

Comment remplir un GraphicsPath avec des courbes qui se chevauchent ?

Utilisation de la technologie .NET System.Drawing.Graphics J'ai une forme composée de deux tableaux de points. Ce sont les pixels rouges et verts dans l'image ci-dessous.

J'essaie maintenant de remplir l'intérieur de cette forme avec une couleur. Le dessiner sous forme de simples lignes fonctionne très bien. Comme ceci :

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

Cela donne l'image de gauche (1).

texte alternatif http://lisa.xms.se/wic/filled.png

Pour remplir ce truc, j'ai essayé d'utiliser un GraphicsPath comme ça :

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

Cela fonctionne... en quelque sorte. Le problème est quand la forme se chevauche comme vous pouvez le voir dans l'image du milieu (2) et ne remplit pas la partie qui se chevauche.

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

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

Cela devrait fonctionner, mais cela ne semble remplir que la tranche de 3 pixels. à l'extérieur de la forme et non l'ensemble, comme on le voit sur l'image (3).

Une idée pour résoudre ce problème ?

6voto

Michael G Points 2884

Par défaut, le chemin d'accès graphique utilise le chemin d'accès FillMode.Alternate énumération. Vous avez besoin FillMode.Winding

GraphicsPath gp = new GraphicsPath(FillMode.Winding);

Le mode Enroulement prend en compte la direction des segments de chemin à chaque intersection. Il ajoute un segment pour chaque intersection dans le sens des aiguilles d'une montre et en soustrait un pour chaque intersection dans le sens inverse des aiguilles d'une montre. Si le résultat est différent de zéro, le point est considéré comme étant à l'intérieur de la zone de remplissage ou de clip. Un résultat nul signifie que le point se trouve en dehors de la zone de remplissage ou d'écrêtage.

Plus d'informations aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X