2011-11-01 10 views
4

私はかなり単純なPathGeometryをを持っている:私はPathGeometry.Boundsを照会する場合、このデータの属性WPF 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 

は今、私は、次の境界を取得:

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

過度の過言ではありませんか?どれくらい正確にする必要がありますか? –

+0

境界がパスよりも少し大きければ受け入れることができますが、たとえば、上限は5956180で、5956179.775でなければなりません。間違った方向に0.225オフすると、私にとっては致命的です。より速い交差マッチングのために範囲を使用したいと思います。それは私が "間違ったやり方でオフ"と言っていたことです。 – Sam

答えて

2

いくつかの点では、WPFがレンダリングのためにシングルポイントに変換しなければならないと思いますが、Boundsの値がレンダリングされた結果に基づいているかどうかは疑問です。この場合、おそらく、使用している大量の数値に基づいて精度の制限があります。あなたのY値がXより大きい10のファクタであったことに気がつきましたが、偶然にも、誤差はXの誤差よりも10倍大きくなりました。

作成する前に分XとYを引くことができればPathGeometry、私はあなたが良い数字を得るだろうと思う。 PathGeometryを表示していると仮定すると、キャンバスに配置してCanvas.Left/Topを値に適用して、画面上で適切なオフセットを得ることができます。正しい範囲を取得するには、Boundsの結果にTop/Leftオフセットを追加します。

この回答には少しの憶測があります。私はBoundsのinnerworkingsを見ていないが、相対的なエラーは浮動小数点の間の変換を指しているようだ。

+0

これらは地理座標ETRS89-UTMの座標であり、世界各地を移動する可能性があるので、私は何を引くことができるのかよくわかりません:/ – Sam

+1

もう一つの選択肢は、実際の境界を計算する方法です。たぶんDoubleBounds()を拡張メソッドとして(最小値と最大値を見つける)? geo.Figures [0] .StartPointとgeo.Figures [0] .Segmentsから座標にアクセスできます。 WPFはコード内のポイントからPolyLineSegmentを作成して、次のようにアクセスするように見えます:(Geo.Figures [0] .Segments [0] PolyLineSegment).Points –

0

数字PathGeometryが大きな浮動小数点数で構成されているため、不正確さがあると思います。

必要な精度を得ることができるかどうかはわかりません。

あなたは、おそらくのように、許容範囲を使用して境界を比較する必要があります:

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

あなたはTOLERANCE 0.25にか何かを設定することができる場所。

関連する問題