2009-02-27 23 views
6

Tôi có một PathGeometry xác định một số con đường như thế này:lỗ cắt trong PathGeometry

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

Đây là một ví dụ đơn giản. Trong thực tế nó có thể có các phân đoạn thuộc bất kỳ loại nào (Line, Arc, Bezier).

Bây giờ tôi cần phải cắt một lỗ của một số loại và kích thước (hình vuông, hình tròn, vv) trong phân khúc điểm chung nên kết quả cuối cùng trông giống như sau:

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

ý tưởng ban đầu của tôi là để kết hợp PathGeometry ban đầu với hình học khác có chứa hình vuông (hoặc bất cứ điều gì) trong các điểm doanh bằng cách sử dụng GeometryCombineMode.Exclude. Thật không may, điều này tạo ra hình học trống nếu đường dẫn không được điền. Và nếu nó được lấp đầy nó tạo ra kết quả không chính xác.

Vì vậy, tôi bị kẹt. Trong ví dụ đơn giản với các phân đoạn đường, tôi có thể đã tính toán các điểm biên giới trả trước và làm cho các đoạn đường của tôi kết thúc ở đó, nhưng với các cung tròn và beziers, đây sẽ là loại quá mức cần thiết.

Có ai có ý tưởng về cách thực hiện việc này không?

Lưu ý: Tôi cần những lỗ này bị xóa (trong suốt) để đặt một hình vuông màu trắng phía trên nó sẽ không làm.

Trả lời

2

Oh. Đã làm nó. Ý tưởng là để tạo ra một OpacityMask ra khỏi lỗ của bạn bằng cách sử dụng DrawingBrush và sau đó đẩy nó vào bối cảnh vẽ trước khi vẽ PathGeometry. Một cái gì đó như thế này.

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