2009-06-24 16 views
7

Il mio compito è sviluppare un algoritmo che si adatti a diversi tipi di curve su una data sequenza di punti nello spazio bidimensionale.Rendering 2D e ingrandimento con SVG

Per poter testare il mio algoritmo, ho scelto SVG per visualizzare il risultato. Ho diversi problemi con esso.

Poiché potrebbero esserci input e output molto diversi del mio algoritmo, è essenziale poter visualizzare i file SVG generati con la possibilità di ingrandire!

Ma un percorso in SVG può essere visualizzato solo con una certa larghezza. Se eseguo lo zoom in avanti, la larghezza del percorso si allarga. Vorrei che la larghezza fosse ad esempio di 1 pixel a tutti i livelli di zoom. C'è una soluzione per questo?

Inoltre: è possibile visualizzare i punti di visualizzazione SVG? Sì, punti semplici e crudi.? Ho scoperto che non può.

Grazie

risposta

8

Molti altri formati vettoriali (come PostScript e PDF) vi permetterà di utilizzare un tratto di larghezza pari a 0 per una corsa "attaccatura dei capelli". Non così con SVG. Tuttavia, I penso a puoi ottenere ciò che vuoi se usi una percentuale di larghezza del tratto. Vedere the w3c SVG specifications for details, ma, in fondo, si dovrebbe essere in grado di fare qualcosa del genere:

stroke-width:"1%" 

Questo dovrebbe ictus la curva con una larghezza di linea che è una costante 1% del rettangolo, indipendentemente dal livello di zoom.

Come per i punti, SVG non li supporta. Quando ho fatto questo in passato (usando PostScript) ho sempre usato uno arc with a small redius per disegnare un piccolo cerchio (che puoi riempire per fare un punto, se lo desideri).


@Zoli: Dopo il tuo commento, stavo per suggerire di guardare in PostScript così si potrebbe usare l'attaccatura dei capelli stroke-width quando mi sono imbattuto il non-scaling-stroke vector-effect in the SVG specification:

vector-effect="non-scaling-stroke" 

Basta aggiungere questo a la tua curva e dovrebbe essere invariabile al ridimensionamento, secondo le specifiche. Il loro esempio utilizza line, ma dovrebbe funzionare anche sulle curve.

+0

utilizzando%: lo zooming allarga anche la linea. – libeako

+0

Grazie per la proprietà effetto vettoriale, ma non funziona come voglio. Non difende dallo zoom, solo contro la trasformazione nel documento stesso. Ma anche questo non funziona, penso perché questa potrebbe essere una caratteristica troppo nuova di SVG - Mozilla Firefox potrebbe non supportarlo. – libeako

+0

Credo che sia una funzionalità SVG 1.2, ma è supportata anche nei profili mobili e piccoli, quindi qualsiasi implementazione SVG 1.2 dovrebbe supportarla. La descrizione delle specifiche SVG fa sembrare che dovrebbe funzionare anche per lo zoom, dal momento che dovrebbe solo eseguire il rendering nel contesto del dispositivo (ad esempio lo spazio dello schermo). Hai provato altri spettatori SVG per vedere come funziona lì? – Naaff

0

Grazie Naaff l'aiuto. Penso che rimarrò con firefox e specificherò per ogni algoritmo, l'esecuzione della larghezza della riga nel file svg generato. Questo sarà adeguato per me.

1

Non c'è un elemento punto > o qualcosa del genere in SVG al momento, ma aggiungendo che è stato discusso nel WG SVG, quindi potrebbe essere incluso in futuro. Sentiti libero di esprimere le tue esigenze e requisiti per un elemento punto > alla mailing list svg pubblica: [email protected]

Una soluzione alternativa è utilizzare, ad esempio, < elementi linea > e lasciare che siano di lunghezza zero, se si desidera è possibile avere arrotondamenti per far apparire un punto. Tutto dipende da ciò che ti serve per questo. Un cerchio con r = 0 potrebbe essere una soluzione migliore.

La proprietà 'vector effect' con valore 'non-scaling-stroke' è ciò che si dovrebbe usare per dire che il tratto non deve ridimensionarsi. Non è così difficile implementare una soluzione javascript che assicuri che i tratti siano correttamente ridimensionati se "effetto vettoriale" non è supportato in modo nativo.Opera 9.5+ lo supporta in modo nativo.