Nella sezione 6.13 vengono indicati dei possibili spunti di approfondimento sulla questione, ma si consideri che per definire una curva di Bézier con Jgraph servono almeno quattro punti, e in generale è possibile tracciare una curva di Bézier mediante 3*n+1 punti di controllo, di cui 2*n di controllo e i rimanenti n+1 di passaggio della curva.
Il listato 6.22 e la figura 6.23 fornuscono un esempio in cui viene disegnato un pallone da football americano (molto stilizzato a dire il vero) mediante curve di Bézier.
-
Una curva di Bézier è una particolare curva parametrica, che ha grande applicazione nella computer grafica. Un metodo numericamente stabile per calcolare le curve di Bézier è l'algoritmo di de Casteljau. Wikipedia
Listato 6.22. Jgraph: curve di Bézier.
newgraph xaxis min 0 max 10 nodraw yaxis min 0 max 10 nodraw (* Draw the outline of the football *) newline bezier poly pcfill .543 .270 .074 pts 0 5 3 10 7 10 10 5 7 0 3 0 0 5 (* Draw the main thread *) newline bezier linethickness 4 gray 1 pts 3 7 4.5 8 5.5 8 7 7 (* Draw the crossthreads *) copycurve nobezier pts 3.5 6.7 3.3 7.5 copycurve pts 6.5 6.7 6.7 7.5 copycurve pts 4.2 7.1 4.1 7.9 copycurve pts 5.8 7.1 5.9 7.9 copycurve pts 5 7.3 5 8.1 |
Figura 6.23.
Altre caratteristiche. |
Dall'interno di un sorgente Jgraph è possibile invocare un comando della shell o un programma esterno scrivendo shell : comando; l'output generato viene contestualmente incluso nel sorgente.
Ovviamente si tratta di una caratteristica estremamente interessante e potente, poiché permette di utilizzare strumenti come Perl, Awk e simili per il tracciamento di grafici di funzione, estrazione e manipolazione di dati, ecc.; parallelamente si tratta di una caratteristica potenzialmente pericolosa, in quanto Jgraph non effettua nessun controllo sul comando che viene eseguito, aprendo così il varco a possibili cavalli di Troia.
Prestare dunque un'adeguata cautela!
Infine, si noti che è possibile tracciare più di un grafico nella stessa immagine mediante un ulteriore newgraph oppure mediante copygraph: in quest'ultimo caso il grafico successivo eredita gli assi dal precedente. Il posizionamento relativo dei vari grafici è gestibile mediante gli attributi di grafico x_translate e y_translate. È altresì possibile posizionare i vari grafici su più pagine, mediante la parola chiave newpage. Il listato 6.24 e la figura 6.25 presentano un esempio di utilizzo di copygraph.
Listato 6.24. Jgraph: grafici multipli.
newgraph xaxis min 0 max 10 size 1 label fontsize 16 font Times-Italic : Graph 1 yaxis min 0 max 10 size 1 newcurve marktype box linetype solid pts 1 10 2 8 5 5 8 3 10 2 copygraph x_translate 2 xaxis label : Graph 2 newcurve marktype box linetype solid pts 10 10 8 8 5 5 8 3 10 2 |
Figura 6.25.
Utilizzo programmatico. |
«njgraph.pl» Un esempio interessante è il programma njgraph.pl di Neil Spring. Si tratta di un piccolo sorgente in Perl che in pratica realizza una specie di programma frontale per Jgraph: esso legge dallostandard input una singola serie di dati da rappresentare graficamente, e dopo averli opportunamente passati a Jgraph per l'elaborazione invoca GV, a meno che lo standard output non venga rediretto.
Il programma njgraph.pl riconosce altresì gli attributi marktype, linetype e color (e relativi valori) facoltativamente presenti sulla riga di comando, e li posiziona opportunamente all'interno del sorgente Jgraph prima dell'elaborazione.
La figura 6.26 illustra qualche esempio di invocazione del programma njgraph.pl, mentre la figura 6.27 ne illustra l'output.
Figura 6.26. Invocazione del programma njgraph.pl.
$ njgraph.pl [Invio]
automatically invoking gv; redirect if you want something else 1 7 2 3 3 8 4 6 5 3 6 2 7 4 8 7 9 5 10 7 [Invio]
[Ctrl d]
[q]
$ njgraph.pl marktype box linetype dashed color 1 0 0 [Invio]
automatically invoking gv; redirect if you want something else 1 7 2 3 3 8 4 6 5 3 6 2 7 4 8 7 9 5 10 7 [Invio]
[Ctrl d]
[q]
$
|
Figura 6.27. Output del programma njgraph.pl.