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 の適切な境界を取得するにはどうすればよいでしょうか?

4

2 に答える 2

2

ある時点で、WPF はレンダリングのために単一のポイントに変換する必要があると思いますが、Bounds の値がレンダリングされた結果に基づいているのではないかと思います。この場合、使用している大きな数値に基づいて精度の制限が見られる可能性があります。あなたの Y 値は X よりも 10 倍大きく、偶然にも誤差も X の誤差よりも 10 倍大きいことに気付きました。

PathGeometry を作成する前に最小 X と Y を差し引くことができれば、より良い数値が得られると思います。PathGeometry を表示していると仮定すると、それを Canvas に配置し、Canvas.Left/Top を値に適用して、画面上で適切なオフセットを取得できます。正しい境界を取得するには、境界の結果に上/左オフセットを追加します。

この回答には少し憶測があることを思い出してください。Bounds の内部構造は見ていませんが、相対誤差は float との間の変換を示しているようです。

于 2011-11-01T13:59:41.617 に答える
0

I think you're seeing the imprecision due fact that the numbers PathGeometry is made up of large floating point numbers.

I'm not sure if you'll be able to obtain the precision that you need.

You will probably have to compare the bounds using an acceptable tolerance, like:

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

where you can set the TOLERANCE to 0.25 or something.

于 2011-11-01T15:44:25.020 に答える