【问题标题】:WPF PathGeometry - Bounds are wrong?WPF PathGeometry - 边界错误?
【发布时间】:2011-11-01 11:26:50
【问题描述】:

我有一个相当简单的 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 的正确边界?

【问题讨论】:

  • way off 是不是有点夸大其词了?您需要它们有多准确?
  • 如果边界比路径大一点我可以接受,但例如上限是 5956180 而它应该是 5956179.775。这些在错误方向上的 0.225 对我来说是致命的,我想使用边界进行更快的相交匹配。这就是我所说的“离开”的意思(可能是以错误的方式离开)。

标签: wpf pathgeometry


【解决方案1】:

在某些时候,我认为 WPF 必须转换为单点进行渲染,我想知道 Bounds 的值是否基于渲染结果。在这种情况下,您可能会看到基于您使用的大量数字的精度限制。我注意到您的 Y 值比 X 大 10 倍,巧合的是,误差也比 X 中的误差大 10 倍。

如果可以在创建 PathGeometry 之前减去最小 X 和 Y,我认为您会得到更好的数字。假设您正在显示 PathGeometry,您可以将其放在 Canvas 中并将 Canvas.Left/Top 应用于您的值以在屏幕上获得正确的偏移量。要获得正确的边界,您需要将 Top/Left 偏移量添加到 Bounds 的结果中。

只是提醒一下,这个答案有一些猜测。我没有看过 Bounds 的内部工作原理,但相对错误似乎指向与浮点数之间的转换。

【讨论】:

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

我认为您看到了 PathGeometry 数字由大浮点数组成的不精确性。

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

您可能必须使用可接受的容差来比较界限,例如:

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

您可以将TOLERANCE 设置为 0.25 或其他值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多