目前,我試圖做同樣的事情,所以這裏是我的計劃,一些沿的思維過程。
首先,轉換一切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的孫輩。然後,從根部移除所有孩子,並將根子的曾孫遞送到其新的兒童列表中,並重復。
希望這很清楚。如果不是,請讓我知道如何改進答案。
PathFigures必然不相交?如果它們相交,那麼事情變得更復雜 – 2016-06-07 18:41:14
不,它們不會相交。在應用此操作之前,我正在分析所有幾何圖形。如果有交集,相交的幾何將被合併(通過Geometry.Combine(...)和之後的PathGeometry.GetOutlinedPath(...))。 GetOutlinedPath函數應該防止相交的數字。 – Timo