Виртуализация пользовательского интерфейса с использованием полилиний - PullRequest
1 голос
/ 30 марта 2011


Я хочу виртуализировать полилинии. В моем приложении показано до семи полилиний, и каждая полилиния имеет до девяти миллионов точек (конечно, должна быть видна только часть). Каждая полилиния имеет привязку к PointCollection. Все полилинии находятся внутри элемента управления ScrollViewer, который прокручивает эффекты каждого из них.
Теперь мне интересно, как возможна виртуализация полилинии. Я нашел статью о Virtual Canvas Криса Ловетта из Microsoft, но я не уверен, работает ли она для моей проблемы. Кто-нибудь сталкивался с чем-то подобным?
Заранее спасибо.

1 Ответ

0 голосов
/ 31 марта 2011

Я столкнулся с подобной ситуацией и решил реализовать виртуализацию следующим образом: данные, которые я обрабатывал (точки полилиний), были в реальных координатах и ​​имели гораздо больше деталей, чем можно было отобразить на дисплее.Пользователь также должен иметь возможность увеличивать и видеть больше деталей.

  1. Определите расстояние между двумя (или тремя) пикселями на дисплее в мировых координатах.это позволяет мне решить, могу ли я удалить точку полилинии, потому что она окажется в том же месте пикселя, что и соседняя точка.
  2. Прокрутка точек:

    а.если текущая точка будет в том же месте на дисплее, что и предыдущая точка: пропустите ее.

    b.если текущая точка и две предыдущие точки расположены на прямой линии, предыдущая точка не нужна: удалите предыдущую точку, добавьте текущую (и добавьте следующую точку (D), чтобы предотвратить округление медленно изгибающейся кривой впрямая линия).

  3. Используйте собранные точки для рисования ломаной линии

В зависимости от данных это помогло мне уменьшить исходный набор обратнопримерно до 30%, но это полностью зависит от данных.Там нет никаких гарантий;)

Когда пользователь увеличил масштаб, я просто пересчитал, начиная с шага 1.

Я добавил много параметров в алгоритм, чтобы я мог настроить и настроить его, чтобы найти сладкоеместо между производительностью и качеством изображения.Например, я добавил эпсилон, который позволил мне указать, какое расстояние между линией, проходящей через A и C, и точкой B было разрешено, чтобы точка B все еще находилась на линии.

Дайте мне знать, если это поможет.

...