Вырезание отверстий в PathGeometry - PullRequest
6 голосов
/ 27 февраля 2009

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

исходный путь http://devblog.ailon.org/devblog/_stuff/wpfpathgeoquestion/original.gif

Это упрощенный пример. В действительности он может иметь сегменты любого типа (Линия, Дуга, Безье).

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

с отверстиями http://devblog.ailon.org/devblog/_stuff/wpfpathgeoquestion/with_holes.gif

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

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

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

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

1 Ответ

2 голосов
/ 27 февраля 2009

О. Сделал это. Идея состоит в том, чтобы создать 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();
...