Robitex's Blog

Ideas in the web

Archivi Categorie: PGF

L’Arte della pericolosità sismica – Parte 2


Sommario

Con un nuovo tocco di colore, torniamo sulla mappa della pericolosità sismica italiana per produrre un’altra pagina artistica. Questa volta useremo una scala di colori con quelli della nostra bandiera…

Colore italiano

Riprendendo il codice illustrato in questo post, è sufficiente creare una nuova funzione Lua, riportata in seguito, per ottenere la mappa sottostante:

La mappa di pericolosità sismica in versione tricolore

La mappa di pericolosità sismica in versione tricolore

Il colore, funzione dell’accelerazione, varierà da verde per il valore minimo a bianco per l’accelerazione media, fino ad arrivare al rosso per l’accelerazione massima.
In LaTeX, un colore può essere miscelato facilmente con il bianco specificandone dopo il nome ed un punto esclamativo, un valore variabile da 0 a 100. Il valore nullo corrisponde al colore bianco, mentre il valore 100 lascia intatto il colore.
Così, l’espressione ‘green!50’ corrisponde al colore bianco con il 50% di verde.

Il codice seguente mostra la funzione che genera l’espressione del colore in funzione dell’accelerazione. Valori bassi di pericolosità saranno rappresentati da un colore verde mescolato con sempre meno bianco a mano a mano che l’accelerazione decresce, mentre valori elevati saranno rappresentati da un colore rosso mescolato ad una componente decrescente di bianco:

-- funzione di interpolazione lineare
local function linear(x,x1,x2,y1,y2)
   return y1 + (y2-y1)*(x-x1)/(x2-x1)
end

-- funzione scala di colori dal verde al rosso
-- passando per il bianco
local function green2red(ag)
   local agmean = (agmax+agmin)/2
   local basecol, val
   if ag < agmean then
      basecol = 'green'
      val = linear(ag, agmin, agmean, 100, 0)
   else
      basecol = 'red'
      val = linear(ag, agmean, agmax, 0, 100)
   end
   
   return string.format('%s!%d', basecol, val)
end

Ho stampato anche questa nuova mappa, naturalmente a colori, e l’ho appesa in ufficio a beneficio della collezione primavera estate 2012.
Ciao.

Annunci

L’Arte della pericolosità sismica


Sommario

Attraverso i software del mondo TeX, creeremo una visualizzazione artistica della mappa di pericolosità sismica italiana contenuta nella norma D.M. 14/01/2008. L’elaborazione grafica sarà opera del potente pacchetto TikZ progettato per LaTeX, mentre un piccolo programma in Lua si occuperà della costruzione logica.

Pericolosità sismica S1

Il progetto S1 di INGV, l’Istituto Nazionale di Geofisica e Vulcanologia, recepito poi dalla normativa tecnica, ha definito la pericolosità sismica nel territorio italiano attraverso una griglia di punti distanti uno dall’altro poco più di 5 km.
L’idea è quella di replicare le rappresentazioni grafiche diffuse dall’INGV con gli strumenti del mondo TeX, realizzando mappe a colori con i valori dell’accelerazione di picco al suolo PGA, Peak Ground Accelaration (un risultato è riportato in fondo all’articolo).

Immagine della mappa S1 tratta dal sito INGV

Immagine della mappa S1 tratta dal sito INGV

Struttura del codice

Ecco una descrizione di come verranno elaborati i dati:

  • uno script principale in Lua, efficiente linguaggio di scripting, leggerà i dati della pericolosità producendone un file di testo contenente comandi grafici per TikZ;
  • un sorgente LaTeX elaborerà i comandi producendo la mappa grafica in formato pdf.

I dati

Ho tradotto la tabella scaricabile dal sito del Consiglio dei Lavori Pubblici, contentente i dati di pericolosità sismica, in una forma direttamente comprensibile da Lua: ecco come appare il contenuto del file di dati che ho chiamato ‘GridS1.lua’:

