Re: Semicerchio graduato con freccia

  • Creatore
    Topic
  • #134133
    GuITstaff
    Amministratore del forum
      Up
      0
      Down
      ::

      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}

       

       

       

      • Questo topic è stato modificato 1 mese fa da admin.
      • Questo topic è stato modificato 1 mese fa da mlgdominici.
      • Questo topic è stato modificato 1 mese fa da mlgdominici.
      • Questo topic è stato modificato 1 mese fa da mlgdominici.
      • Questo topic è stato modificato 1 mese fa da mlgdominici.
    Visualizzazione 2 filoni di risposte
    • Autore
      Risposte
      • #134134
        GuITstaff
        Amministratore del forum
          Up
          0
          Down
          ::

          Bello. Sono curioso di vedere come viene l’insieme usando il pacchetto euclideangeometry che non ricorre a tikz.
          Per carità tikz è fenomenale, ma è molto impegnativo per la memoria di lavoro del sistema TeX. Più di una volta qualche compilazione mi si è bloccata per saturazione della memoria di lavoro; certo è possibile aumentare tale memoria, ma mi spiace farlo, quasi per imposizione di legge. Dovrei ricredermi…

        • #134135
          GuITstaff
          Amministratore del forum
            Up
            0
            Down
            ::

            Ammetto che il pacchetto euclideangeometry non l’ho usato mai e quindi non mi sono neanche cimentato .

          • #134136
            GuITstaff
            Amministratore del forum
              Up
              0
              Down
              ::

              In realtà, sì, puoi usare euclideangeometry, perché questo pacchetto include il pacchetto curve2e.

              Se dai il comando [tt]texdoc curve2e-manual[/[tt] e vai alla pagina 23 trovi il disegno del quadrante di un orologio; quello che serve per disegnare quel quadrante serve in modo analogo per disegnare i tuoi semicerchi graduati. È chiaro che non hai bisogno di inserire il numeri romani delle ore, ma quel procedimento serve anche per mettere le tacche della tua graduazione, una volta per le tacche dei multipli di 30°, una volta per quelle dei 10° e una volta per quelle dei 5°. In quel manuale ci sono molti esempi per le frecce. Le definizioni dei comandi eseguite con le funzionalità dei pacchetti xparse e xfp (le cui funzionalità sono ora quasi tutte contenute nel nucleo del formato di LaTeX, quindi oggi non sei più tenuto a caricare questi pacchetti) sono formidabili e nel codice per disegnare l’orologio vedi usati alcuni comandi con la nuova sintassi.

              In sostanza per disegnare quel quadrante con curve2e bastano 13 righe di codice; per i tuoi semicerchi graduati te ne possono servire il doppio, ma devi definire un solo comando che, con diversi argomenti opzionali ,ti scrive il titolino sotto il quadrante, ti disegna o non disegna le frecce, si mette la graduazione in verso orario o antiorario.

              Per carità, non dico che “devi cimentati” a fare i tuoi semicerchi con curve2e; dico solo che spesso si può evitare l’uso di TikZ a casi in cui le funzionalità dell’ambiente picture, esteso con gli svariati pacchetti disponibili, sono più che sufficienti.

              Personalmente ho scritto tutti i miei libri sui circuiti elettronici senza usare circuitikz (basato su TikZ) e i miei schemi circuitali sono risultati molto più belli di quelli che si possono ottenere con quel pacchetto creato apposta per disegnarli. In sostanza l’ambiente picture da solo è veramente un giochino, esteso con le funzionalità preconzzate da Leslie Lamport e realizzate da altri, non è più un giochino; gli ulteriori pacchetti fra i quali curve2e e euclideangeometry ne fanno uno strumento formidabile, anche se non è potente come TikZ, ma non pesano sulla memoria interna dei programmi di tipocomposizione del sistema TeX.

          Visualizzazione 2 filoni di risposte
          • Devi essere connesso per rispondere a questo topic.

          Go to top