Cortar agujeros en PathGeometry
-
09-09-2019 - |
Pregunta
Tengo un poco de trayectoria PathGeometry definir como la siguiente:
ruta original http://devblog.ailon.org/devblog/_stuff /wpfpathgeoquestion/original.gif
Este es un ejemplo simplificado. En realidad se puede tener segmentos de cualquier tipo (línea, un arco de curva).
Ahora tengo que cortar un agujero de algún tipo y tamaño (cuadrado, círculo, etc.) en los puntos de conjuntos de segmentos por lo que el resultado final es como la siguiente:
con agujeros http://devblog.ailon.org/devblog/_stuff /wpfpathgeoquestion/with_holes.gif
Mi idea inicial era combinar la PathGeometry original con otras plazas de geometría que contiene (o lo que sea) en los puntos de unión utilizando GeometryCombineMode.Exclude. Desafortunadamente esto produce geometría vacía si la ruta está vacío. Y si se llena produce resultado incorrecto.
Así que estoy atascado. En ejemplo sencillo con segmentos de línea que podría haber calculado los puntos fronterizos por adelantado y hecho mis segmentos de línea terminan allí, pero con arcos y Beziers esto sería una especie de exageración.
¿Alguien tiene una idea de cómo lograr esto?
Nota: Necesito estos agujeros borradas (transparente) a fin de colocar un cuadrado blanco por encima de ella no hará.
Solución
Oh. Lo hizo. La idea es crear un OpacityMask fuera de sus agujeros con DrawingBrush hasta que quede en el contexto de dibujo antes de dibujar el PathGeometry. Algo como esto.
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();