- Questo topic ha 3 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 1 mese, 3 settimane fa da .
-
Topic
-
Dopo anni in cui ho preso e lasciato il progetto, e oggi anche con l’aiuto dell’IA che mi ha aiutato con certi costrutti, ho prodotto questo.
Per ora lo metto qui affinché possa essere testato e poi col tempo lo migliorerò, se si renderà necessario.\documentclass{article} \usepackage{tikz} \usetikzlibrary{arrows.meta,calc,bending} % 1. Definizione dei flag booleani e della gestione delle chiavi con pgfkeys \newif\ifocugonioLabel \newif\ifocugonioR \newif\ifocugonioL \newif\ifocugonioRevR \newif\ifocugonioRevL \pgfkeys{ /ocugonio/.cd, radius/.store in=\ocugonioRadius, dist/.store in=\ocugonioDist, label/.is if=ocugonioLabel, tick S/.store in=\ocugonioTickS, tick M/.store in=\ocugonioTickM, tick L/.store in=\ocugonioTickL, text dist/.store in=\ocugonioTextDist, line thickness/.store in=\ocugonioLineThickness, eye/.is choice, eye/both/.code={\ocugonioRtrue\ocugonioLtrue}, eye/R/.code={\ocugonioRtrue\ocugonioLfalse}, eye/L/.code={\ocugonioRfalse\ocugonioLtrue}, rev/.is choice, rev/none/.code={\ocugonioRevRfalse\ocugonioRevLfalse}, rev/both/.code={\ocugonioRevRtrue\ocugonioRevLtrue}, rev/R/.code={\ocugonioRevRtrue\ocugonioLfalse}, rev/L/.code={\ocugonioRevRfalse\ocugonioRevLtrue}, } % 2. Macro di supporto interna per disegnare un singolo occhio \newcommand{\ocugonioDrawEye}[4]{% #1=centro, #2=testo, #3=angolo freccia, #4=inversione (1 o 0) \def\tempAngle{#3}% % Stile della freccia proporzionale \tikzset{dinArrow/.style={->, >={Stealth[scale=1]}, line width=\ocugonioLineThickness}} % Disegna il puntino al centro del goniometro legato allo spessore della linea \fill (#1) circle (1.5*\ocugonioLineThickness); % Arco principale con lo spessore controllato dalla chiave \draw[line width=\ocugonioLineThickness] (#1) ++(\ocugonioRadius,0) arc[start angle=0, end angle=180, radius=\ocugonioRadius]; % Tacche piccole \foreach \angp in {5,15,…,175} \draw[line width=\ocugonioLineThickness] (#1) ++(\angp:\ocugonioRadius) — ++(\angp:\ocugonioTickS); % Tacche medie \foreach \angp in {10,20,…,170} \draw[line width=\ocugonioLineThickness] (#1) ++(\angp:\ocugonioRadius) — ++(\angp:\ocugonioTickM); % Tacche grandi e numeri \foreach \angp in {0,30,…,180} { \draw[line width=\ocugonioLineThickness] (#1) ++(\angp:\ocugonioRadius) — ++(\angp:\ocugonioTickL); \ifnum#4=1\relax \pgfmathtruncatemacro{\displayValue}{180-\angp} \else \def\displayValue{\angp} \fi \node [rotate=\angp-90] at ($(#1)+(\angp:\ocugonioRadius+\ocugonioTextDist)$) {\displayValue}; } % Label condizionale \ifocugonioLabel \node [below=0.5cm] at (#1) {#2}; \fi % Controllo Freccia \if\relax\detokenize{#3}\relax \else \ifnum#4=1\relax \pgfmathtruncatemacro{\revAngle}{180-\tempAngle} \draw [dinArrow] (#1) — ++(\revAngle:\ocugonioRadius); \else \draw [dinArrow] (#1) — ++(\tempAngle:\ocugonioRadius); \fi \fi } % 3. Comando principale \NewDocumentCommand{\ocugonio}{O{} O{} O{}}{% \ocugonioRevRfalse \ocugonioRevLfalse % Default storici stabili battezzati nella v1.0 \pgfkeys{/ocugonio/.cd, radius=2cm, dist=2.5cm, label=true, eye=both, rev=none, tick S=0.2cm, tick M=0.4cm, tick L=0.6cm, text dist=0.8cm, line thickness=1pt, }% \pgfkeys{/ocugonio/.cd, #1}% \begin{tikzpicture} % Formula geometrica originale mantenuta invariata \coordinate (CenterR) at (-\ocugonioRadius,0); \coordinate (CenterL) at ($(\ocugonioRadius,0)+(\ocugonioDist,0)$); \ifocugonioR \ifocugonioRevR \ocugonioDrawEye{CenterR}{OCCHIO DESTRO}{#2}{1}% \else \ocugonioDrawEye{CenterR}{OCCHIO DESTRO}{#2}{0}% \fi \fi \ifocugonioL \ifocugonioRevL \ocugonioDrawEye{CenterL}{OCCHIO SINISTRO}{#3}{1}% \else \ocugonioDrawEye{CenterL}{OCCHIO SINISTRO}{#3}{0}% \fi \fi \end{tikzpicture}% } \begin{document} \section*{Esempi di utilizzo del pacchetto \textsf{ocugonio} (v1.0)} \subsection*{1. Caso Standard con Frecce (Destro 60°, Sinistro 30°)} % Visualizzazione classica: scala normale, testi attivi e vettori inseriti \ocugonio[][60][30] \vspace{1.5cm} \subsection*{2. Caso Pulito (Solo Goniometri Neutri di Sfondo)} % Il comando base senza parametri disegna i goniometri vuoti con il solo puntino centrale \ocugonio \vspace{1.5cm} \subsection*{3. Inversione della scala solo per l’Occhio Sinistro (\texttt{rev=L})} % Il goniometro destro mantiene lo 0 a destra. Il sinistro inverte la scala (0 a sinistra) \ocugonio[rev=L][60][30] \vspace{1.5cm} \subsection*{4. Inversione della scala per Entrambi gli Occhi (\texttt{rev=both})} % Entrambi i goniometri hanno lo 0 impostato sul lato temporale esterno (0 a destra per il DX, 0 a sinistra per il SX) \ocugonio[rev=both][60][30] \vspace{1.5cm} \subsection*{5. Modifica della Scala e delle Dimensioni (Proporzionalità)} % Esempio con raggio maggiorato dove spessori, tacche e testi si adattano dinamicamente \ocugonio[radius=3.5cm, tick S=0.08*\ocugonioRadius, tick M=0.15*\ocugonioRadius, tick L=0.25*\ocugonioRadius, text dist=0.35*\ocugonioRadius, line thickness=1.8pt ][60][30] \vspace{1.5cm} \subsection*{6. Personalizzazione delle Tacche (Solo quadranti principali)} % Spegnimento totale delle tacche da 5° e 10° per ottenere un goniometro molto pulito (solo step di 30°) \ocugonio[tick S=0, tick M=0, radius=2.5cm][90][120] \end{document}
Visualizzazione 2 filoni di risposte
Visualizzazione 2 filoni di risposte
- Devi essere connesso per rispondere a questo topic.
