2011-11-01 43 views
4

我有一個非常簡單的PathGeometry: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 

現在,當我查詢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

是不是有點誇大其辭?你需要他們有多準確? –

+0

我可以接受,如果邊界會比路徑大一些,但是例如上限是5956180,而它應該是5956179.775。這些0.225偏離了錯誤的方向對我來說是致命的,我想使用邊界來加快交叉點匹配。多數民衆贊成在我的意思是「路」(也許是錯誤的方式)。 – Sam

回答

2

在某些時候,我會認爲WPF必須轉換爲單點渲染,並且我想知道Bounds的值是否基於渲染結果。在這種情況下,您可能會看到基於您使用的大數字的精度限制。我注意到你的Y值比X大10倍,巧合的是,錯誤也是X中的錯誤的10倍。

如果可以在創建之前減去min X和Y, PathGeometry,我想你會得到更好的數字。假設你正在顯示PathGeometry,你可以把它放在一個Canvas中,然後將Canvas.Left/Top應用到你的值,以便在屏幕上獲得正確的偏移量。爲了得到正確的界限,您將然後添加頂部/左側偏移到您的界限的結果。

只是提醒,在這個答案有一點猜測。我沒有看過Bounds的內部工作,但相對錯誤似乎指向了來自浮動的轉換。

+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或東西。