GridS1 = {
[13111] = {lon=6.5448, lat=45.134, Tr30={0.0263, 2.50, 0.18}, Tr50={0.0340, 2.51, 0.21}, ...ecc
[13333] = {lon=6.5506, lat=45.085, Tr30={0.0264, 2.49, 0.18}, Tr50={0.0341, 2.51, 0.21}, ...ecc
[13555] = {lon=6.5564, lat=45.035, Tr30={0.0264, 2.50, 0.18}, Tr50={0.0340, 2.51, 0.20}, ...ecc
...ecc

Creare i comandi grafici

Disegneremo per ciascun punto della griglia S1, un quadratino colorato secondo una data scala di colori associata al valore della PGA, ma per farlo dobbiamo risolvere due problemi:

  • tradurre la coppia longitudine, latitudine dei punti in coordinate nel piano x, y;
  • associare un colore al valore di accelerazione.

Il sorgente Lua mostrato nel seguito dapprima carica in memoria i dati strutturati della griglia, determina i valori minimi e massini dell’accelerazione tra tutti i 10751 punti (per il tempo di ritorno di 475 anni) utili in seguito, poi definisce le due funzioni fondamentali di trasformazione delle coordinate (trasf()) e di associazione valore->colore (wavecolor).

Preparato il terreno, lo script si conclude con la funzione go(), che scrive su un file esterno chiamato defpoint.tex, le istruzioni TikZ di disegno.

Notate che la funzione go() accetta come argomenti anche delle funzioni. Il vantaggio immediato di questo tipo di programmazione disponibile in Lua è che la funzione go() diviene indipendente sia dal tipo di trasformazione di coordinate che dalla scala di colore (io ho scelto di lavorare con la definizione di colore basato sulla lunghezza d’onda della luce con rapporto lineare rispetto alla PGA).

Per i più curiosi, nei commenti del codice sono riportati i due punti della maglia S1 corrispondenti al punto sismicamente più pericoloso e quello meno pericoloso sul territorio della penisola italiana…

-- carica la tabella dati dal file GridS1.lua
dofile "GridS1.lua"

-- funzione di massimo o minimo valore
local function S1(funval, key)
   local rif = funval(GridS1[13111])
   local id

   for idx, t in pairs(GridS1) do
      local val = funval(t)
      if key == "max" then
         if  val > rif then
            rif = val
            id = idx
         end
      elseif key == "min" then
         if val < rif then
             rif = val
             id = idx
          end
       else
          error("The key '"..key"' is not supported.")
       end
    end
    return rif, id
end
-- funzioni di estrazione dati singolo nodo
local function Lat(t)
    return t.lat
end
local function Lon(t)
    return t.lon
end
local function Ag475(t)
    return t.Tr475[1]
end
local function countNode()
    local i = 0
    for _, t in pairs(GridS1) do
       i = i + 1
    end
    return i
end
-- valori minimi e massimi dei dati di mappa
local agmax, idmax = S1(Ag475, 'max')  --> 0.278 , 49640
local agmin, idmin = S1(Ag475, 'min')  --> 0.0364, 12693

-- latitudine
local latmax = S1(Lat, 'max')   --> 47.178
local latmin = S1(Lat, 'min')   --> 36.573

-- longitudine
local lonmax = S1(Lon, 'max')   --> 18.594
local lonmin = S1(Lon, 'min')   --> 6.5448

-- numero nodi S1 (solo per saperlo...)
local numnode = countNode()     --> 10751

-- funzione di servizio
local function makecmdfile(fn, t)
   local outputfile = assert(io.open(fn..".tex","w"))
   outputfile:write(table.concat(t,"\n"))
   outputfile:close()
end

-- restituisce le coordinate di mappa
-- da quelle geografiche
local function trasf(lon, lat)
   -- fattore di conversione gradi->cm
   local f = 4.1

   return 0.80*lon*f, lat*f
end

-- funzione scala di colori wavelets
local function wavecolor(ag)
   local w1 = 363
   local w2 = 814
   local m = 80
   w1 = w1 + m
   w2 = w2 - m
   return w1 + (w2-w1)*(ag-agmin)/(agmax-agmin)
end

-- maschera di formato disegno
local cmask = '\\convertcolorspec{wave}{%d}{rgb}\\col\\color[rgb]{\\col}'
local dmask = '\\draw (%0.3f,%0.3f) node {};'

-- filename = nome senza estensione del file risultato
-- fcoord = funzione di trasformazione coordinate
-- fcolor = funzione di trasformazione colore
local function go(filename, fcoord, fcolor)
   -- memorizzazione comandi
   local t = {}
   for id, dati in pairs(GridS1) do
      local ag = Ag475(dati)
      local lt = Lat(dati)
      local ln = Lon(dati)

      t[#t+1] = string.format(cmask, fcolor(ag))
      t[#t+1] = string.format(dmask, fcoord(ln,lt))
   end

   makecmdfile(filename, t)
end

-- esecuzione
go('defpoint', trasf, wavecolor)

Creare la mappa

Per creare la mappa è sufficiente compilare con pdfLaTeX questo minuscolo file:

\documentclass{standalone}
\usepackage{tikz}
\usepackage{xcolor}
\tikzstyle{every node}=[
    fill,
    minimum size=0.1pt
]

\begin{document}
\begin{tikzpicture}
\input{defpoint}
\end{tikzpicture}
\end{document}

Risultato

La mappa risultato è questa, insieme di 10751 quadratini colorati in modo diverso uno dall’altro (fate un click sull’immagine per scaricarla, un’esperienza da brivido…):

Mappa della pericolosità sismica italiana

La mappa della pericolosità sismica italiana risultato dell’elaborazione descritta nell’articolo

Note tecniche

Per riprodurre la mappa eseguendo il codice mostrato nel post, occorre disporre di una installazione TeX, come TeX Live o MiKTeX, e l’interprete Lua, tutti strumenti gratuiti, o meglio, liberi.
Avremo potuto lavorare con un unico strumento (Lua incorporata in TeX, ovvero LuaTeX, ma lascio il facile esercizio al lettore che non perderà l’occasione di inventarsi nuove scale di colore… 🙂
Alla prossima!

Collage di precisione di PDF


Download the article in the pdf file format

Sommario

Con gli strumenti a disposizione di una distribuzione TeX è possibile ottenere un pdf unendo vari pdf di partenza per di più posizionandoli geometricamente nel modo voluto.
I pacchetti LaTeX utilizzati allo scopo sono il potente PGF, forse il pacchetto dall’implementazione più complessa, e il pacchetto graphicx. Con essi non serve altro che decidere la posizione sul foglio bianco degli singoli oggetti pdf contenuti nei rispettivi file.

Giocando giocando

Un altro esempio di utilizzo di LaTeX come strumento di manipolazione di file PDF è l’opposto dell’idea di estrazione dei contenuti di cui ci siamo occupati nel post precedente: a partire da due o più file PDF se ne vuole fare un collage in un nuovo file PDF.

Come per gli altri collage la cosa si prospetta divertente ma già intravedo dei possibili usi nella pratica professionale. Per il nostro esempio ho dapprima costruito due file pdf contenenti un rettangolo blu ed un rettangolo rosso di date dimensioni, e poi li ho uniti sulla stessa pagina ciascuno in una data posizione.

L’esempio è del tutto generale sia nel numero di pdf da unire sia nel loro contenuto.

Nelle immagini seguenti cliccabili per scaricarne il corrispondente file pdf, vi riporto come appaiono i rettangoli d’esempio e come appare il risultato finale dell’unione secondo posizioni geometriche stabilite.

Blue rectangle, click to download

Blue rectangle, click to download

Red rectancle, click to download

Red rectancle, click to download

Red and blue union, click to download

Red and blue union, click to download

Passiamo la parola quindi al codice, e… buon divertimento!!!

Rettangolo blu

Utilizziamo il potentissimo pacchetto grafico PGF per generare il rettangolo blu, diciamo di 70 x 35 mm con linea a spigoli arrotondati di 5 punti di spessore (in TeX le unità di misura delle lunghezze sono molte e sono tutte interscambiabili):

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz[line width=5pt,color=blue,rounded corners]
  \draw (0,0) rectangle (70mm,35mm);
\end{document}

Ecco fatto (inserite il codice in un file di testo, per esempio con Blocco Note, salvatelo su disco e compilatelo con pdflatex, oppure semplicemente caricate il file nell’editor TeXWorks e premete Control+T), sono in tutto sei righe di codice LaTeX che esprimono in maniera diretta esattamente quello che abbiamo descritto in apertura di paragrafo.

Rettangolo rosso

Per il rettangolo rosso semplicemente cambiamo i parametri di colore e dimensione e ripetiamo la veloce procedura di compilazione per generare il secondo pdf che andremo ad unire in un (primordiale) collage.
Un solo nuovo commento al codice ed è questo: vi segnalo l’uso della classe di documento standalone (ringrazio il Professor Enrico Gregorio per avermi segnalato l’esistenza di questa classe sul forum del GuIT), che genera il file pdf nelle esatte dimensioni di pagina necessarie a contenere gli oggetti che creiamo.

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz[line width=5pt,color=red,rounded corners]
  \draw (0,0) rectangle (32mm,88mm);
\end{document}

Collage!

Per unire due file pdf l’idea è quella di inserirli in un documento LaTeX attraverso il pacchetto graphicx, come semplici immagini. Tuttavia in questo modo i rettangoli verrebbero inseriti uno sopra l’altro e noi vogliamo qualcosa di più, vogliamo specificarne la posizione geometricamente.
Bene, ricorriamo ancora al pacchetto PGF in combinazione con graphicx, inserendo i file dei rettangoli come fossero il materiale da comporre di un oggetto nodo.
Un nodo PGF può contenere qualsiasi materiale e quindi anche un immagine intera, ed è caratterizzato da un punto di posizionamento (x,y) e da un riferimento di ancoraggio. In questo caso ho scelto l’ancoraggio in basso a sinistra. In altre parole il punto in cui localizziamo il nodo tramite coordinate sul foglio, sarà il punto in cui si troverà la posizione dell’angolo in basso a sinistra dell’immagine (in singolo file pdf).

Ancora, si noti come l’argomento del comando \includegraphics è il nome del file da includere e che questo normalmente va indicato privo di estensione, e che volendo potremo sia ruotare che scalare il pdf da inserire tramite le opzioni angle e scale del comando.
Per quanto riguarda la posizione dei file nell’albero del file system, nell’esempio si è lavorato con i file sorgenti .tex ed il materiale .pdf posizionati tutti nella stessa directory.
Ecco il codice che produrrà il collage di unione rappresentato nell’immagine.
Mi raccomando scaricate i pdf con un click sulle immagini soprastanti per rendervi conto meglio del carattere vettoriale, cioè di massima qualità, dei contenuti grafici.

\documentclass{standalone}
\usepackage{tikz}
\usepackage{graphicx}

\begin{document}
\begin{tikzpicture}[every node/.style={anchor=south west}]
   % disegnamo un circoletto di posizionamento delle coordinate
   % dell'origine del sistema di riferimento
   \draw (0,0) node[circle, draw] {};
   
   \draw (10mm,95mm) node {\includegraphics{blue}}; % insert blue.pdf file
   \draw (0,0) node {\includegraphics{red}};        % insert red.pdf file
\end{tikzpicture}
\end{document}

Per oggi mi fermo qui, alla prossima!

Il terremoto come fenomeno poissoniano: il tempo di ritorno


Scarica l’articolo in formato PDF per la stampa

Probabilità poissoniana di accadimento

La distribuzione poissoniana delle probabilità ipotizza che se un evento è del tutto casuale, allora la probabilità che accada n volte nel periodo T è data dalla relazione seguente, noto il valore di y, il numero medio di accadimenti nel periodo considerato:

\displaystyle p_{n}=\frac{y^n}{n!}e^{-y}.

Se per esempio un evento casuale capita mediamente una volta l’anno (y=1), la probabilità che capiti due volte l’anno è di soli 18,4%.

La probabilità dipende quindi dall’intervallo di tempo di riferimento V_R, periodo in cui è noto il numero medio di accadimenti dell’evento casuale.
Se dividiamo il numero medio di accadimenti con il periodo ad esso correlato, otteniamo la frequenza media di accadimento dell’evento \lambda.

\displaystyle y=\lambda V_R.

Se invece al contrario, dividiamo il periodo di riferimento con il numero medio di accadimenti, otteniamo l’intervallo di tempo medio tra gli accadimenti dell’evento. Questo intervallo è chiamato periodo di ritorno T_R.
Il periodo di ritorno e la frequenza sono uno l’inverso dell’altro.

Chiediamoci ora la probabilità che l’evento casuale non si verifichi nel periodo di riferimento. La relazione di Poisson per nessun evento diventa (zero fattoriale vale 1):

\displaystyle p_{0}=\frac{(\lambda V_R)^0}{0!}e^{-\lambda V_R}=e^{-\lambda V_R}.

Il complemento ad uno di p_0 è la probabilità che almeno un evento si verifichi nel periodo considerato, in formule:

\displaystyle p_{n \geq 1}=p_{VR}=1-e^{-\lambda V_R}.

Questa relazione ci permette di ottenere la relazione tra il periodo di ritorno e la probabilità di superamento, fissato il periodo di riferimento. Con qualche semplice passaggio:

\displaystyle T_R=-\frac{V_R}{\log(1-p_{VR})}.

Le curve di frequenza/probabilità

Mettiamo su un grafico semi-logaritmico, quello che abbiamo appena trattato con il pacchetto PGFPlots, un componente software utilizzabile all’interno di un documento LaTeX, con l’ausilio di Gnuplot per sopperire alle capacità di calcolo di TeX.
Operativamente, occorre scrivere il testo sintatticamente corretto (il codice) che successivamente viene elaborato da pdflatex per produrre il grafico nel formato pdf (fate click sull’immagine sottostante per scaricare il risultato).

Probabilità poissoniana di un evento puramente casuale

Dal punto di vista della dotazione software, occorre una distribuzione TeX in configurazione abbastanza completa e recente (TeX Live 2010), gnuplot ed (opzionale) la suite Image Magick per tradurre il pdf in un file immagine. Tutti i programmi citati sono liberi e disponibili per vari sistemi operativi, compreso Windows.
Una volta copiato il codice in un file di testo, chiamato per fissare le idee pvr.tex, la sequenza completa dei comandi da terminale sarà:

$ pdflatex -shell-escape pvr
$ pdfcrop --margin=3 pvr.pdf pvr.pdf
$ convert -density 120 pvr.pdf pvr.png

Un breve commento al codice: si può arrivare abbastanza velocemente a scriverlo con un po’ di lavoro di rifinitura come vedete dalla sfilza di opzioni passate all’ambiente semilogxaxis. Una volta che si sono decisi i dettagli del grafico, risulta molto semplice plottare le funzioni. Basta costruire il comando \addplot gnuplot dando le opzioni di identificazione (id) e l’intervallo di dominio e scrivere l’espressione della funzione voluta. Anzi, a ben vedere si tratta di un’ottima interfaccia a gnuplot, per costruire grafici in formato vettoriale (pdf).

\documentclass{minimal}
\usepackage{pgfplots}
\thispagestyle{empty}

\begin{document}
\begin{tikzpicture}
\begin{semilogxaxis}[
    xlabel={Frequenza media nel periodo, $\lambda=1/T_R$},
    ylabel={Probabilit\'a per $n\geq1$, $p_{V_R}$},
    ytick={0,0.2,0.4,0.6,0.8,1},
    yticklabels={0\%,20\%,40\%,60\%,80\%,100\%},
    grid=both,
    xmin=0.001,
    xmax=0.1,
    ymin=0,
    ymax=1,
    no markers,
    line width=1pt,
    width=15cm,
    height=9cm,
    smooth,
    legend pos=north west]
    
\addplot gnuplot[id=pvriv,domain=0.001:0.1] {1-exp(-x*200)};
\addlegendentry{$V_R = 200$ anni};

\addplot gnuplot[id=pvriii,domain=0.001:0.1]{1-exp(-x*100)};
\addlegendentry{$V_R = 100$ anni};

\addplot gnuplot[id=pvrii,domain=0.001:0.1] {1-exp( -x*50)};
\addlegendentry{$V_R = 50$ anni};

\addplot gnuplot[id=pvri,domain=0.001:0.1]  {1-exp( -x*10)};
\addlegendentry{$V_R = 10$ anni};

\end{semilogxaxis}
\end{tikzpicture}
\end{document}

Probabilità dell’evento sismico

Il terremoto non è un evento puramente casuale per il semplice fatto che il susseguirsi degli eventi sismici di una stessa regione, narra la storia evolutiva delle strutture di faglia e quindi non sono eventi indipendenti uno dall’altro ne eventi puramente casuali.

Tuttavia la nuova normativa tecnica D.M. 14 gennaio 2008, fa l’assunzione che la probabilità di accadimento del terremoto sia poissoniana, usufruendo della semplicità matematica del modello ma commettendo un errore considerato comunque accettabile.
Infatti in una stessa regione, per intervalli di tempo dell’ordine di qualche migliaia d’anni, è ragionevole supporre che le faglie attive continuino ad evolversi costantemente nel tempo mantenendo immutate le velocità relative ed i meccanismi d’interazione.
Nel lungo periodo invece i mutamenti di placche e microplacche della crosta comportano che le faglie aumentino o diminuiscano la loro pericolosità. Nel futuro ci attenderà un assetto completamente mutato, ma per raggiungerlo i passi sono talmente piccoli che possiamo approssimarli a nessun movimento.

Allora possiamo rispondere alla domanda: qual’è la probabilità che almeno un evento sismico con periodo di ritorno di 475 anni si verifichi nell’intervallo di 50 anni (intervallo in cui una costruzione può dirsi efficiente)?

\displaystyle p_{VR}=1-e^{-50/475}=0.10

La risposta è quindi il 10% (corrisponde allo Stato limite di salvaguardia della vita per il periodo di riferimento di 50 anni), ed è chiamata nel linguaggio della norma probabilità di superamento (o di eccedenza).
Terremoti più intesi avranno un tempo di ritorno più lungo e di conseguenza probabilità più piccole di verificarsi nel periodo di riferimento, ed è appunto questo il fenomeno che misuriamo con la legge delle probabilità di Poisson.

Conclusioni: le norme tecniche e la ricerca

Le nuove normative tecniche (Eurocodici ed NTC 2008) mettono in risalto ancor di più la tendenza non tanto ad essere prestazionali nell’approccio alla sicurezza, ma soprattutto a discendere direttamente ed esclusivamente dalle trattazioni scientifiche dei problemi. In conseguenza è possibile ritrovare l’origine e le motivazioni nascoste delle prescrizioni e ciò rende il processo normativo maggiormente trasparente, chiarendo quali ipotesi sono state assunte ed il loro contesto di validità.

Con l’avanzamento delle conoscenze, le norme tecniche divengono sempre più aderenti alla complessità dei fenomeni e questo esige una sempre maggiore preparazione di base da parte dei progettisti e, poiché la ricerca scientifica è un fatto internazionale, tendono ad essere sempre più somiglianti una con l’altra.

Dunque l’ampliarsi di quelle che sono le capacità di fare, in altri termini l’ampliarsi dell’ingegneria, induce di conseguenza alla specializzazione dei progettisti, a cui è affidato il difficile compito di mantenere l’equilibrio tra profondità ed ampiezza della conoscenza, ed un uniformarsi delle normative che svolgono una vera e propria selezione naturale dei risultati delle ricerche prodotte nel mondo.

Diagramma d’acciaio


Caratterizzare le prove di trazione

Spesso un diagramma presenta i dati molto più efficacemente dei corrispondenti valori numerici, dunque l’idea di graficare le prove a trazione delle barre in acciaio per armatura.
Si tratta delle prove secondo lo standard UNI EN 10002-1:2004, che si fanno eseguire in un laboratorio autorizzato, per la certificazione dei materiali impiegati nella costruzione della struttura in calcestruzzo armato. Tali prove sono caratterizzate dal valore della tensione di snervamento, dalla percentuale di allungamento a rottura e della tensione di rottura (riferimento norma D.M. 14/01/2008).

Di solito il certificato di prova che giunge dal laboratorio, non include un diagramma della prova ma solo i parametri principali. Se tuttavia assumiamo che l’allungamento allo snervamento abbia un valore dello 0.2%, un diagramma di caratterizzazione della prova si può disegnare congiungendo con linee rette i punti di snervamento e rottura nel classico piano (tensione,deformazione).

Ulteriori informazioni possono essere scaricate dal sito del consorzio Sismic.

A test for reinforced steel bar drawing by the pgfplots package

Un diagramma d’acciaio

Potevamo farci sfuggire l’occasione? Naturalmente no!
Affidiamoci al pacchetto LaTeX di turno, in questo caso il meraviglioso pacchetto pgfplots, per ottenere un diagramma d’acciaio di alta qualità.

Il risultato visibile nell’immagine riportata è scaricabile in formato pdf (fai click su questo link), dimostra che in breve tempo, consultando il manuale di pgfplots, sono stato in grado di ottenere tutte le personalizzazioni del grafico che desideravo.
Ecco il codice LaTeX completo pronto per la compilazione:

\documentclass[a5paper,landscape]{article}
\usepackage[italian]{babel}
\usepackage[T1]{fontenc}

\usepackage{amssymb}
\usepackage{pgfplots}
\usepackage[decimalsymbol=comma]{siunitx}
\usepackage[margin=10mm]{geometry}

\thispagestyle{empty}

\begin{document}

\begin{tikzpicture}
% defining personal drawing style
\pgfplotsset{blue style/.style={line width=1pt,mark=x,color=blue}}
\pgfplotsset{red style/.style={line width=1pt,mark=x,color=red}}
\pgfplotsset{green style/.style={line width=1pt,mark=x,color=green}}

\begin{axis}[legend pos=south east,
             font=\footnotesize,
             ymin=0,ymax=730,xmin=0,xmax=14.3,
             xlabel=Allungamento (\%),ylabel=\si{N/mm^2},
             grid=major,
             width=15cm,height=9cm]
             
             
% diametro 8
\addplot[blue style] coordinates {(0,0)(0.2,584.0)(8.3,658.4)};
\addplot[blue style] coordinates {(0,0)(0.2,569.9)(11.4,656.6)};
\addplot[blue style] coordinates {(0,0)(0.2,573.9)(8.0,657.0)};
%
% diametro 10
\addplot[red style] coordinates {(0,0)(0.2,497.6)(13.3,592.0)};
\addplot[red style] coordinates {(0,0)(0.2,501.0)(11.5,595.2)};
\addplot[red style] coordinates {(0,0)(0.2,501.4)(12.0,597.9)};
%
% diametro 12
\addplot[green style] coordinates {(0,0)(0.2,545.4)(12.5,633.4)};
\addplot[green style] coordinates {(0,0)(0.2,558.0)(9.8,647.7)};
\addplot[green style] coordinates {(0,0)(0.2,558.5)(10.5,651.5)};
%
\legend{\(\varnothing{} 8\) arm. platea,,,
        \(\varnothing{} 10\) arm. platea,,,
        \(\varnothing{} 12\) arm. platea}
\end{axis}
\end{tikzpicture}

\end{document}

Bel risultato vero? Abbiamo fatto uso anche di stili di tracciamento personalizzati, grazie alla modernità del linguaggio di PGF.

Alla prossima prova d’acciaio allora! Ciao.

Watermark di precisione


Cos’è un watermark

Si tratta di una sorta di timbro che viene sovrapposto alle pagine di un documento.
Per ragioni di performance che non vi sto a spiegare, recentemente ho avuto la necessità di sovrapporre un watermark a ciascuna pagina di un file in formato PDF.
Questo post mostra come ciò si possa fare mantenendo la precisione vettoriale, utilizzando i programmi di una distribuzione TeX.

Creare una pagina di mark

(Avete una distribuzione recente di LaTeX installata sul vostro sistema vero?)
Per prima cosa creiamo il watermark, ovvero un file pdf di una sola pagina che contiene il timbro, per esempio una riga che dall’angolo in basso a sinistra della pagina, collega quello in alto a destra.

Per ottenere il watermark, compiliamo il seguente codice:

%
% creating a mark test page:
% copy this code in a text file named watermark.tex
% and compile with the command "pdflatex watermark"
%
\documentclass[a4paper]{minimal}
\usepackage[margin=0pt]{geometry}
\usepackage{tikz}
\begin{document}
\noindent\tikz
\draw (0,0)--(210mm-0.4pt,297mm-0.4pt);
\end{document}

Apporre il sigillo

Ma come apporre il sigillo appena creato?
L’idea è quella di caricare ciascuna pagina del nostro documento (chiamiamolo mydoc.pdf) in un file elaborato con pdflatex tramite il pacchetto pdfpages, ed inserirvi il watermark per ciascuna pagina creata con il pacchetto everypage, scritto da Sergio Callegari (che ringrazio per la sua risposta ad alcuni miei quesiti sul pacchetto).

Da come l’ho descritta sembra un mix di confusione, ma il codice seguente chiarirà più di mille parole cosa intendo:

%%%
% compile this file i.e. named output.tex
% with the command "pdflatex output"
%%%
\documentclass[a4paper]{minimal}
\usepackage{graphicx}
\usepackage{everypage}
\usepackage{pdfpages}

\AddEverypageHook{%
  % traslate the origin
  \vskip -1in\hskip -1in%
  % and with same TeX tricks write the watermark
  \vbox to 0pt{%
     \hbox to 0pt{\includegraphics{watermark}\hss}%
  }\vss%
}

\begin{document}
% the mydoc.pdf file must be present in the same directory
% with the watermark.pdf too
%
\includepdf[pages=-]{mydoc}
\end{document}
%%%

Fatto!

Come funziona

Ad ogni pagina del documento LaTeX, l’effetto del comando \AddEverypageHook del pacchetto everypage, è quello di sovrapporre il file watermark.pdf. Il contenuto del documento vero e proprio consiste nell’istruzione \includepdf[pages=-]{mydoc} (pacchetto pdfpages), che inserisce tutte le pagine del nostro documento, che naturalmente deve essere disponibile come file su disco nella directory prescelta.

Utile per la comprensione è leggersi le guide dei pacchetti utilizzati.
Grazie per l’attenzione ed alla prossima.

Variabili dimensionali in LaTeX


Questa mi sembra una buona idea

Naturalmente non so se si tratta di una cosa utile, ma se per caso lo fosse? Meglio non correre rischi e parlarne ;-).

Variabili?

In LaTeX è possibile gestire registri dimensionali per rappresentare per esempio larghezza e altezza di pagina, valore dei margini, dell’interlinea del testo ecc…

La sintassi per la definizione e l’assegnazione di un nuovo registro dimensione è diversa in TeX ed in LaTeX, e noi, giusto per scrivere codice leggermente più veloce, useremo quella TeX:

\newdimen\mydim
\mydim=40pt
\advance\mydim by 5pt
Il registro vale \the\mydim.

Vorremmo invece poter lavorare in sintassi chiave=valore, come con un linguaggio di programmazione, implementando in LaTeX quello che lì avremmo chiamato espressione. Ci avvaremo di un nuovo comando che chiameremo \dim:

\dim{a=40pt}% nuova variabile inizializzata a 40pt
\dim{a=\a+5pt}% la variabile viene incrementata di altri 5pt

% oppure anche:
\dim{a=40pt,a=\a+5pt}

Ebbene si può fare, anche se si corre qualche rischio, utilizzando i pacchetti xkeyval e etextools.

Si, variabili!

Provate a compilare questo codice:

\documentclass{report}
\usepackage{etextools}
\usepackage{xkeyval}
\usepackage{tikz}

\makeatletter
   \DeclareCmdListParser{\parser@csv}{,}
   \def\dim#1{%
      \setkeys*{dimfam}{#1}
      \ifx\XKV@rm\empty
         \setrmkeys{dimfam}%
      \else
         \parser@csv[\definesingle@key]{\XKV@rm}
         \setrmkeys{dimfam}%
      \fi
   }
   %
   \def\definesingle@key#1{\make@newkey#1\@nil}
   \def\make@newkey#1=#2\@nil{%
      % creo la nuova dimensione
      \expandafter\newdimen\csname #1\endcsname
      %
      % creo la chiave ad essa associata
      \define@key{dimfam}{#1}{%
         \csname #1\endcsname=\dimexpr##1\relax
      }
   }
\makeatother

\begin{document}
\dim{a=10mm,b=30mm}a=\the\a;b=\the\b.

\dim{a=78mm,b=\a/2,c=\b/2}a=\the\a;b=\the\b;c=\the\c.

\tikz
\draw (0,0) -- (\c,0) -- (\c,\c)--(\b,\b)--(\b,0)--(\a,0)--(\a,\a);
\dim{a=38mm,b=\a/2,c=\b/2}

\tikz
\draw (0,0) -- (\c,0) -- (\c,\c)--(\b,\b)--(\b,0)--(\a,0)--(\a,\a);
\end{document}

Nel codice ho poi utilizzato PGF (comando \tikz), per mostrarvi come posso far dipendere un disegno dal valore di variabili (ex registri) dimensionali.

Alla prossima.

La tabellina pitagorica con PGF


Download articolo in PDF per la stampa

Motivazione

Recentemente un utente del forum del GuIT chiedeva lumi per la composizione in LaTeX di una tabella relativa alla tabellina pitagorica.

Ho provato a fornirgli una riposta fino a che i guru di TeX hanno risolto, ma mi rimaneva da realizzare un idea: disegnare la tabella con il pacchetto grafico PGF.

La tabellina pitagorica compilata in LaTeX con PGF

La tabellina pitagorica compilata in LaTeX con PGF

Disegno della griglia

Per disegnare la griglia della tabella pitagorica utilizziamo il comando \draw specificando un quadrato di 10 unità di lato (se non si specificano unità PGF intenderà centimetri), ecco il comando:

\draw (0,0) grid (10,10);

Riempimento della tabella

Per inserire i numeri nelle celle, risultato del prodotto tra il numero della colonna per quello della riga, basta scrivere due cicli \foreach; nidificati che eseguono il disegno di un nodo al cui centro è composto il testo del numero.

Abbiamo quindi due variabili \x ed \y. Al primo ciclo entrambe avranno valore 1 pertanto per individuare il centro del quadratino occorre dare molto comodamente l’opzione shift di (-0.5,-0.5) che applicate al punto (1,1) fornirà appunto le coordinate (0.5,0.50) ovvero il centro della prima casellina.

Ho copiato, questo si, il codice TeX per calcolare il risultato dell’espressione x * (11-y) che da il valore del prodotto in tabellina, poiché PGF risolve eventuali espressioni solo se si tratta di coordinate mentre per il testo da associare al nodo non effettua alcun parsing:

\foreach \x in {1,2,3,...,10}
\foreach \y in {1,2,3,...,10}
\draw[shift={(-.5,-.5)}] (\x ,\y) node 
                 {\number\numexpr\x*(11-\y)\relax};

Mettendo insieme il codice ecco il primo risultato che da la tabellina pitagorica con griglia di 1cm x 1cm:

% copiare ed incollare questo codice in un file
% testuale con estensione .tex, poi compilarlo con pdflatex
\documentclass[a4paper]{article}

\usepackage{tikz}
\pagestyle{empty}

\begin{document}

\begin{tikzpicture}
% grid definition
\draw (0,0) grid (10,10);

% fill numbers
\foreach \x in {1,2,3,...,10}
\foreach \y in {1,2,3,...,10}
\draw[shift={(-.5,-.5)}] (\x ,\y) node
                 {\number\numexpr\x*(11-\y)\relax};
\end{tikzpicture}

\end{document}

Completando e raffinando un po’ il codice, si ottiene il seguente listato, dove la cosa più importante è l’aggiunta dell’opzione scale all’ambiente tikzpicture che scala tutto tranne che il testo assegnato agli oggetti nodo, pertanto modificando un unico parametro si può regolare le dimensione della tabella.

% copiare ed incollare questo codice in un file
% testuale con estensione .tex, poi compilarlo con pdflatex
\documentclass[a4paper]{article}

\usepackage{tikz}
\pagestyle{empty}

\begin{document}

\begin{tikzpicture}[scale=0.675]
% grid definition
\draw (-1,0) grid (10,10);
\draw (0,10) grid (10,11);
\draw[line width=1pt, color=blue] (0,0) rectangle (10,10);

% fill numbers
\foreach \x in {1,2,3,...,10}
\foreach \y in {1,2,3,...,10}
\draw[shift={(-.5,-.5)}] (\x ,\y) node
                 {\number\numexpr\x*(11-\y)\relax};

% fill first row
\foreach \x in {1,2,3,...,10}
\draw[shift={(-.5,-.5)}] (\x , 11) node {\x};

% fill first column
\foreach \y in {1,2,3,...,10}
\draw[shift={(-.5,-.5)}] (0, 11-\y) node {\y};
\end{tikzpicture}

\end{document}

Il risultato è visibile nell’immagine iniziale, mentre per ottenere il risultato finale in formato PDF scontornato basta fare un click 😉 .

Alla prossima.

Una scacchiera per PGF


Senza nulla togliere ai pacchetti LaTeX dedicati agli scacchi, vorremmo disegnare una scacchiera con il pacchetto grafico PGF, giusto per metterne alla prova la sintassi.

Devo dire che il pacchetto di Till Tantau passa a pieni voti il test…

chessboard

chessboard

Ripasso dei comandi

Innanzi tutto ricordiamo che per disegnare un quadrato in PGF occorre fornire le coordinate del vertice in basso a sinistra e quelle del vertice in alto a destra, cosa piuttosto naturale, dunque per disegnare il primo quadrato della scacchiera (che deve essere scuro) basta dare il comando:

\tikz\draw (0,0) rectangle (1,1);

Ricordiamo che se non sono specificate unità di misura viene assunto il centimetro come default, e che se vogliamo riempire il quadrato è sufficiente utilizzare il comando \filldraw (ricordatevi dei punti e virgola finali previsti alla fine dei comandi da PGF).

A questo punto la soluzione migliore che mi è venuta in mente è quella di un triplo ciclo \foreach, uno interno all’altro, per il disegno in senso orizzontale dei quattro case neri, in senso verticale ed in senso diagonale.

I tre cicli nidificati

Ecco il primo ciclo che disegna i quattro case della prima fila orizzontale:

\tikz\foreach \x in {0,2,4,6}
\filldraw (\x,0) rectangle (\x+1,1);

Come potete notare i quadrati hanno lato unitario, e le coordinate del secondo vertice sono ricavate utilizzando l’operazione matematica di somma. Abbiamo quindi a disposizione un costrutto degno di un linguaggio di programmazione di alto livello.

Per sviluppare anche in verticale i quadrati nidifichiamo il primo ciclo in un secondo aggiornando le variabili nel comando \filldraw:

\tikz
\foreach \y in {0,2,4,6}
\foreach \x in {0,2,4,6}
\filldraw (\x,\y) rectangle (\x+1,\y+1);

La cosa sta diventando interessante, specie se aggiungiamo il terzo ciclo che fa uso di una notevole opzione che possiamo passare ai comandi di disegno: la traslazione tramite un vettore di spostamento. Infatti se osserviamo i case della scacchiera costruiti finora, la seconda metà non è altro che la prima traslata di 1 in orizzontale ed 1 in verticale ovvero del vettore (1,1). Benissimo. Basta dunque far disegnare i case con uno spostamento (0,0) una volta ed una seconda volta con uno spostamento di (1,1). La chiave da dare è chiamata shift:

\tikz
\foreach \d in {0,1}
\foreach \y in {0,2,4,6}
\foreach \x in {0,2,4,6}
\filldraw[shift={(\d,\d)}] (\x,\y) rectangle (\x+1,\y+1);

Basta adesso aggiungere una griglia e diminuire un poco le dimensioni dei quadrati per ottenere il codice finale e completo, pronto da compilare con pdflatex:

\documentclass[a4paper]{article}

\usepackage{tikz}
\pagestyle{empty}

\begin{document}
   \begin{tikzpicture}
      \draw (0,0) grid (8,8);
      \foreach \d in {0,1}
         \foreach \y in {0.04,2.04,4.04,6.04}
             \foreach \x in {0.04,2.04,4.04,6.04}
                  \filldraw[shift={(\d,\d)}] (\x,\y) rectangle (\x+0.92,\y+0.92);
   \end{tikzpicture}
\end{document}

Click for download pdf document of chessboard.

Ciao, alla prossima.

La retta di Eulero


Cos’è la retta di Eulero

Qualche tempo fa leggendo la rubrica Il matematico impertinente di Piergiorgio Odifreddi sono venuto a conoscenza della retta di Eulero. L’articolo si trova sul numero di Maggio 2009 del mensile Le Scienze, ed è intitolato Dove i greci non arrivarono.

Il grande matematico Eulero si accorse nel 1767 che in un triangolo i tre punti notevoli baricentro, circocentro e ortocentro sono allineati. Da allora tale retta è conosciuta come la retta di Eulero. Naturalmente la retta è definita sempre tranne che per il triangolo equilatero per il quale i tre punti notevoli coincidono.

Per approfondimenti potete visitare la pagina di MathWorld, formidabile enciclopedia matematica ed il portale di Wikipedia.

Disegnare la retta di Eulero

Questa sorprendente proprietà dei triangoli euclidei, certamente non l’unica ad essere poco conosciuta proprio perché scoperta in tempi recenti e non dai greci, è un utile esercizio per completare il precedente post dal titolo Disegnare il baricentro del triangolo, utilizzando al solito il pacchetto grafico PGF in LaTeX.

Ortocentro

L’ortocentro è il punto O intersezione delle altezze del triangolo. Dato quindi un vertice del triangolo quello che serve è determinarne la proiezione normale sul lato opposto. Chiameremo Ao il punto proiezione del vertice A sulla retta per B e C. Tale punto può essere calcolato in PGF utilizzando la libreria calc: vediamone la sintassi:

Se vi ricordate, le coordinate del punto di mezzo di un segmento AB si calcolavano con la sintassi:

($(A)!0.5!(B)$)

Detto E un punto da proiettare sulla retta AB, la sintassi di calcolo prevede di inserire le coordinate di E che si esprimono tra parentesi tonde, tra punti esclamativi, dunque le coordinate della proiezione normale diventano:

($(A)!(E)!(B)$)

Applicato al caso del triangolo le altezze possono essere disegnate così:

% orthocenter
\coordinate (ao) at ($(B)!(A)!(C)$);
\coordinate (bo) at ($(A)!(B)!(C)$);
\coordinate (co) at ($(A)!(C)!(B)$);

\draw (A) -- (ao);
\draw (B) -- (bo);
\draw (C) -- (co);

Anche se è possibile accorpare la creazione del punto proiezione con il disegno dell’altezza scrivendo per esempio per il vertice A:

% compact syntax
\draw (A) -- ($(B)!(A)!(C)$) coordinate (ao);

non faremo uso di questa notazione perché meno leggibile.

Circocentro

Il circocentro, punto d’intersezione degli assi dei lati del triangolo, è il più complesso da tracciare. Con riga e compasso avremo tracciato due cerchi di raggio uguale con centro gli estremi del segmento per trovare due punti intersezione delle circonferenze appertenenti al’asse. Anche se è possibile procedere allo stesso modo con PGF, è preferibile abbreviare la strada utilizzando l’operazione di rotazione:

se M è il punto di mezzo del segmento AB allora un secondo punto dell’asse di AB è il punto che si ottiene ruotando un estremo di 90° con centro in M. In PGF la sintassi è:

($(M)!1!90:(B)$)

che significa ruota il segmento MB su M di 90° (nel verso antiorario) ed aumenta la lunghezza del segmento risultante a partire da M del fattore tra punti esclamativi.

Dunque dai punti dell’asse delle mezzerie dei lati (chiamati a, b, c nel nostro caso), trovati i punti ortogonali per rotazione possiamo tracciare gli assi, così:

% circumcenter
% a, b, c medium point
% ax, bx, cx new point on axis
\coordinate (ax) at ($(a)!1!90:(C)$);
\coordinate (bx) at ($(b)!1!90:(A)$);
\coordinate (cx) at ($(c)!1!90:(B)$);

\draw (a) -- (ax);
\draw (b) -- (bx);
\draw (c) -- (cx);

Ora sappiamo come tracciare la retta di Eulero del triangolo.

Tracciamento finale

Tenete conto che il codice completo sottostante adotta un diverso colore delle linee di costruzione dei tre punti notevoli e regola in aumento lo spessore delle linee importanti come i lati del triangolo e la retta di Eulero stessa.

Eccone il listato con sottostante risultato scaricabile nel formato PDF:

\documentclass[12pt,a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\pagestyle{empty}
\begin{document}

\begin{tikzpicture}
% triangle
\coordinate[label=left:{$A$}]  (A) at (  0, 0  );
\coordinate[label=below:{$B$}] (B) at (  6.5,-3.5);
\coordinate[label=above:{$C$}] (C) at (5, 7);

\draw[very thick] (A) -- (B) -- (C) -- cycle;

\foreach \point in {A,B,C}
\fill [blue] (\point) circle (1.6pt);

% gravity center (centroid)
\node [fill=red,inner sep=0.8pt] (a) at ($ (C) !.5! (B) $) {};
\draw[red] (A) -- (a);
\node [fill=red,inner sep=0.8pt] (b) at ($ (A) !.5! (C) $) {};
\draw[red] (B) -- (b);
\node [fill=red,inner sep=0.8pt] (c) at ($ (A) !.5! (B) $) {};
\draw[red] (C) -- (c);

\coordinate [label=above right:{$G$}] (G) at (intersection of A--a and B--b);
\fill [red] (G) circle (2pt);

% orthocenter
\coordinate (ao) at ($(B)!(A)!(C)$);
\coordinate (bo) at ($(A)!(B)!(C)$);
\coordinate (co) at ($(A)!(C)!(B)$);

\draw[orange] (A) -- (ao);
\draw[orange] (B) -- (bo);
\draw[orange] (C) -- (co);

\coordinate [label=above:{$O$}] (O) at (intersection of A--ao and B--bo);
\fill [orange] (O) circle (2pt);

% circumcenter
\coordinate (ax) at ($(a)!1!90:(C)$);
\coordinate (bx) at ($(b)!1!90:(A)$);
\coordinate (cx) at ($(c)!1.5!90:(B)$);

\draw[green] (a) -- (ax);
\draw[green] (b) -- (bx);
\draw[green] (c) -- (cx);

\coordinate[label=below:{$M$}] (M) at (intersection of a--&gt;ax and b--bx);
\fill [green] (M) circle (2pt);

% Euler line
\coordinate (e1) at ($(M)!1.5!(O)$);
\coordinate (e2) at ($(O)!1.5!(M)$);
\draw[very thick, blue] (e1) -- (e2);
\end{tikzpicture}

\end{document}
Euler Line

Euler Line

Curiosi per la circonferenza?

Potevamo rinunciare a tracciare la circonferenza circoscritta? Conosciamo infatti il centro che abbiamo chiamato alla fine M, e ben tre punti da cui passa, ovvero i vertici del triangolo.

Ebbene con una libreria aggiuntiva PGF da caricare nel preambolo con \usetikzlibrary{through} basta scrivere il comando:

\node (cc) at (M) [draw,circle through=(A)] {};

Ciao, ed alla prossima…

%d blogger hanno fatto clic su Mi Piace per questo: