2009-02-27 5 views
6

У меня есть PathGeometry, определяющий некоторый путь, как этот:вырезка отверстий в PathGeometry

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

Это упрощенный пример. В действительности он может иметь сегменты любого типа (Line, Arc, Bezier).

Теперь мне нужно вырезать отверстие некоторого вида и размера (квадрат, круг и т.д.) в сегменте совместных точек, так что конечный результат будет выглядеть примерно так:

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

Моя первоначальная идея была объединить исходную PathGeometry с другими геометриями, содержащими квадраты (или что-то еще) в совместных точках, используя GeometryCombineMode.Exclude. К сожалению, это создает пустую геометрию, если путь не заполнен. И если он заполнен, он производит неверный результат.

Так что я застрял. В простом примере с сегментами строк я мог бы вычислить граничные точки заранее и сделать мои сегменты линии завершенными там, но с дугами и безьерами это будет своего рода излишним.

У кого-нибудь есть идея, как это сделать?

Примечание: Мне нужно, чтобы эти отверстия были стерты (прозрачны), поэтому размещение белого квадрата над ним не будет.

ответ

2

Ох. Сделал это. Идея состоит в том, чтобы создать OpacityMask из ваших отверстий с помощью DrawingBrush, а затем нажать на контекст чертежа, прежде чем рисовать PathGeometry. Что-то вроде этого.

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(); 

 Смежные вопросы

  • Нет связанных вопросов^_^