lorenzo.pantieri” post=82804Ciao a tutti. Anche se in questo periodo non sto studiando LaTeX (mi limito a usarlo per i miei documenti), ho (finalmente, dirà qualcuno…) maturato la consapevolezza che imparare il disegno programmato con LaTeX sia essenziale, se si desidera un documento finito di altissima qualità.
Appena avrò tempo a disposizione lo dedicherò a imparare TikZ. L’Arte del futuro colmerà l’attuale, vistosa, lacuna e conterrà un corposo capitolo su TikZ.
Per il momento, però, ho bisogno di voi.
Qualcuno sa suggerirmi il codice per riprodurre questo disegno?
Grazie anticipate,
L.
Ottima domanda… disegnare oggetti 3D con TikZ non è affatto facile, ma con un po’ di ingengo si possono fare cose interessanti.
Il problema principale che vedo è come fare per dividere la piramide all’interno: inserire le etichette o colorare lo sfondo sono cose del tutto secondarie una volta effettuata la divisione. A tal proposito ho semi-riciclato il codice usato in hf-tikz per “contraddistinguere” punti di un segmento (basato a sua volta su How to draw tangent line of an arbitrary point on a path in TikZ): quello presentato qui è meno automatico perché si deve inserire il nome del marcatore oltre che alla posizione. Ogni segmento, di qualsiasi lunghezza, può essere contrassegnato con la libreria apposita con posizioni che vanno da 0 a 1 (inizio e fine del segmento rispettivamente) e quel codice sfrutta proprio questa filosofia.
Il codice: `
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds,calc,decorations.markings}
% Codice basato su hf-tikz e la risposta di Jake in:
% http://tex.stackexchange.com/questions/25928/how-to-draw-tangent-line-of-an-arbitrary-point-on-a-path-in-tikz/25940#25940
\newif\ifshowmarkers
\pgfkeys{/tikz/show markers/.is if=showmarkers}
\pgfkeys{/tikz/show markers=false}
\pgfkeys{/tikz/.cd,%
marker color/.initial=blue,
marker color/.get=\colmarker,
marker color/.store in=\colmarker,
marker size/.initial=1pt,
marker size/.get=\sizemarker,
marker size/.store in=\sizemarker,
}
\tikzset{
mark at/.style args={#1 named #2}{
decoration={
markings,
mark=
at position #1
with
{
\coordinate (marker point-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (0pt,0pt);
\coordinate (marker unit vector-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (1,0pt);
\coordinate (marker orthogonal unit vector-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (0pt,1);
\node[coordinate] (#2) at (0pt,0pt){};
\ifshowmarkers% conditional to make them appear just when invoked
\draw[draw=none,fill=\colmarker,radius=\sizemarker] (0,0) circle ;
\else
\relax
\fi
}
},
postaction=decorate
},
use marker id/.style={
shift=(marker point-#1),
x=(marker unit vector-#1),
y=(marker orthogonal unit vector-#1)
},
use marker id/.default=1,
}
\begin{document}
\begin{tikzpicture}[marker size=2pt]
\draw[show markers,mark at=0.4 named x1,mark at=0.675 named x2] (0,0) –(2,5);
\draw[show markers,mark at=0.4 named y1,mark at=0.675 named y2] (3.25,-0.25) –(2,5);
\draw[show markers,mark at=0.4 named z1,mark at=0.675 named z2] (4.5,0.25) –(2,5);
% Base
\draw(0,0)–(3.25,-0.25)–(4.5,0.25);
% Connessioni intermedie:
% meglio fare pezzo per pezzo così da annotare il punto intermedio
% della piramide in luce per inserire le percentuali
\draw[mark at=0.5 named inter-x1] (x1)–(y1);
\draw[mark at=0.5 named inter-x2] (x2)–(y2);
\draw(z1)–(y1);
\draw(z2)–(y2);
% Etichette con percentuali
\node[above=0.5cm,rotate=-3.5] at (inter-x1) {20-30\%};
\node[below=0.5cm,rotate=-3.5] at (inter-x1) {60-70\%};
\node[above=0.1cm,rotate=-3.5] at (inter-x2) {10\%};
% Coloriamo la piramide usando le coordinate note
\begin{scope}[on background layer]
\fill[blue!30!cyan!30](x1) — (y1) — (3.25,-0.25)–(0,0)–cycle;
\fill[blue!50!cyan!40](z1) — (y1) — (3.25,-0.25)–(4.5,0.25)–cycle;
\fill[green!30!lime!30](x2) — (y2) — (2,5) — cycle;
\fill[green!60!lime!40](z2) — (y2) — (2,5) — cycle;
\tikzset{etichette/.style={
inner sep=0pt,
anchor=east,
align=center,
font=\footnotesize,
}
}
% Altre etichette
\path let \p1=(0,0), \p2=(x1) in
node[etichette,text width=2cm]
at (\x1,0.5*\y2) {Metabolismo basale};
\path let \p1=(x1), \p2=(x2) in
node[etichette] at (\x1,0.8*\y2) {Attività Fisica};
\path let \p1=(x2), \p2=(2,5) in
node[etichette,text width=1.75cm] at (\x1,0.875*\y2) {TID termogenesi indotta degli alimenti};
\end{scope}
\end{tikzpicture}
\end{document}
` Nel disegno finale si rimuovano i [tt]show markers[/tt] usati come debug per capire dove i marcatori vengono posizionati.
Il risultato:
[attachment=619]Senzanome_2013-03-10.jpg[/attachment]
Questa è una grande idea per il prossimo tipo di diagramma in smartdiagram 😉
Ciao
Claudio
