2013-09-30 3 views
5

В основе моей проблемы лежит то, что у меня есть куча геометрий (огромное количество, думаю, карта на большей площади), разделенная на несколько экземпляров геометрии wpf (первоначально они были PathGeometry, но для уменьшения использования памяти I предварительно обработать их и создать StreamGeometries во время загрузки). Теперь я хочу создать плитки из этих геометрий.Обрезание произвольной геометрии wpf

В основном я хотел бы взять более крупный объект геометрии и «вырезать» его прямоугольник (моя плитка), чтобы получить несколько меньших геометрий. Что-то, как на картинке ниже:

Slicing up a large geometry

Обратите внимание, что я хочу, чтобы результат новой геометрии, не рендеринга. Я знаю, что могу достичь визуальный результат: clip to a UIElement или по pushing a clip to a drawingvisual.

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

В качестве альтернативы,, если это невозможно сделать с помощью WPF, есть ли какой-либо другой (сторонний вариант) общий API геометрической конфигурации для .NET, который может выполнять такие операции? Или, может быть, это может быть реализовано с использованием других частей API геометрии WPF?

+0

Вы использовали GeometryCombineMode.Intersect с Geometry.Combine? –

+0

Я пробовал их все, и ни один из режимов не делал то, что я хотел. –

ответ

1

код показывает нижний правый прямоугольник, как в вашей "небольшие плитки" визуализации:

var geometry = MyOriginalPath.Data.Clone(); 
var bounds = geometry.Bounds;  
var rectangleGeometry = new RectangleGeometry(bounds); 
var halfWidth = bounds.Width * 0.5; 
var halfHeight = bounds.Height * 0.5; 
var bottomQuarter = new RectangleGeometry(
    new Rect(bounds.X + halfWidth, bounds.Y + halfHeight, 
      halfWidth, halfHeight)); 
var combinedGeometry = new CombinedGeometry(GeometryCombineMode.Exclude, 
              rectangleGeometry, bottomQuarter); 
combinedGeometry = new CombinedGeometry(GeometryCombineMode.Exclude, 
             geometry, combinedGeometry); 
MyBottomQuarterPath.Data = combinedGeometry; 

Regards Dave

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