Как я могу избавиться от этих "всплесков" визуальных артефактов при рисовании с помощью WPF?
Сейчас я рисую плитку (маленькие квадратные изображения) для картографического приложения.
Я использую WPF для рисования фигур на этих плитках.
У меня есть список геопространственных координат, которые составляют нарисованные полигоны.
Геопространственные координаты, составляющие эти многоугольники, преобразуются в пиксельные координаты.
Плитки создаются на разных уровнях детализации.
На большинстве этих уровней детализации рисунок хорош; но на определенных уровнях визуальный артефакт появляется в форме шипа или линии.
Вот пример, эти изображения находятся на трех разных уровнях детализации, один из которых показывает проблему, а два - по обе стороны, где проблема не возникает.
Это изображение с наивысшим уровнем детализации.
Это изображение со средней степенью детализации и показывает шипы (ту, что вдоль дороги 85, легче всего обнаружить):
Это изображение на самом низком уровне детализации и в порядке:
Пики появляются, когда две линии в многоугольнике сближаются и / или образуют плотную точку (сходимость).
Мы проверили исходные данные, и эти артефакты не существуют (это также подтверждается тем фактом, что они визуализируются правильно большую часть времени).
Следующим подозреваемым был процесс преобразования координат, но мы снова проверили его, и полученные точки не должны рисоваться таким образом.
Это делает WPF виновником, который ставит нас в затруднительное положение, поскольку мы не можем просто исправить проблему, как могли бы, с помощью нашего собственного кода.
Ребята, вы видели это раньше?
Исправление было бы фантастическим;)
На данный момент похоже, что мы должны смириться с этой проблемой или перейти на использование Direct2D. Мы уже отошли от рендеринга GDI+, так как он является однопоточным в процессе.
1 ответ
Решение состоит в том, чтобы изменить свойство LineJoin объекта Pen на "Round".
http://msdn.microsoft.com/en-us/library/system.windows.media.pen.linejoin.aspx
http://msdn.microsoft.com/en-us/library/system.windows.media.penlinejoin.aspx
Большое спасибо Moozhe, который предоставил этот ответ в комментариях.