Risposte nei forum create
-
AutoreRisposte
-
::
ivan” post=99428In pratica il grafico non deve essere più largo di 160 mm perché deve essere messo ruotato in una pagina alta 180 mm. Ho modificato il tuo codice con width=50cm e composto le etichette in corpo \tiny.
Allora dovresti usare semplicemente [tt]width=16cm[/tt] e cancellare la riga [tt]x post scale[/tt]. Vedi come viene piccolo!
ivan” post=99428La cosa mi rincuora.
Il brutto è che io stesso tendo a dimenticarmelo. Si potrebbe aggiungere automaticamente una riga inutile in fondo alla tabella, per evitare di farlo a mano.
ivan” post=99428Nel frattempo mi è sorta un’altra curiosità. Poniamo di voler scrivere le x e le y non dentro le barre ma appena sotto, più vicine ai numeri.
Se scrivo
`\path [anchor=base,yshift=-1mm]`
me le sposta in basso di 1mm. Ma se metto -2mm non le vedo più…Il motivo te l’ha spiegato @cfiandra. Aggiungi l’opzione
`clip=false` all’ambiente axis.
::
Prova questo codice:
`% !TEX TS-program = XeLaTeX
\documentclass{standalone}\usepackage{mathspec}
\setprimaryfont[Numbers={Proportional},Scale=MatchLowercase]{Junicode}\usepackage{pgfplotstable}
\pgfplotsset{compat=1.11}
\pgfplotstableset{col sep=comma}% ho rimosso la tabella per sintesi
\pgfplotstableread{chart.csv}\loadedtable% memorizza il numero di righe della tabella
\pgfplotstablegetrowsof{\loadedtable}
\pgfmathsetmacro{\nrighe}{\pgfplotsretval-1}% contiene gli indici degli elementi non nulli della colonna a
\newcommand{\extraindici}{%
\foreach \i in {0,…,\nrighe} {%
\pgfplotstablegetelem{\i}{a}\of\loadedtable%
\ifnum\pgfplotsretval>0
\i,%
\fi%
}%
\pgfmathparse{int(\nrighe)}%
\pgfmathresult%
}% contiene le etichette degli elementi non nulli della colonna a
\newcommand{\extravalori}{%
\foreach \i in {0,…,\nrighe} {%
\pgfplotstablegetelem{\i}{a}\of\loadedtable%
\ifnum\pgfplotsretval>0
\pgfplotsretval,%
\fi%
}%
}\begin{document}
\begin{tikzpicture}
\begin{axis} [
ybar,
ybar interval,
width=140mm,
x post scale=10,
axis x line*=bottom,
axis y line=left,
grid=none,
xmin=0,
xmax=\nrighe,
ymin=20,
ymax=52,
xlabel=Pages and quires,
xlabel style={font=\bfseries},
xtick={0,2,…,\nrighe},
xtick pos=left,
xticklabels={119,…,200},
xticklabel style={rotate=90},
extra x ticks={0,16,32,36,52,68,84,100,116,132,141},
extra x tick labels={1,2,4,5,6,7,8,9,10,11},
extra x tick style={
major tick length=1.5cm,
every major tick/.append style=ultra thick,
xticklabel style={rotate=-90, yshift=5mm}
},
]
\addplot+ [fill=gray!50, draw=gray]
table [x expr=\coordindex, y expr=\thisrow{c}] {\loadedtable};
\pgfplotsinvokeforeach {0,2,…,\nrighe} {
\path [anchor=base] node at (#1+0.5,21) {x}
node at (#1+1.5,21) {y};
}
\end{axis}
\end{tikzpicture}
\end{document}`
Come avrai visto, ho creato due comandi che generano le liste da usare per le tacche supplementari, ma non sono riuscito a usarli perché ottengo degli errori. Se mostro la lista in un pdf e la copio nel codice va tutto bene, ma se scrivo il nome del comando ottengo degli errori. Se qualcuno è in grado di risolvere il problema, fa un piacere anche a me.Non hai pensato di usare due colori differenti per la x e la y e di aggiungere una legenda?
ivan” post=99402Il grafico dovrà andare (in verticale) in una gabbia alta (circa 150 mm). Non è fondamentale la lettura di ogni singola barra. Piuttosto serve vedere l’andamento complessivo.
Questo non l’ho capito: la larghezza del grafico deve essere inferiore a 15 cm e vuoi metterci 140 barre. Quindi, tolto lo spazio riservato alle etichette rimane circa 1 mm a barra! Come fai poi a inserire in 2 mm le etichette in corpo [tt]\LARGE[/tt]? 😕
Quando dici “serve vedere l’andamento complessivo” intendi dire che vorresti ridurre il numero di dati scegliendo delle opportune righe dalla tabella oppure che non importa mettere tutte le etichette?ivan” post=99402Tra l’altro non riesco a capire come mai se non metto l’ultima riga della tabella, l’ultima barra non viene disegnata.
Questo è un comportamento noto del pacchetto, anche se è veramente insulso.
Ciao
::
Grazie. Ho letto a suo tempo sia la guida GuIT (per prima), sia il manuale di etex. Il problema è nato dal fatto che il numero da confrontare è memorizzato in una macro di pgf e per questo volevo usare [tt]\numexpr[/tt] al posto di [tt]\dimexpr[/tt] seppure con [tt]\ifdim[/tt] per il confronto tra numeri reali. Vorrà dire che valuterò se sia più conveniente caricare il numero in una dimensione oppure utilizzare due [tt]\ifdim[/tt] annidati per i due valori opposti.Ciao
::
Parti da questo codice (parziale):
`\pgfplotstableread{chart.csv}\loadedtable% riscrive la colonna b cancellando le righe dispari
\pgfplotstablemodifyeachcolumnelement{b}\of\loadedtable\as\cell{%
\edef\cell{\ifodd\pgfplotstablerow\else\cell\fi}}\begin{document}
\begin{tikzpicture}
\begin{axis} [
x post scale=10,
y post scale=2,
ybar,
ybar interval, % <-- non accetta valori bar width=10pt, xmin=0, ymin=0, ymax=52, % <-- era 50 xtick pos=left, xticklabels from table={\loadedtable}{b}, x tick label style={rotate=90,anchor=east}, ] \addplot+ [draw=none] table [x expr=\coordindex, y expr=\thisrow{c}, col sep=semicolon]{\loadedtable}; \end{axis} \end{tikzpicture} \end{document}`ivan” post=993263) Si dovrebbe riportare in qualche modo le undici lettere della colonna a
sotto le etichette della colonna b, segnando la posizione con un filetto un po’ più spesso.Non ho capito cosa vuoi fare. Per sotto le etichette intendi “sotto scritte in orizzontale” oppure, considerando che le etichette sono ruotate, “a destra in verticale”? E poi cos’è quel filetto di cui parli?
ivan” post=993264) Migliorare il grafico, per esempio eliminando il contorno delle barre, diminuire il corpo delle etichette.
Il corpo delle etichette si può ridurre, ad esempio con`ticklabel style={font=\footnotesize},`ma a me sembrano già piccole così.
Ciao
::lorenzo.pantieri” post=99236In ogni caso, in mancanzi di altri input lascio \div, come nel grafico che ha prodotto Liverpool.
Lascia [tt]\div[/tt] e spiega che con il simbolo [tt]\div[/tt] vuoi indicare tutti i numeri interi compresi tra i due che lo circondano. Hai mai pensato di realizzare una tabella dei simboli all’inizio di ogni dispensa?
@OldClaudio, secondo Wikipedia la notazione più diffusa sarebbe \( [a..b] \), ma francamente mi sembra solo un’opinione personale. Altra notazione, che però ha il difetto di non essere compatta, è \( \{a,…,b\} \).
::
Non c’è sufficiente spazio per inserire quelle etichette in modo non ambiguo in un grafico che occupa metà pagina, perciò ti consiglio di inclinarle:
`\begin{tikzpicture}[font=\small]
\begin{axis}[ybar,ymin=0,ymax=17,%enlargelimits,
height=6.5cm,
ymajorgrids=true,
xlabel={Altezza in cm},
ylabel={Numero di alunni},
symbolic x coords={
$150\div154$, $155\div159$, $160\div164$, $165\div169$,
$170\div174$, $175\div179$, $180\div184$, $185\div189$},
xtick=data, nodes near coords,
nodes near coords align={vertical},
xticklabel style={rotate=45, anchor=18},
xtick pos=left]
\addplot [fill=cyan,draw=black] coordinates{
($150\div154$,3) ($155\div159$,6) ($160\div164$,9) ($165\div169$,15)
($170\div174$,12) ($175\div179$,6) ($180\div184$,6) ($185\div189$,3)};
\end{axis}
\end{tikzpicture}`[attachment=1241]prova_2015-01-12.png[/attachment]
Per fare quello che vuoi tu basta inserire l’opzione [tt]xticklabel style={text width=1cm}[/tt], ma anche riducendo la dimensione del font, le etichette si confondono con le successive.
Tirata d’orecchi: ti è stato più volte “intimato” di aggiungere nel preambolo `\pgfplotsset{compat=1.11}`
Ora puoi capire la fondatezza di quel consiglio. Prova a compilare il codice che ti ho dato. Vedrai che l’etichetta dell’asse y è inutilmente lontana dal grafico e quella dell’asse x si sovrappone alle etichette delle tacche. Come mai? Perché nella versione 1.3, che è quella usata per default, la gestione delle etichette era sbagliata insieme a cento altre cose.
Ora il consiglio è sempre lo stesso, ma ti invito a ricontrollare tutti i grafici per individuare eventuali comportamenti differenti da quelli che vuoi tu (motivo per il quale sul manuale del pacchetto è sconsigliato di usare il valore [tt]newest[/tt]).Ciao
Attachments:
You must be logged in to view attached files.::
Ho letto rapidamente il manuale di [tt]bmpsize[/tt] e non mi sembra che ci sia scritto che permette di estendere i formati di file d’immagine compatibili rispetto ai predefiniti ma, da quello che ho capito, dice che, se stai usando un driver che permette di leggere i file bitmap, allora il pacchetto fa in modo che il pacchetto [tt]graphicx[/tt] sia in grado di riconoscerne le dimensioni (e questo ne giustifica anche il nome). Ciò premesso, non mi sembra che il driver [tt]pdftex[/tt] sia in grado di leggere i file bitmap.Quello che dice l’Arte è ambiguo e, se la mia interpretazione è corretta, sbagliato. E’ vero, come dice Lorenzo, che si parla in generale di LaTeX e quindi non in particolare di pdflatex; ma afferma che il pacchetto [tt]bmpsize[/tt] permette di inserire anche altri formati di immagine e invece la funzione del pacchetto è un’altra. Inoltre nel par. 2.1 si afferma “In questa guida con LaTeX s’intende sempre il programma pdflatex”, perciò la precisazione fatta in quella frase cadrebbe nel vuoto.
Ripeto che non ho alcuna certezza di quanto ho appena scritto, perché ho letto tutto velocemente, perciò se mi sbaglio chiedo scusa agli autori della guida.
Per quanto riguarda l’eps, hai detto di usare MiKTeX e se non sbaglio la gestione diretta degli eps è supportata solo da TeXlive e MacTex. che è la distribuzione di cui parla l’Arte e che assume per installata nel resto della guida.
Riguardo all’inclusione di un bitmap in un pdf, lo sconsiglierei anche se fosse possibile per motivi di dimensioni del documento. Ricorda che anche le macchine fotografiche professionali salvano le immagini in RAW oppure in jpeg…
Ciao
::lorenzo.pantieri” post=99180http://www.lorenzopantieri.net/Matematica_files/Prima.pdf
Ecco un altro problemino con pgf-pie (che peraltro mi piace moltissimo: sintassi facile e risoltati gradevoli!): i numeri che esprimono le percentuali all’interno delle fette (prodotti in automatico dal programma) non sono in modo matematico: la differenza (pagina 6 e 8) è evidentissima, e sta male. Come rimediare? Basta anche una soluzione sporchissima: ho messo il .sty (non compreso nella mia MacTeX2013) nella cartella di lavoro, per cui potrei anche intervenire su quello…
Aggiungi tra le opzioni
`before number=$, after number=\%$`
::OldClaudio” post=99081Faccio tesoro del tuo codice, e se qualcuno aggiusta il piccolo baco che ancora resta, tanto meglio.
Problema risolto con la chiave [tt]disabledatascaling[/tt]. Ho aggiornato entrambi i codici e ho semplificato la formula che dà la latitudine del cursore in funzione della longitudine, passando alle funzioni iperboliche. Ovviamente è possibile ricavare anche la longitudine in funzione della latitudine, ma dal punto di vista grafico servono più campioni per avere una curvatura dolce (perché l’elica si arrotola intorno ai poli ed è preferibile avere più nodi equidistanti in longitudine piuttosto che in latitudine), perciò ho scelto questa versione.
::OldClaudio” post=98957Visto che l’appetito vie mangiando, saresti anche capace di disegnare una lossodromia fra due punti dati?
Forse siamo un po’ OT e per questo chiedo scusa a @Squall. Questo regalo è tutto per @OldClaudio.
Allo stesso modo dell’ortodromia ho definito un pic [tt]lossodromia[/tt] che genera la curva lossodromica tra due punti assegnati sulla sfera. Il codice usa solo i comandi di TikZ, ma per disegnare la sfera mi sono appoggiato a pgfplots, che non è necessario. Il pic utilizza l’istruzione [tt]plot[/tt] di TikZ con i valori di default (25 campioni), ma è possibile passare al comando le opzioni [tt]smooth[/tt], [tt]hobby[/tt] oppure [tt]samples=[/tt] per migliorare le caratteristiche del tratto. Non l’ho fatto a priori per non appesantire il risultato quando non è necessario.
Il cuore è il comando:
`\pic [partenza={latitudine A}{longitudine A}, arrivo={latitudine B}{longitudine B}] {lossodromia};`
nel quale, come di consueto, la latitudine 0 corrisponde al piano [xy] e la longitudine 0 al semipiano [xz] di ascisse positive. La latitudine va da -90 al polo sud a 90 al polo nord; la longitudine va da -180 (ovest) a 180 (est). Non è possibile scegliere come punto di partenza o di arrivo uno dei due poli, ma è possibile prendere un punto di latitudine molto vicina (ad esempio 89.99°). Non è nemmeno possibile prendere due punti sullo stesso meridiano, ma in tal caso la lossodromia coincide con l’ortodromia e si può usare quel codice. Volendo si può pensare di affinare il codice per includere questi casi particolari.
Anche qui è possibile utilizzare la chiave [tt]raggio[/tt] che è un alias per la chiave [tt]scale[/tt] e accetta solo numeri adimensionali che vengono interpretati come fattore di scala della lunghezza del versore dell’asse delle ascisse.
Se le coordinate vengono inserite correttamente, il codice disegna il più breve tra tutti i tratti possibili. In alternativa, si può usare l’opzione [tt]demo[/tt]: in tal caso il codice disegna la curva che passa per i due punti e per tutti i punti di longitudine intermedia. Per fare un esempio: se la longitudine del punto di partenza è -178 e quella del punto di arrivo è 178, di default il codice disegna la curva che si estende su soli 4° di longitudine, mentre con l’opzione [tt]demo[/tt] disegna la curva che si estende su 356° di longitudine, passando per il meridiano di Greenwich.`\documentclass
{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}% componenti dei versori degli assi coordinati
% rispetto alla base della tela
\pgfmathsetlengthmacro{\xx}{-2cm*sqrt(3)/2}
\pgfmathsetlengthmacro{\xy}{-1cm}
\pgfmathsetlengthmacro{\yx}{2cm*sqrt(3)/2}
\pgfmathsetlengthmacro{\yy}{-1cm}
\pgfmathsetlengthmacro{\zx}{0cm}
\pgfmathsetlengthmacro{\zy}{2cm}\tikzset{
latA/.initial=0,
lonA/.initial=0,
latB/.initial=0,
lonB/.initial=0,
partenza/.style 2 args={latA=#1, lonA=#2},
arrivo/.style 2 args={latB=#1, lonB=#2},
posizione/.style 2 args={latA=#1, lonA=#2},
raggio/.initial=1,
raggio/.code={\tikzset{/tikz/scale=#1}},
/lossodromia/esteso/.initial=1,
demo/.code={\tikzset{/lossodromia/esteso=0}},
declare function={
s(\x) = ln( (sin(\x)+1)/cos(\x) );
S(\x) = \m*(\x-\lonA) + s(\latA);
% s e S sono due espressioni della stessa funzione
},
lossodromia/.pic={
% riferimento http://homepages-fb.thm.de/boergens/marken/marke062/marke062_loxo.pdf
\pgfmathsetmacro{\latA}{\pgfkeysvalueof{/tikz/latA}}
\pgfmathsetmacro{\lonA}{\pgfkeysvalueof{/tikz/lonA}}
\pgfmathsetmacro{\latB}{\pgfkeysvalueof{/tikz/latB}}
\pgfmathsetmacro{\lonB}{\pgfkeysvalueof{/tikz/lonB}}
\pgfmathparse{\lonB-\lonA>180 && \pgfkeysvalueof{/lossodromia/esteso}==1 ? 360 : 0}
\pgfmathsetmacro{\lonB}{\lonB – \pgfmathresult}
\pgfmathparse{\lonA-\lonB>180 && \pgfkeysvalueof{/lossodromia/esteso}==1 ? 360 : 0}
\pgfmathsetmacro{\lonA}{\lonA – \pgfmathresult}
\pgfmathsetmacro{\m}{(s(\latB)-s(\latA)) / (\lonB-\lonA)}
\draw [variable=\t, domain=\lonA:\lonB, pic actions]
plot ({cos(\t)/cosh(S(\t))}, {sin(\t)/cosh(S(\t))}, {tanh(S(\t))});
},
coordinata/.pic={
\pgftransformshift{
\pgfpointspherical{90-\pgfkeysvalueof{/tikz/lonA}}{\pgfkeysvalueof{/tikz/latA}}{1}
}
\pgfnode{coordinate}{center}{}{#1}{}
}
}\begin{document}
\begin{tikzpicture}
\begin{axis} [x={(\xx,\xy)}, y={(\yx,\yy)}, z={(\zx,\zy)},
anchor=origin, at={(0,0)}, disabledatascaling, hide axis]
% disegna i meridiani e i paralleli
\addplot3 [surf, z buffer=sort, fill opacity=0.6, white, faceted color=blue!40,
samples=19, samples y=37, variable=\u, variable y=\v,
domain=0:180, y domain=0:360]
({cos(u)*sin(v)}, {sin(u)*sin(v)}, {cos(v)});
% disegna il contorno della sfera
\draw [blue!40] (0,0,0) circle ({2cm*sqrt(3/2)});
% disegna la lossodromia
\pic [partenza={-10}{20}, arrivo={89.99}{360}, smooth, samples=50, demo, red] {lossodromia};
% definisce le coordinate dei punti di partenza e arrivo
\pic [posizione={-10}{20}] {coordinata=A};
\pic [posizione={89.99}{360}] {coordinata=B};
% traccia i pallini in corrispondenza degli estremi della curva
\fill (A) circle (1pt)
(B) circle (1pt);
% disegna gli assi coordinati
\draw [-latex] (1,0,0) — (1.5,0,0);
\draw [-latex] (0,1,0) — (0,1.5,0);
\draw [-latex] (0,0,1) — (0,0,1.5);
\end{axis}
\end{tikzpicture}
\end{document}`[attachment=1239]lossodromia.jpg[/attachment]
Il codice, come anche quello dell’ortodromia, al momento presenta un bug: quando usato all’interno dell’ambiente [tt]axis[/tt] di pgfplots per disegnare la sfera passando come opzioni i versori degli assi coordinati, i pallini (e nel caso dell’ortodromia la curva) potrebbero essere tracciati fuori asse per alcune combinazioni di assi coordinati. Il problema nasce dal fatto che il sistema di riferimento viene specificato due volte: una per l’ambiente [tt]axis[/tt] e l’altra per i pic. Se qualcuno mi aiuta a risolverlo, gli sono grato.Ciao
Edit: bug risolto con la chiave [tt]disabledatascaling[/tt]. Ho aggiornato conseguentemente il codice.
Attachments:
You must be logged in to view attached files.::OldClaudio” post=98957Visto che l’appetito vie mangiando, saresti anche capace di disegnare una lossodromia fra due punti dati?
Forse siamo un po’ OT e per questo chiedo scusa a @Squall. Questo regalo è tutto per @OldClaudio.
Allo stesso modo dell’ortodromia ho definito un pic [tt]lossodromia[/tt] che genera la curva lossodromica tra due punti assegnati sulla sfera. Il codice usa solo i comandi di TikZ, ma per disegnare la sfera mi sono appoggiato a pgfplots, che non è necessario. Il pic utilizza l’istruzione [tt]plot[/tt] di TikZ con i valori di default (25 campioni), ma è possibile passare al comando le opzioni [tt]smooth[/tt], [tt]hobby[/tt] oppure [tt]samples=[/tt] per migliorare le caratteristiche del tratto. Non l’ho fatto a priori per non appesantire il risultato quando non è necessario. La curva sembra funzionare correttamente. Forse le formule si potrebbero semplificare un po’ ma per il momento va bene così.
Il cuore è il comando:
`\pic [partenza={latitudine A}{longitudine A}, arrivo={latitudine B}{longitudine B}] {lossodromia};`
nel quale, come di consueto, la latitudine 0 corrisponde al piano [xy] e la longitudine 0 al semipiano [xz] di ascisse positive. Non è possibile scegliere come punto di partenza o di arrivo uno dei due poli, ma è possibile prendere un punto di latitudine molto vicina (ad esempio 89.98°). Non è nemmeno possibile prendere due punti sullo stesso meridiano, ma in tal caso la lossodromia coincide con l’ortodromia e si può usare quel codice. Volendo si può pensare di affinare il codice per includere questi casi particolari.
Anche qui è possibile utilizzare la chiave [tt]raggio[/tt] che è un alias per la chiave [tt]scale[/tt] e accetta solo numeri adimensionali che vengono interpretati come fattore di scala della lunghezza del versore dell’asse delle ascisse.
`\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}% componenti dei versori degli assi coordinati
% rispetto alla base della tela
\pgfmathsetlengthmacro{\xx}{-2cm*sqrt(3)/2}
\pgfmathsetlengthmacro{\xy}{-1cm}
\pgfmathsetlengthmacro{\yx}{2cm*sqrt(3)/2}
\pgfmathsetlengthmacro{\yy}{-1cm}
\pgfmathsetlengthmacro{\zx}{0cm}
\pgfmathsetlengthmacro{\zy}{2cm}\tikzset{
latA/.initial=0,
lonA/.initial=0,
latB/.initial=0,
lonB/.initial=0,
partenza/.style 2 args={latA=#1, lonA=#2},
arrivo/.style 2 args={latB=#1, lonB=#2},
posizione/.style 2 args={latA=#1, lonA=#2},
raggio/.initial=1,
raggio/.code={\tikzset{/tikz/scale=#1}},
declare function={
s(\x) = ln( (1+tan(\x/2)) / (1-tan(\x/2))) );
lat(\x) = 2*atan( tanh( (\m*(\x-\lonA) + s(\latA))/2) ) );
},
lossodromia/.pic={
% riferimento http://homepages-fb.thm.de/boergens/marken/marke062/marke062_loxo.pdf
\pgfmathsetmacro{\latA}{\pgfkeysvalueof{/tikz/latA}}
\pgfmathsetmacro{\lonA}{\pgfkeysvalueof{/tikz/lonA}}
\pgfmathsetmacro{\latB}{\pgfkeysvalueof{/tikz/latB}}
\pgfmathsetmacro{\lonB}{\pgfkeysvalueof{/tikz/lonB}}
\pgfmathsetmacro{\m}{(s(\latB)-s(\latA)) / (\lonB-\lonA)}
\draw [variable=\t, domain=\lonA:\lonB, pic actions]
plot (
{abs(\t)!=90 ? cos(\t)*cos(lat(\t)) : 0},
{abs(\t)!=90 ? sin(\t)*cos(lat(\t)) : 0},
{abs(\t)!=90 ? sin(lat(\t)) : sin(\t)});
},
coordinata/.pic={
\pgftransformshift{
\pgfpointspherical{90-\pgfkeysvalueof{/tikz/lonA}}{\pgfkeysvalueof{/tikz/latA}}{1}
}
\pgfnode{coordinate}{center}{}{#1}{}
}
}\begin{document}
\begin{tikzpicture}
\begin{axis} [x={(\xx,\xy)}, y={(\yx,\yy)}, z={(\zx,\zy)}, hide axis]
% disegna i meridiani e i paralleli
\addplot3 [surf, z buffer=sort, fill opacity=0.6, white, faceted color=blue!40,
samples=19, samples y=37, variable=\u, variable y=\v,
domain=0:180, y domain=0:360]
({cos(u)*sin(v)}, {sin(u)*sin(v)}, {cos(v)});
% disegna il contorno della sfera
\draw [blue!40] (0,0,0) circle ({2cm/cos(atan(1/sqrt(2)))});
% disegna la lossodromia
\pic [partenza={-10}{20}, arrivo={89.98}{360}, smooth, samples=50, red] {lossodromia};
% definisce le coordinate dei punti di partenza e arrivo
\pic [posizione={-10}{20}, x={(\xx,\xy)}, y={(\yx,\yy)}, z={(\zx,\zy)}] {coordinata=A};
\pic [posizione={89.98}{360}, x={(\xx,\xy)}, y={(\yx,\yy)}, z={(\zx,\zy)}] {coordinata=B};
% traccia i pallini in corrispondenza degli estremi della curva
\fill (A) circle (1pt)
(B) circle (1pt);
% disegna gli assi coordinati
\draw [-latex] (1,0,0) — (1.5,0,0);
\draw [-latex] (0,1,0) — (0,1.5,0);
\draw [-latex] (0,0,1) — (0,0,1.5);
\end{axis}
\end{tikzpicture}
\end{document}`[attachment]C:\fakepath\lossodromia.png[/attachment]
Il codice, come anche quello dell’ortodromia, al momento presenta un bug: quando usato all’interno dell’ambiente [tt]axis[/tt] di pgfplots per disegnare la sfera passando come opzioni i versori degli assi coordinati, i pallini (e nel caso dell’ortodromia la curva), potrebbero essere tracciati fuori asse per alcune combinazioni di assi coordinati. Il problema nasce dal fatto che il sistema di riferimento viene specificato due volte: una per l’ambiente [tt]axis[/tt] e l’altra per i pic. Se qualcuno mi aiuta a risolverlo, gli sono grato.
Ciao
::OldClaudio” post=98972Disegnando anche i paralleli, cosa che ritengo utilissima, il disegno risulta un po’ confuso se si vedono le linee sul retro della sfera; lo so che è difficile, ma si possono elininare gli archi posteriori di meridiani e paralleli?
Tratteggiare o nascondere le parti visibili non è banale, soprattutto se si vuole realizzare una soluzione che vada bene con qualunque sistema di riferimento (leggi proiezione). In tal caso, magari per pigrizia, credo che la soluzione più semplice sia appoggiarsi all’opzione [tt]surf[/tt] di pgfplots per disegnare la sfera. Lo svantaggio è che gli archi saranno solo approssimati sul reticolo.
`\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}% componenti dei versori degli assi coordinati
% rispetto alla base della tela
\pgfmathsetlengthmacro{\xx}{-1cm*sqrt(3)/2}
\pgfmathsetlengthmacro{\xy}{-0.5cm}
\pgfmathsetlengthmacro{\yx}{1cm*sqrt(3)/2}
\pgfmathsetlengthmacro{\yy}{-0.5cm}
\pgfmathsetlengthmacro{\zx}{0cm}
\pgfmathsetlengthmacro{\zy}{1cm}\tikzset{
latA/.initial=0,
lonA/.initial=0,
latB/.initial=0,
lonB/.initial=0,
partenza/.style 2 args={latA=#1, lonA=#2},
arrivo/.style 2 args={latB=#1, lonB=#2},
posizione/.style 2 args={latA=#1, lonA=#2},
raggio/.initial=1,
raggio/.code={\tikzset{/tikz/scale=#1}},
lungo/.initial=0,
opposto/.code={\tikzset{/tikz/lungo=1}},
ortodromia/.pic={
% conversione delle coordinate geografiche in cartesiane
\pgfmathsetmacro{\Ax}{cos(\pgfkeysvalueof{/tikz/latA})*cos(\pgfkeysvalueof{/tikz/lonA})}
\pgfmathsetmacro{\Ay}{cos(\pgfkeysvalueof{/tikz/latA})*sin(\pgfkeysvalueof{/tikz/lonA})}
\pgfmathsetmacro{\Az}{sin(\pgfkeysvalueof{/tikz/latA})}
\pgfmathsetmacro{\Bx}{cos(\pgfkeysvalueof{/tikz/latB})*cos(\pgfkeysvalueof{/tikz/lonB})}
\pgfmathsetmacro{\By}{cos(\pgfkeysvalueof{/tikz/latB})*sin(\pgfkeysvalueof{/tikz/lonB})}
\pgfmathsetmacro{\Bz}{sin(\pgfkeysvalueof{/tikz/latB})}
% prodotto scalare (OA\cdot OB)
\pgfmathsetmacro{\ps}{\Ax*\Bx + \Ay*\By + \Az*\Bz}
% vettore OP complanare con OA e OB e ortogonale al primo
\pgfmathsetmacro{\Px}{-\Ax*\ps + \Bx}
\pgfmathsetmacro{\Py}{-\Ay*\ps + \By}
\pgfmathsetmacro{\Pz}{-\Az*\ps + \Bz}
% versore CP parallelo a OP
\pgfmathsetmacro{\Cx}{\Px/sqrt((\Px)^2 + (\Py)^2 + (\Pz)^2)}
\pgfmathsetmacro{\Cy}{\Py/sqrt((\Px)^2 + (\Py)^2 + (\Pz)^2)}
\pgfmathsetmacro{\Cz}{\Pz/sqrt((\Px)^2 + (\Py)^2 + (\Pz)^2)}
% angolo tra i due vettori OA e OB
\pgfmathsetmacro{\angolo}{acos(\ps)-360*\pgfkeysvalueof{/tikz/lungo}}
\draw [x={(\Ax*\xx+\Ay*\yx+\Az*\zx, \Ax*\xy+\Ay*\yy+\Az*\zy)},
y={(\Cx*\xx+\Cy*\yx+\Cz*\zx, \Cx*\xy+\Cy*\yy+\Cz*\zy)}, pic actions]
(1,0,0) arc (0:\angolo:1);
},
coordinata/.pic={
\pgftransformshift{
\pgfpointspherical{90-\pgfkeysvalueof{/tikz/lonA}}{\pgfkeysvalueof{/tikz/latA}}{1}
}
\pgfnode{coordinate}{center}{}{#1}{}
}
}\begin{document}
\begin{tikzpicture}
\begin{axis} [x={(\xx,\xy)}, y={(\yx,\yy)}, z={(\zx,\zy)},
anchor=origin, at={(0,0)}, disabledatascaling, hide axis]
% disegna la sfera con i meridiani e paralleli
\addplot3 [surf, z buffer=sort, fill opacity=0.6, white, faceted color=blue!40, very thin,
samples=19, samples y=37, variable=\u, variable y=\v,
domain=0:180, y domain=0:360]
({cos(u)*sin(v)}, {sin(u)*sin(v)}, {cos(v)});
% disegna l'arco
\pic [partenza={30}{-50}, arrivo={30}{90}, red] {ortodromia};
\pic [posizione={30}{-50}] {coordinata=A};
\pic [posizione={30}{90}] {coordinata=B};
\fill (A) circle (0.8pt)
(B) circle (0.8pt);
% assi coordinati
\draw [-latex] (1,0,0) — (2,0,0);
\draw [-latex] (0,1,0) — (0,2,0);
\draw [-latex] (0,0,1) — (0,0,2);
\end{axis}
\end{tikzpicture}
\end{document}`[attachment=1234]ortodromia1.png[/attachment]
Attachments:
You must be logged in to view attached files. -
AutoreRisposte