2016-06-07 79 views
1

我有這樣一個單一的System.Windows.Media.PathGeometry: 1 而我想拆分幾何,使每個灰色形狀是在一個新的幾何對象。我嘗試遍歷PathGeometry的FigureColletion,並將每個圖形放在一個新的幾何圖形中,但結果並不像我預期的那樣,因爲一個圖形只描述了形狀的一個邊,而不是形狀本身。這意味着,一些數字被施加添加劑和一些減色: 2 爲了正確分割幾何我必須找出哪些PathFigures施加添加劑和減色。 PathFigure類型上沒有屬性,它提供了有關如何應用它的信息。 有沒有人有一個想法如何解決這個問題?正確地分割一個System.Windows.Media.PathGeometry

在此先感謝。

+0

PathFigures必然不相交?如果它們相交,那麼事情變得更復雜 – 2016-06-07 18:41:14

+0

不,它們不會相交。在應用此操作之前,我正在分析所有幾何圖形。如果有交集,相交的幾何將被合併(通過Geometry.Combine(...)和之後的PathGeometry.GetOutlinedPath(...))。 GetOutlinedPath函數應該防止相交的數字。 – Timo

回答

0

如果真如你所說,PathFigure的不相交,即遏制完成,則必然結果是,如果PathFigure A包含B,那麼A的AABB範圍還包含B的

不幸的是,我不認爲PathFigure具有這樣的性質,所以要克服這很可能會創造.Figures物業內從每個PathFigure個別新PathGeometry對象,這些存儲在數組中的一種方式。然後使用.Bounds.Contains屬性對該陣列進行排序,即:https://msdn.microsoft.com/en-us/library/ms557978(v=vs.110).aspx,代替傳統排序例程中的比較操作。

現在你有PathGeometry是一個「俄羅斯套娃」列表,從最外面的一個開始,每一個選擇對連續和把他們的工會.Combine如你所說)。如果數組有奇數個要素,即一個左底,那麼必須在圖的情況下,4

2

目前,我試圖做同樣的事情,所以這裏是我的計劃,一些沿的思維過程。

首先,轉換一切PathGeometries。我想用FillContains(Geometry geometry)方法來看看內部是什麼。 .Bounds.Contains的問題在於,如果您的C形中間有一個點,則該點將包含在邊界矩形中,但不包含形狀。

接下來,創建一個樹數據結構。如果PathGeometry A包含PathGeometry B,則A將是樹中的一個B的祖先。這裏的其他答案建議使用一個列表,但這不會起作用。這段文字的其餘部分解釋了爲什麼。假設有兩個PathFigures,兩個都不在另一個內部:在對列表進行排序後,我們會假設一個在另一個內部。我們可以說沒有太多額外的工作,但現在假設有兩個PathFigures被第三個PathFigure包圍(如數字8):排序後,我們只有一個洞成爲8的一部分。我們可以考慮也是如此。最後一個問題:假設A包含B和C包含D,但它們以{A,C,B,D}的順序放入列表中:某些排序算法(如BubbleSort)會按順序放置它們,因爲沒有形狀包含它的鄰居。列表太混亂了。

所以對於我們的樹,有什麼根節點?根節點將包含所有內容。如果你想創建這樣的事情,你可以把你所有的PathGeometry的聯合使用,並使用.Bounds。在那些行不通的情況下可能會出現奇怪的情況,但這並不重要。

我們的樹會是什麼樣子?我將使用示例中的數字。點擊here查看樹。

我們如何製作樹?我認爲這是僞代碼更容易比我試圖來形容它明白:

TreeNode.AddNode(PathGeometry geomToAdd) 
{ 
    bool containedByChild = false 
    foreach (TreeNode current in this.Children) 
    { 
     if (current.FillContains(geomToAdd) 
     { 
      containedByChild = true 
      current.AddNode(geomToAdd) 
     } 
    } 
    if (!containedByChild) 
     this.Children.Add(geomToAdd) 
} 

與二叉樹,我們有孩子的列表,而不是兒童的固定數目。樹中的葉子是具有空子列表的任何節點。由於根節點應該包含所有內容,因此您可以在根上調用此方法,而無需爲根指定PathGeometry。

我們如何將樹變成我們的PathGeometries?從根的孩子開始。這些是添加劑PathFigures,他們的孩子是減法PathFigures。使用.Combine()GeometryCombineMode.Exclude,可以從root的子項中減去root的孫輩。然後,從根部移除所有孩子,並將根子的曾孫遞送到其新的兒童列表中,並重復。

希望這很清楚。如果不是,請讓我知道如何改進答案。