Разбиение WPF PathGeometry на «плитки» - PullRequest
6 голосов
/ 24 августа 2010

У меня довольно большая PathGeometry (более 100 000 точек и штрих, но не заполнен) для отображения для пользователя, но только небольшая часть пути будет видна в любой момент. Для пояснения, сам путь не предопределен, а будет создан из данных.

Проблема: я хочу обеспечить очень плавное панорамирование, чтобы пользователь мог исследовать области большего пути.

У меня есть возможное решение, но я не уверен, как его осуществить. Я бы хотел использовать технику листов - разбить геометрию на плитки и загружать только видимые плитки.

Итак, как разбить геометрию траектории только для обводки на плитки. Более конкретно, как мне определить часть пути, которая существует в данной прямоугольной плитке?

Я знаю, что могу использовать CombinedGeometry, чтобы определить пересечение между геометрией пути и прямоугольником, но это будет включать "стены" прямоугольника (который будет обведен). Есть ли лучший способ для построения PathGeometry только для обводки?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 24 августа 2010

Возможно, вместо мозаики просто используйте одну геометрию пути и программно изменяйте данные пути, используя привязку данных или что-то еще, чтобы представить сегмент пути, на котором вы увеличиваете масштаб. Немного похоже на DeepZoom, но с путями. Это будет означать, что вам не придется возиться с путями слияния.

Я делаю что-то похожее на вас, но числа, которые я использую В моих путях немного меньше, поэтому я не рассматривал использование каких-либо методов виртуализации. Однако я не заметил серьезных проблем с производительностью. У меня есть траектория в просмотре прокрутки, представляющая около 1000-10000 точек, и она становится медленной только при увеличении масштаба, только если точки очень далеко друг от друга. Если точки на пути относительно близки к своим соседям (например, хорошая широкая синусоида), тогда WPF выполняет некоторую оптимизацию для них, чтобы предотвратить любое заметное отставание.

Например: этот путь ...

multiple sines

... рисование займет больше времени, чем этот путь:

simple sine

даже если они содержат одинаковое количество точек, описывающих это. Хотя в действительности путь должен выглядеть примерно так, как показано на рисунке ниже, прежде чем вы заметите разницу в производительности.

the troublemaker

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

(извините за разницу в размерах изображений, бит, который вычисляет синусоидальную волну, в данный момент не работает, поэтому мне пришлось использовать старые jpegs)

1 голос
/ 16 сентября 2010

Я сам недавно думал об этом, так что, возможно, мой опыт может вам помочь. Во-первых, вы можете получить более высокую производительность, если сможете использовать StreamGeometry, а не PathGeometry. Я бы порекомендовал создать одну StreamGeometry в качестве свойства Data для Path, поместить ее на холст, а затем применить преобразования Scale и Translate для навигации по фигуре. Я получал приличную производительность с 5 или 6 SeriesGeometries каждая с 1000 баллами (очевидно, намного меньше, чем число, которое вы упомянули), хотя я считаю, что графический движок WPF будет масштабироваться достаточно хорошо, пока у вас не все точки на экране в то же время. Если вам нужно поддерживать «полное уменьшение», то есть все точки были бы видны, то я бы порекомендовал создать версии геометрии с низким разрешением (т. Е. Либо более простой набор точек, либо растровое изображение) и поменять местами максимумы и минимумы. -res версии, когда масштаб достигает некоторого уровня.

Имеет ли это смысл?

Удачи!

0 голосов
/ 11 сентября 2010

Один из способов - загрузить всю геометрию на холсте.Затем примените масштаб к холсту.Вы можете использовать сторонние элементы управления, такие как ab2d.

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

Спасибо / subho100

...