2009-06-24 6 views
7

Mi tarea consiste en desarrollar un algoritmo que ajuste diferentes tipos de curvas en una secuencia de puntos dada en el espacio bidimensional.Representación 2D y ampliación con SVG

Para poder probar mi algoritmo, he elegido SVG para mostrar el resultado. Tengo varios problemas con eso.

Como puede haber entradas y salidas muy diferentes de mi algoritmo, es esencial que pueda ver los archivos SVG generados con la capacidad de acercar!

Pero una ruta en SVG solo se puede mostrar con un ancho determinado. Si hago un acercamiento, entonces el ancho de la ruta se hace más ancho. Me gustaría que el ancho sea, por ejemplo, 1 píxel en todos los niveles de zoom. ¿Existe alguna solucion para esto?

También: ¿puede SVG mostrar puntos? Sí, puntos simples y crudos. He descubierto que no puede.

Gracias

Respuesta

8

Muchos otros formatos vectoriales (como PostScript y PDF) le permite utilizar un golpe de ancho de 0 para un accidente cerebrovascular "línea del cabello". No es así con SVG. Sin embargo, creo que puede lograr lo que desea si utiliza un porcentaje de ancho de trazo. Ver the w3c SVG specifications for details, pero, básicamente, usted debería ser capaz de hacer algo como esto:

stroke-width:"1%" 

Esto debería ictus su curva con un ancho de línea que es una constante de 1% del rectángulo delimitador, independientemente del nivel de zoom. Para los puntos, SVG no los admite. Cuando hice esto en el pasado (usando PostScript) siempre utilicé arc with a small redius para dibujar un círculo pequeño (que puede llenar para hacer un punto, si lo desea).


@Zoli: Después de su comentario, yo estaba a punto de sugerir que usted mira en PostScript por lo que podría utilizar el trazo ancho de línea del cabello cuando me encontré con el non-scaling-stroke vector-effect in the SVG specification:

vector-effect="non-scaling-stroke" 

Sólo tiene que añadir a esta su curva y debería ser invariante para escalar, de acuerdo con la especificación. Su ejemplo usa line, pero también debería funcionar en sus curvas.

+0

usando%: el zoom también amplía la línea. – libeako

+0

Gracias por la propiedad de efecto vectorial, pero no funciona como quiero. No defiende el zoom, solo contra la transformación en el propio documento svg. Pero incluso eso no funciona, creo que porque esta podría ser una característica demasiado nueva de SVG, es posible que Mozilla Firefox no lo admita. – libeako

+0

Creo que es una característica de SVG 1.2, pero incluso es compatible con los perfiles pequeños y móviles, por lo que cualquier implementación de SVG 1.2 debería ser compatible. La descripción de la especificación SVG hace que parezca que también debería funcionar para el acercamiento, ya que se supone que debe representarse en el contexto del dispositivo (es decir, el espacio de la pantalla). ¿Has probado con otros espectadores de SVG para ver cómo funciona? – Naaff

0

Gracias Naaff la ayuda. Creo que me quedaré con Firefox, y especificaré para cada algoritmo-ejecución el ancho de línea en el archivo svg generado. Eso será adecuado para mí.

1

No hay <punto> elemento o algo por el estilo en SVG actualmente, pero agregando que se ha discutido en el SVG WG, por lo que puede ser incluido en el futuro. Siéntase libre de expresar sus necesidades y requisitos para un elemento <punto> a la lista de correo svg público: [email protected]

Una solución consiste en utilizar, por ejemplo, < línea > elementos y dejarlos ser de longitud cero, si lo desea, puede tener linecaps redondos para que se muestre un punto. Todo depende de para qué necesita esto. Un círculo con r = 0 podría ser un mejor ajuste.

La propiedad 'efecto vector' con valor 'trazo sin escala' es lo que debe usar para decir que el trazo no debe escalar. No es tan difícil implementar una solución de javascript que asegure que los trazos se escalen correctamente si el 'efecto vectorial' no es compatible de forma nativa.Opera 9.5+ lo admite de forma nativa.