2009-02-27 6 views
6

J'ai un PathGeometry définissant un certain chemin comme celui-ci:trous de coupe dans PathGeometry

original path http://devblog.ailon.org/devblog/_stuff/wpfpathgeoquestion/original.gif

Ceci est un exemple simplifié. En réalité, il peut avoir des segments de n'importe quel type (Line, Arc, Bezier).

Maintenant je dois couper un trou de quelque sorte et la taille (carré, cercle, etc.) aux points communs de segment de sorte que le résultat final ressemble à ceci:

with holes http://devblog.ailon.org/devblog/_stuff/wpfpathgeoquestion/with_holes.gif

Mon idée initiale était pour combiner le PathGeometry original avec d'autres carrés contenant la géométrie (ou autre) dans les points d'articulation à l'aide de GeometryCombineMode.Exclude. Malheureusement, cela produit une géométrie vide si le chemin n'est pas rempli. Et s'il est rempli, il produit un résultat incorrect.

Donc, je suis bloqué. Dans un exemple simple avec des segments de ligne, j'aurais pu calculer les points de bordure à l'avance et faire en sorte que mes segments de lignes se terminent là, mais avec des arcs et des beziers cela serait en quelque sorte exagéré.

Est-ce que quelqu'un a une idée de comment accomplir cela?

Note: J'ai besoin que ces trous soient effacés (transparents), donc ne placez pas un carré blanc dessus.

Répondre

2

Oh. L'a fait. L'idée est de créer un masque OpacityMask à partir de vos trous en utilisant DrawingBrush, puis de le placer dans le contexte du dessin avant de dessiner le PathGeometry. Quelque chose comme ça.

RectangleGeometry r = new RectangleGeometry(graphVisual.Bounds); 
GeometryDrawing dr = new GeometryDrawing(Brushes.Black, null, Geometry.Combine(r, bulletHoles, GeometryCombineMode.Exclude, null)); 
DrawingBrush br = new DrawingBrush(dr); 
drawingContext.PushOpacityMask(br); 

drawingContext.DrawGeometry(null, new Pen(Brushes.Green, 2), graphVisual); 

drawingContext.Pop(); 
Questions connexes