Question

I've got a fairly simple 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

Now when I query the PathGeometry.Bounds attribute for this data I get the following bounds:

567764.5625,5956180  567950.875,5956400

The expected bounds would be:

567764.539,5956179.775 567950.858,5956399.843

My main problem: the bounds are smaller than the geometry, so parts of the geometry might be outside the bounds.

I create the PathGeometry and show the bounds like this:

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);

What am I doing wrong?
And, more important, how do I get the right bounds for a PathGeometry?

Was it helpful?

Solution

At some point, I would think WPF has to convert to single point for rendering, and I wonder if the value of Bounds is based off of the rendered result. In this case, you're probably seeing a precision limitation based off of the large numbers you're using. I noticed that your Y values were a factor of 10 larger than X, and coincidentally the error was also a factor of 10 larger than the error in X.

If it's possible to subtract off the min X and Y before creating the PathGeometry, I think you'll get better numbers. Assuming you're displaying the PathGeometry, you could place it in a Canvas and apply Canvas.Left/Top to your values to get the right offset on screen. To get the correct bounds, you would then add the Top/Left offsets to the result of your Bounds.

Just a reminder that there's a bit of speculation in this answer. I haven't looked at the innerworkings of Bounds, but the relative error seems to point to a conversion to and from floats.

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top