目前,我试图做同样的事情,所以这里是我的计划,一些沿的思维过程。
首先,转换一切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