2010-08-24 12 views
6

Tengo un PathGeometry bastante grande (más de 100.000 puntos y recorridos pero no lleno) para mostrar al usuario, pero solo una pequeña parte de la ruta estará visible en cualquier momento. Para aclarar, la ruta en sí no está predeterminada, sino que se creará a partir de los datos.División de un WPF PathGeometry en "teselas"

El problema: quiero proporcionar un panorama muy uniforme para que el usuario pueda explorar áreas de la ruta más grande.

Tengo una posible solución pero no estoy seguro de cómo llevarla a cabo. Me gustaría utilizar una técnica de mosaico: divida la geometría en mosaicos y solo cargue los mosaicos visibles.

Entonces, ¿cómo dividir una geometría de ruta de solo trazo en las teselas? Más específicamente, ¿cómo determino la porción de la ruta que existe en un mosaico rectangular dado?

Sé que puedo usar una CombinedGeometry para determinar la intersección entre la geometría del camino y un rectángulo, pero eso incluirá las "paredes" del rectángulo (que se acariciará). ¿Hay alguna forma mejor de crear mosaico de PathGeometry solo de trazo?

Gracias!

Respuesta

2

Quizás, en lugar de mosaico, solo tenga una patogenometría y cambie los datos de ruta de manera programática mediante el enlace de datos o lo que sea para representar el segmento de la ruta que amplió. Un poco como DeepZoom pero con rutas. Esto significa que no tendrás que perder el tiempo fusionando caminos.

Estoy haciendo algo similar a usted pero los números que estoy usando En mis rutas son un poco menos, así que no he considerado usar ningún método de virtualización. Sin embargo, no he notado problemas de rendimiento masivo. Tengo un camino en un visualizador de desplazamiento que representa aproximadamente 1000 - 10000 puntos y solo se vuelve lento cuando hago zoom solo si los puntos están muy separados. Si los puntos en la ruta están relativly cerca de sus vecinos (por ejemplo, una onda sinusoidal de barrido agradable) entonces WPF realiza algún tipo de optimización en ellos para evitar cualquier retardo percibe.

Por ejemplo: este camino ...

multiple sines

... tomará más tiempo para dibujar que esta ruta:

simple sine

pesar de que contienen la misma cantidad de puntos describiéndolo Aunque en realidad, la ruta debe comenzar a verse como la imagen siguiente antes de notar alguna diferencia en el rendimiento.

the troublemaker

Debido a que el camino está representando una onda de audio tengo la intención de deshacerse de cualquier problema futuro de este tipo mediante la realización de algún tipo de comprobación para ver si los puntos son la creación de un bloque de color azul oscuro masiva y su sustitución por algo menos hambriento de poder pero esta puede no ser una solución suficiente para ti.

(lo de la diferencia de tamaño de las imágenes, el bit que calcula la onda sinusoidal está fuera de acción por el momento, así que he tenido que usar archivos JPEG de edad)

+0

Gracias por la respuesta. Suena como una buena técnica cuando puedes determinar fácilmente qué sub-sección de la ruta debería ser visible dada la región a la que el usuario está desplazado (por ejemplo, conociendo x_i y x_f, puedes determinar qué valores de y trazar). Es más difícil si está utilizando datos bidimensionales de ruta no parametrizados (¿cómo "rápidamente" descifrar cómo se ve la subruta actualmente visible)? La idea detrás de las teselas era predeterminar el subconjunto de la ruta que sería visible en cada tesela (preferiblemente utilizando las características de geometría de WPF) y mostrar/esconder "rápidamente" las teselas según sea necesario. – FTLPhysicsGuy

0

Una forma sería, se carga el geometría completa en un lienzo. Luego aplique un zoom al lienzo. Puede usar controles de terceros como ab2d.

He creado un lienzo como este en photoshop con muchos dibujos (creados por el usuario) en forma de geometrías.He usado ab2d para acercarme con su menucontrol y funciona bien. También puede establecer un zoom predefinido a una parte de él.

Gracias/subho100

1

Estaba pensando en esto mismo hace poco, así que quizás mis experiencias pueden ayudarle. En primer lugar, puede obtener un mejor rendimiento si puede usar un StreamGeometry en lugar de un PathGeometry. Recomendaría crear una StreamGeometry única como la propiedad Data de una ruta, colocarla en un lienzo y luego aplicar las transformaciones Scale y Translate para navegar por la forma. Obtuve un rendimiento decente con 5 o 6 SeriesGeometries cada uno con 1000 puntos (obviamente mucho menos que el número que mencionas), aunque creo que el motor de gráficos WPF se escalará bastante bien siempre que no tengas todos los puntos en la pantalla al mismo tiempo. Si necesita admitir que se "alejó completamente", es decir, todos los puntos estarían visibles, entonces recomendaría crear versiones de baja resolución de la geometría (es decir, un conjunto de puntos más simple o un mapa de bits) e intercambiar los valores alto y bajo. -res versiones cuando el zoom alcanza algún nivel.

¿Tiene sentido?

¡Buena suerte!

+0

Gracias por el aviso en StreamGeometry. Lo investigaré. Ya he considerado que la versión de "baja resolución" está completamente alejada. Sin embargo, la opción de escalar y traducir tiene problemas cuando se acerca demasiado. Vea mi otra pregunta sobre la traducción de un lienzo con altos niveles de zoom (http://stackoverflow.com/questions/3523541/translate-a-wpf-canvas-at-high-scale-factors-isnt-smooth-away-from-origin) – FTLPhysicsGuy