LineSeries «Оксиплот WPF» исчезает после увеличения - PullRequest
0 голосов
/ 10 января 2019

Я рисую график, используя 'Oxyplot Wpf', где;

  1. Ось X - это «TimeSpanAxis», а ось Y - «LinearAxis».
  2. Ось X начинается с 0 и переходит в бесконечность.
  3. Ось Y также начинается с 0, но заканчивается 1000.
  4. Масштабирование отключено по оси y, и все значения y всегда видны.
  5. Масштабирование включено по оси X.
  6. Использование 'LineSeries'.
  7. Значения графика очень длинные на оси X.

Проблема есть; после того, как я нарисую 'LineSeries', если я увеличу масштаб, линейная серия исчезнет. Даже если не изменять масштаб, но «LineSeries» на оси X очень и очень длинный, он также исчезает через некоторое время.

Когда я исследую проблему, я обнаруживаю эту проблему, вызванную рендерингом WPF. Если вы рисуете очень длинную полностью горизонтальную или полностью вертикальную линию, она становится невидимой после некоторой точки. Но он должен быть полностью горизонтальным или вертикальным, иначе он каким-то образом останется видимым. Это утверждение также действительно для графиков Oxyplot WPF.

Я провожу некоторые исследования в Интернете и вижу, что это известная проблема.

Первая ссылка

Вторая ссылка

Третья ссылка

«Oxyplot Wpf» - библиотека с открытым исходным кодом, поэтому я попытался решить проблему самостоятельно, но не могу. Когда я исследовал исходный код, я увидел, что «Оксиплот» рисует всю линию, даже части этой линии не видны на экране. Поэтому, если я как-то заставлю эти длинные горизонтальные линии рисовать по частям (пользователь не должен это замечать) или я каким-то образом сделаю эти линии не совсем горизонтальными (пользователь также не должен это замечать), чтобы линии не стали невидимыми. Но я не мог сделать ничего из этого.

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

Код изменяет небольшую часть класса "CanvasRenderContext" в библиотеке Oxyplot Wpf.

Изменяет эту строку:

var p = aliased ? this.ToPixelAlignedPoint(points[i]) : this.ToPoint(points[i]);

к этому:

var p = aliased ? ToPoint(points[i]) : ToPixelBoundaryPoint(points[i]);

и добавляет эту функцию:

 private Point ToPixelBoundaryPoint(ScreenPoint pt)
{
   double x; double y;
   if (pt.X >= 150000.0)
   {
    x = 150000.0;
   }

   else if (pt.X <= 0)
   {
    x = pt.X/10000;
   }

   else if (pt.X <= -1000000)
   {
    x = 150000.0;
   }
   else
    x = pt.X;
   if (pt.Y >= 150000.0)
   {
    y = 150000;
   }
   else
    y = pt.Y;
   return new Point(x, y);
}

После этих изменений строки больше не исчезают! Но «LineSeries» иногда показывает неправильные значения, и это для меня неприемлемо.

Небольшое примечание: я использую .Net Framework 4.7.2

...