wpf split tiling pathgeometry

Dividir un PathGeometry de WPF en "tiles"



split tiling (3)

Tengo una PathGeometry bastante grande (más de 100.000 puntos y cargada, pero no llena) para mostrar para el 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.

El problema: quiero proporcionar un panorama muy sencillo 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 hacerlo. Me gustaría utilizar una técnica de mosaico: divida la geometría en mosaicos y solo cargue los mosaicos visibles.

Entonces, ¿cómo se divide una geometría de ruta solo de trazo en mosaicos? 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 será acariciado). ¿Hay alguna forma mejor de crear mosaico de PathGeometry solo de trazo?

¡Gracias!


Quizás, en lugar de mosaico, solo tenga una patogenometría y modifique la ruta de acceso programáticamente 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 ti, pero los números que estoy usando en mis rutas son ligeramente menores, 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 relativamente cerca de sus vecinos (por ejemplo, una onda sinusoidal de barrido bonita), entonces WPF realiza algún tipo de optimización en ellos para evitar cualquier retraso perceptible.

Por ejemplo: este camino ...

... tomará más tiempo dibujar que este camino:

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

Debido a que la ruta representa una onda de audio, intento deshacerme de cualquier problema futuro como este realizando algún tipo de comprobación para ver si los puntos están creando un bloque azul oscuro masivo y reemplazándolo con algo menos hambriento de poder, pero puede que esto no sea así. una solución suficiente para ti.

(Lo siento por la diferencia de tamaño en las imágenes, el bit que calcula que la onda senoidal está fuera de acción en este momento, así que he tenido que usar viejos jpegs)


Una forma sería cargar la 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 que se encuentran allí. 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


Estuve pensando en esto recientemente, así que tal vez mis experiencias puedan ayudarte. 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!