我正在尝试找出如何完全填充自定义几何图形。这似乎是一个常见的问题,但我并没有真正找到任何解决方案。
我有以下示例几何图形:
<Path Fill="White" Stretch="Fill" Stroke="Black" StrokeThickness="2">
<Path.Data>
<PathGeometry
Figures="M112,296C112,296 136,296 136,320 M112,344C112,344 136,344 136,320 M112,296L112,296 96,296 96,344 112,344"/>
</Path.Data>
</Path>
这将产生以下结果:
这是我想要看到的结果:
有什么想法吗?我知道我可以制作一个单一的弧线来解决这个特定的情况,但在我的应用程序中,用户可以绘制任何类型的几何图形,因此结果可能由任何数量的“基元”(PolyLineSegments、EllipseGeometries、ArcSegments 等)组成,并且如果所得到的几何图形包含某种类型的封闭区域,则我希望能够准确地填充该区域。
编辑:
这是一个示例,如果我确保所有三个相邻的几何图形重叠并使用以下代码创建联合 CombinedGeometry,则会看到 CombinedGeometry 的样子:
<Path Grid.Row="2" Fill="White" Stretch="Fill" Stroke="Black" StrokeThickness="2">
<Path.Data>
<CombinedGeometry GeometryCombineMode="Union">
<CombinedGeometry.Geometry1>
<CombinedGeometry GeometryCombineMode="Union">
<CombinedGeometry.Geometry1>
<PathGeometry
Figures="M111,293C111,296 136,293 136,325"/>
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<PathGeometry
Figures="M111,346C111,344 136,344 136,320"/>
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<PathGeometry
Figures="M125,296L115,296 96,296 96,344 120,344"/>
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
以下是结果:
我希望它可以将笔画联合起来,并自动找出新连续多边形的正确填充方式,但这并没有实现。
编辑2:
嗯,我想我想出了一些可能的解决方案,但都不像我希望的那么简单。第一个选项是使用CombineGeometry结构将所有几何图形组合在一起,然后在结果的"CombineGeometry"上调用"GetFlattenedPathGeometry"以获取PathGeometry。接下来,我遍历PathGeometry中的每个Figure,并仅删除那些是孔洞的(我认为您应该通过去掉所有完全被另一个包含的图形或孔洞可能有顺时针或逆时针坐标的约定来实现..),如果一切顺利,您应该得到一个完全填充的几何图形。
第二个选项是再次在结果路径上调用"GetFlattenedPathGeometry",以获取基于顶点的路径近似表示(不包括所有曲线、弧线、椭圆等符号,我们只需要包含点和线的路径)。之后,您只需将所有结果的figures/segments组合成一个图形,其线段按顺时针或逆时针排序。
我已经测试了这两种方法,并且它们似乎可以处理至少上面概述的简单测试用例,但它们无法处理更复杂的形状(自相交、凹形等).. 我需要支持.. 因此问题仍然存在,我该怎么做?
编辑3:
这里有一个更复杂的几何图形,其中排序/组合变得更加困难:
<Path Fill="White" Stretch="Fill" Stroke="Black" StrokeThickness="2">
<Path.Data>
<PathGeometry
Figures="M104,160C104,160 72,160 72,136
M104,128C104,128 72,128 72,152
M152,232L152,232 152,216 120,216 120,160 128,160
M152,232L152,232 72,232 104,216 104,160 96,160
M104,128L104,128 168,128
M128,160L128,160 168,160
M165,160L168,160 200,128
M200,160L200,160 200,128
M200,160L200,160 168,128 152,128"/>
</Path.Data>
</Path>
这将产生: