2

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

提前致谢。

4

2 回答 2

3

我目前正在尝试做同样的事情,所以这是我的计划,以及一些思考过程。

首先,将所有内容都转换为 PathGeometry。该FillContains(Geometry geometry)方法是我想用来查看内容的内容。问题.Bounds.Contains在于,如果您有一个中间有一个点的 C 形状,则该点将包含在边界矩形中,但不包含在形状中。

接下来,创建一个树数据结构。如果 PathGeometry A 包含 PathGeometry B,则 A 将是树中 B 的祖先。这里的另一个答案建议使用列表,但这也行不通。本段的其余部分解释了原因。假设有两个 PathFigure 并且一个都不在另一个里面:在对列表进行排序之后,我们会假设一个在另一个里面。我们可以在没有太多额外工作的情况下解释这一点,但现在假设有两个 PathFigure 被第三个 PathFigure(如数字 8)包围:排序后,我们只得到一个洞作为 8 的一部分。我们也许可以解释那也是。最后一期:假设 A 包含 B,C 包含 D,但它们按 {A,C,B,D} 的顺序放入列表中:一些排序算法(如 BubbleSort)会将它们按此顺序排列,因为没有形状包含它的邻居。

那么对于我们的树,根节点是什么?根节点将包含所有内容。如果你想创造这样的东西,你可以把你所有的 PathGeometries 和使用.Bounds. 可能有一些奇怪的情况不起作用,但这并不重要。

我们的树会是什么样子?我将使用您示例中的数字。点击这里查看树。

我们如何制作树?我认为这个伪代码比我试图描述它更容易理解:

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。

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

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

于 2016-11-09T16:18:11.290 回答
0

如果,正如你所提到的,PathFigure's 不相交,即包含是完整的,那么推论是如果PathFigureA 包含 B,那么 A 的 AABB 边界也包含 B 的边界。

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

现在你有一个“俄罗斯套娃”列表PathGeometry,从最外面的一个开始,选择每一对连续的对并取它们的并集.Combine如你所说)。如果数组有奇数个元素,即最后剩下一个,那么在图 4 中一定是这种情况。

于 2016-06-08T12:22:22.210 回答