2013-09-30 17 views
5

Lo sfondo del mio problema è che ho un gruppo di geometrie (quantità enorme, mappa di riflessione su un'area più ampia) diviso in più istanze di geometria wpf (originariamente erano PathGeometry, ma per ridurre l'utilizzo della memoria I pre-elaborarli e creare StreamGeometries durante il caricamento). Ora quello che voglio fare è generare piastrelle da queste geometrie.Ritaglio di una geometria wpf arbitraria

Fondamentalmente mi piacerebbe prendere un oggetto geometrico più grande e "ritagliare" un rettangolo (la mia tessera) in modo da ottenere diverse geometrie più piccole. Qualcosa come l'immagine qui sotto:

Slicing up a large geometry

noti che voglio che il risultato sia una nuova geometria, non un rendering. So che posso ottenere la visuale risultato applicando un clip to a UIElement o pushing a clip to a drawingvisual.

Ho provato a utilizzare Geometry.Combine con uno degli argomenti è il rettangolo di clip, ma non riesco a farlo fare ciò che voglio (in genere ottengo solo il clip rect indietro, o una geometria vuota, a seconda di quale combinare la modalità che uso).

In alternativa, se questo non può essere fatto utilizzando WPF, c'è qualche altro (terza parte è ok) purporse generale geometria API per .NET che può fare questo tipo di operazioni? O forse questo può essere implementato usando altre parti dell'API geometria WPF?

+0

Hai usato GeometryCombineMode.Intersect con Geometry.Combine? –

+0

Li ho provati tutti e nessuno dei modi ha fatto quello che volevo. –

risposta

1

codice mostra il rettangolo in basso a destra come nella vostra visualizzazione "piastrelle più piccole":

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; 

Saluti Dave

Problemi correlati