正确拆分System.Windows.Media.PathGeometry

时间:2016-06-07 07:38:22

标签: c# wpf geometry .net-4.5 pathgeometry

我有一个像这样的System.Windows.Media.PathGeometry: 1 我想分割几何体,以便每个灰色形状都在一个新的Geometry对象中。我试图迭代PathGeometry的FigureColletion并将每个图形放在一个新的几何图形中,但结果并不像我预期的那样,因为一个图形只描述了一个形状的边缘而不是形状本身。这意味着,一些数字应用了加法和一些减法: 2 要正确分割几何,我必须弄清楚哪些PathFigures应用了加法和哪些减法。 PathFigure类型上没有Property,它为我提供了有关如何应用它的信息。 有人知道如何解决这个问题吗?

提前致谢。

2 个答案:

答案 0 :(得分: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)将按此顺序保留它们,因为没有形状包含它的邻居。列表在这里太混乱了。

那么对于我们的树,什么是根节点?根节点将包含所有内容。如果您想创建这样的东西,可以使用所有PathGeometries的Union并使用.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)
}

与二叉树不同,我们有一个子列表而不是固定数量的子节点。树中的叶子是具有空子列表的任何节点。因为根节点应该包含所有内容,所以您只需在根上调用此方法,而无需为root定义PathGeometry。

我们如何将树变成PathGeometries?从root的孩子开始。这些是附加的PathFigures,它们的子节点是减法PathFigures。将.Combine()GeometryCombineMode.Exclude一起使用,可以从root的子项中减去root的孙子。然后,从root中删除所有子项,并将root的曾孙子变成新的子项列表,然后重复。

希望这很清楚。如果不是,请告诉我如何改进答案。

答案 1 :(得分:0)

如果你提到PathFigure没有相交,即遏制已经完成,那么推论如果PathFigure A包含B,那么AABB A的界限也包含B的界限。

不幸的是,我不认为PathFigure有这样的属性,因此解决此问题的一种方法可能是从PathGeometry内的每个PathFigure创建单独的新.Figures个对象{1}}属性,并将它们存储在数组中。然后使用.Bounds.Contains属性对此数组进行排序,即:https://msdn.microsoft.com/en-us/library/ms557978(v=vs.110).aspx,代替传统排序例程中的比较操作。

现在你有一个" Matryoshka娃娃" PathGeometry的列表,从最外面的一个开始,选择每个连续的对,采取他们的联盟.Combine,如你所说)。如果数组中有一个奇数个元素,即最后一个元素,则必须如图4所示。