2016-06-07 76 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的孙辈。然后,从根部移除所有孩子,并将根子的曾孙递送到其新的儿童列表中,并重复。

希望这很清楚。如果不是,请让我知道如何改进答案。