WPF PathGeometry - 边界不正确?

4

我有一个相当简单的PathGeometry:

M567764.539,5956314.087L567815.077,5956179.775L567821.625,5956182.314L567773.425,5956311.248L567858.513,5956349.923L567950.858,5956392.466L567949.039,5956399.843L567942.252,5956396.685L567873.018,5956364.467L567799.816,5956330.421L567771.226,5956317.186L567764.539,5956314.087

现在,当我查询此数据的PathGeometry.Bounds属性时,我会得到以下边界:
567764.5625,5956180  567950.875,5956400

预期的边界为:
567764.539,5956179.775 567950.858,5956399.843

我的主要问题是:边界比几何图形小,因此几何图形的某些部分可能在边界之外。

我创建了PathGeometry并像这样显示边界:

PathGeometry geo = PathGeometry.CreateFromGeometry(Geometry.Parse("M567764.539,5956314.087L567815.077,5956179.775L567821.625,5956182.314L567773.425,5956311.248L567858.513,5956349.923L567950.858,5956392.466L567949.039,5956399.843L567942.252,5956396.685L567873.018,5956364.467L567799.816,5956330.421L567771.226,5956317.186L567764.539,5956314.087"));
System.Diagnostics.Trace.WriteLine(geo.Bounds);

我做错了什么?更重要的是,我如何获得PathGeometry的正确边界?

1
“way off” 不是有点夸张了吗?你需要它们有多准确? - H.B.
如果边界比路径稍微大一点,我可以接受,但例如顶部边界是5956180,而应该是5956179.775。这些0.225偏差朝错误的方向,对我来说是致命的,我想使用边界进行更快的交叉匹配。这就是我所说的“完全偏离”的意思(可能是朝错误的方向)。 - Sam
2个回答

2
在某个时候,我认为WPF必须转换为单点进行渲染,我想知道Bounds的值是否基于渲染结果。在这种情况下,您可能会看到基于您正在使用的大数字的精度限制。我注意到您的Y值是X的10倍,巧合的是,误差也比X的误差大10倍。
如果在创建PathGeometry之前可以减去min X和Y,我认为您将获得更好的数字。假设您显示PathGeometry,您可以将其放置在Canvas中,并将Canvas.Left / Top应用于您的值以获得正确的屏幕偏移量。要获取正确的Bounds,然后您需要将Top / Left偏移量添加到Bounds的结果中。
只是提醒一下,这个答案中有一些猜测。我没有查看Bounds的内部工作原理,但相对误差似乎指向了从浮点数的转换。

这些是ETRS89-UTM地理数据坐标,它们可能在世界各地移动,所以我不确定可以减去什么:/ - Sam
1
你另一个选择是编写一个计算实际边界的方法。也许用DoubleBounds()作为扩展方法(查找最小值和最大值)?您可以从geo.Figures[0].StartPoint和geo.Figures[0].Segments访问坐标。看起来WPF从代码中的点创建了一个PolyLineSegment,因此您可以像这样访问它们:(geo.Figures[0].Segments[0] as PolyLineSegment).Points - Mark Synowiec

0

我认为你看到的不精确是由于PathGeometry中包含大量浮点数。

我不确定你是否能够获得所需的精度。

你可能需要使用可接受的公差来比较边界,例如:

bool isMatch = (Math.Abs(MyPath.Bounds.X - ExpectedBounds.X) < TOLERANCE);

在这里,您可以将TOLERANCE设置为0.25或其他数值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接