WPF PathGeometry - границы неверны? - PullRequest
4 голосов
/ 01 ноября 2011

У меня довольно простая 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?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

В какой-то момент я бы подумал, что WPF необходимо преобразовать в одну точку для рендеринга, и мне интересно, основано ли значение Bounds на визуализированном результате. В этом случае вы, вероятно, видите ограничение точности, основанное на больших числах, которые вы используете. Я заметил, что ваши значения Y были в 10 раз больше, чем X, и, по совпадению, ошибка также была в 10 раз больше, чем ошибка в X.

Если возможно вычесть мин. X и Y перед созданием PathGeometry, я думаю, вы получите лучшие числа. Предполагая, что вы отображаете PathGeometry, вы можете поместить его в Canvas и применить Canvas.Left / Top к вашим значениям, чтобы получить правильное смещение на экране. Чтобы получить правильные границы, вы должны добавить верхние / левые смещения к результату ваших границ.

Просто напоминание о том, что в этом ответе есть немного предположений. Я не смотрел на внутреннюю работу Bounds, но относительная ошибка, кажется, указывает на преобразование в и из поплавков.

0 голосов
/ 01 ноября 2011

Я думаю, вы видите неточность из-за того, что числа PathGeometry составлены из больших чисел с плавающей запятой.

Я не уверен, что вы сможете получить необходимую точность.

Вероятно, вам придется сравнивать границы, используя приемлемый допуск, например:

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

, где вы можете установить TOLERANCE на 0,25 или что-то еще.

...