Spettro elettromagnetico con TikZ

  • Creatore
    Topic
  • #85169
    Up
    0
    Down
    ::


    Salve a tutti!

    Ho fatto un codice per lo spettro elettromagnetico con TikZ in una maniera piuttosto artigianale: ho fatto tanti rettangoli con a destra un colore e a sinistra un altro usando il comando \shade. Ho poi visto sulle guide tematiche GuIT il manuale TikZ per ingegneri, dove lo spettro è fatto costruendo ex novo uno shading. Ho provato a ricalcare parte del codice (peraltro simile a quello della guida TikZ) ma mi ha dato un problema di compilazione, che riporto in calce. Non capisco cosa sia successo.

    `
    Use of \pgf@grabcolor doesn't match its definition.
    …green); color(65bp)=(yellow); color
    (75bp)=(red); color (100bp…
    l.358 color (75bp)=(red); color (100bp)=(red)}
    `

    Il codice che ho scritto ed usato è questo (reso quasi minimale, perché dentro il file c’è tanta altra roba):

    `
    % !TEX encoding = UTF-8 Unicode
    % !TEX TS-program = pdflatex
    %%%%%%
    %%%%%%
    \documentclass[10pt,fleqn,oneside]{article}

    %— Testo
    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage[italian]{babel}

    %— Pacchetti utili
    \usepackage{lmodern}
    \usepackage{microtype}
    \usepackage[dvipsnames*,svgnames]{xcolor}
    \usepackage{pgf,tikz}
    \usetikzlibrary{shadings}
    \usetikzlibrary{arrows}
    \usetikzlibrary{circuits}
    \usetikzlibrary{positioning}
    \usetikzlibrary{fadings}
    \usetikzlibrary{matrix}
    \usetikzlibrary{patterns}
    \usetikzlibrary{decorations.markings}
    \usetikzlibrary{decorations.pathmorphing}

    \begin{document}

    \begin{tikzpicture}
    \pgfdeclarehorizontalshading{rainbow}{100bp}
    {color(0bp)=(violet); color(25bp)=(violet); color(35bp)=(blue);
    color(45bp)=(cyan); color(55bp)=(green); color(65bp)=(yellow);
    color (75bp)=(red); color (100bp)=(red)}
    \shade[draw,shading=rainbow] (2,-4) rectangle node[above=1cm] {visibile} (10,-2);
    \end{tikzpicture}
    \end{document}
    `

    Avevo anche visto un altro metodo per fare lo spettro (ma senza usare TikZ), dando i colori direttamente con la frequenza con \color[wave]{555} che mi consentirebbe di automatizzare un po’ la cosa. Qualcuno potrebbe dirmi cos’è successo al modello del codice di “TikZ per ingegneri” e se c’è un modo semplice per fare lo spettro dando le frequenze con il comando \foreach??

    Grazie,

    Andrea

Visualizzazione 19 filoni di risposte
  • Autore
    Risposte
    • #85170
      Up
      0
      Down
      ::

      logos” post=84571Salve a tutti!

      Ho fatto un codice per lo spettro elettromagnetico con TikZ in una maniera piuttosto artigianale: ho fatto tanti rettangoli con a destra un colore e a sinistra un altro usando il comando \shade. Ho poi visto sulle guide tematiche GuIT il manuale TikZ per ingegneri, dove lo spettro è fatto costruendo ex novo uno shading. Ho provato a ricalcare parte del codice (peraltro simile a quello della guida TikZ) ma mi ha dato un problema di compilazione, che riporto in calce. Non capisco cosa sia successo.

      `
      Use of \pgf@grabcolor doesn't match its definition.
      …green); color(65bp)=(yellow); color
      (75bp)=(red); color (100bp…
      l.358 color (75bp)=(red); color (100bp)=(red)}
      `

      Scrivendo
      `\makeatletter
      \show\pgf@grabcolor`
      viene mostrata la definizione di quel comando:
      `> \pgf@grabcolor=macro:
      color(#1)=(#2)->\pgfutil@colorlet {pgf@tempcol}{#2}\pgfutil@extractcolorspec {p
      gf@tempcol}{\pgf@tempcolor }\expandafter \pgfutil@convertcolorspec \pgf@tempcol
      or {rgb}{\pgf@rgbcolor }\expandafter \pgf@convgetrgb@ \expandafter {\pgf@rgbcol
      or }{#1}.
      l.28 \show\pgf@grabcolor`
      Per come è definito, non vuole spazi attorno alle parentesi tonde né all’uguale. Sei stato fortunato che hai messo lo spazio appena prima della tonda, se lo avessi messo dopo quell'[tt]#1[/tt] oppure attorno all’uguale l’errore sarebbe stato sicuramente più incomprensibile… 😀

      Ciao,
      Antonio

    • #85171
      Up
      0
      Down
      ::


      OK, sono completamente sconvolto! Io non ci sarei mai arrivato!!

      Questa pignoleria del TikZ non mi sorprende visto che pacchetto pignolo è, ma mi ha comunque lasciato interdetto! Vi mostro lo spettro per come l’ho fatto. Vorrei fare un ulteriore aggiustamento: mi piacerebbe che anche lo spazio bianco tra le linee curve che fanno da zoom per il visibile fosse fatta ad arcobaleno, ma con un’opacità del 50%. Son convinto che non basti farne una curva chiusa e usare shade con il raimbow per farlo, vero?

      Ciao,

      Andrea

      `
      % !TEX encoding = UTF-8 Unicode
      % !TEX TS-program = pdflatex
      %%%%%%%
      %%%%%%%
      %%%%%%%
      %%%%%%%
      \documentclass[10pt,fleqn,oneside]{article}

      \usepackage[a4paper]{geometry}
      \geometry{height=210mm,width=145mm}

      %— Testo
      \usepackage[LGRx,T1]{fontenc}
      \usepackage[utf8]{inputenc}
      \usepackage[italian]{babel}

      %— Pacchetti utili
      \usepackage{lmodern}
      \usepackage{amsmath,amssymb,amsthm,bm}
      \usepackage{siunitx}
      \sisetup{text-micro=\textgreek{m},
      math-micro=\textgreek{m}}
      \usepackage{microtype}
      \usepackage[dvipsnames*,svgnames]{xcolor}
      \usepackage{pgf,tikz}
      \usetikzlibrary{shadings}
      \usepackage{caption}
      \captionsetup{font=footnotesize,format=hang,
      labelfont={bf},labelsep=period}

      %%%%%%%
      %%%%%%%
      %%%%%%%

      %— Inizio del documento:

      \begin{document}

      %%%%%%
      %%%%%%
      %%%%%%

      \begin{center}
      \begin{tikzpicture}[scale=0.88,font=\footnotesize,
      line cap=round,
      line join=round,
      x=1.0cm,y=1.0cm]
      % Spectrum
      \pgfdeclarehorizontalshading{rainbow}{100bp}{
      color(0bp)=(violet); color(25bp)=(violet);
      color(35bp)=(blue); color(45bp)=(cyan);
      color(55bp)=(green); color(65bp)=(yellow);
      color(75bp)=(red); color(100bp)=(red)}
      \shade[shading=rainbow] (0,0) rectangle (9,1);

      \draw[very thin] (0,0) rectangle (9,1);
      \draw (0,0) — (9,0);
      \foreach \x in {0,0.5,…,9} \draw[thin] (\x,0) — (\x,-0.1);
      \foreach \x/\num in {0.5/400,3/500,5.5/600,8/700}
      \draw[semithick] (\x,0) — (\x,-0.2)
      node[below,font=\tiny] {$\SI{\num}{\nano\meter}$};
      %% Altro spettro
      \fill[black] (-2.5,3) — (12.5,3) — (13,3.5) — (12.5,4) — (-2.5,4) — (-3,3.5) — cycle;
      % Microvisibile
      \shade[shading=rainbow] (3,3) rectangle (3.35,4);
      % Linee di collegamento
      \draw[thin] (3,2.95) ..controls +(-90:1.5) and +(20:1).. (0,1.05);
      \draw[thin] (3.35,2.95) ..controls +(-90:1.5) and +(170:1.2).. (9,1.05);
      %
      \foreach \x in {-2,-1,…,12} \draw (\x,3) — (\x,2.9);
      %\foreach \x in {-2,-1,…,12} \draw (\x,4) — (\x,4.1);
      \begin{scope}[font=\tiny]
      % Scala dello spettro
      \node[below] at (-2,2.9) {$\SI{0.001}{\nano\meter}$};
      \node[below] at (1,2.9) {$\SI{1}{\nano\meter}$};
      \node[below] at (4,2.9) {$\SI{1000}{\nano\meter}$};
      \node[below] at (7,2.9) {$\SI{1}{\milli\meter}$};
      \node[below] at (8,2.9) {$\SI{1}{\meter}$};
      \node[below] at (10,2.9) {$\SI{1}{\kilo\meter}$};
      \begin{scope}
      % Nome delle onde
      \node

      at (-2.2,3.6)
      {\begin{minipage}[t]{1cm}raggi\\cosmici\end{minipage}};
      \node

      at (-0.7,3.6)
      {\begin{minipage}[t]{1cm}raggi\\gamma\end{minipage}};
      \node

      at (0.6,3.6)
      {\begin{minipage}[t]{1cm}raggi X\\\null\end{minipage}};
      \node

      at (2.1,3.6)
      {\begin{minipage}[t]{1cm} UV\\\null\end{minipage}};
      \node

      at (3.4,3.6)
      {\begin{minipage}[t]{1.2cm}\centering infrarosso\\(IR)\end{minipage}};
      \node

      at (4.8,3.6)
      {\begin{minipage}[t]{1.2cm}microonde\\\null\end{minipage}};
      \node

      at (6.6,3.6)
      {\begin{minipage}[t]{1cm}radar\\\null\end{minipage}};
      \node

      at (7.6,3.6)
      {\begin{minipage}[t]{2cm}radio\\\null\end{minipage}};
      \node

      at (9.6,3.6)
      {\begin{minipage}[t]{1cm}banda\\larga\end{minipage}};
      \end{scope}
      \end{scope}
      \end{tikzpicture}
      \end{center}

      \end{document}
      `

    • #85172
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::

        logos” post=84574OK, sono completamente sconvolto! Io non ci sarei mai arrivato[/code]

        Lo so certe volte è difficile, ma è quello che succede con gli argomenti delimitati. Perché qualche scrittore di pacchetti usa macro con argomenti delimitati, se sono cosi pignoli nella loro sintassi? perché in certe circostanze sono insostituibili. Questa di \color evidentemente è una di quelle.

        Leggiti quel mio articolo su ArsTeXnica, qui nel sito a disposizione di tutti i frequentatori del sito; l’articolo riguarda le macro con argomenti delimitati. spiega come funzionano e mostra qualche esempio.

      • #85173
        Up
        0
        Down
        ::

        logos” post=84574Vorrei fare un ulteriore aggiustamento: mi piacerebbe che anche lo spazio bianco tra le linee curve che fanno da zoom per il visibile fosse fatta ad arcobaleno, ma con un’opacità del 50%. Son convinto che non basti farne una curva chiusa e usare shade con il raimbow per farlo, vero?

        Invece basta 🙂

        Ho anche apportato qualche miglioria al codice che vado poi a spiegare più nel dettaglio probabilmente questa sera: `
        \documentclass[dvipsnames*,svgnames]{article}

        %— Testo
        \usepackage[LGRx,T1]{fontenc}
        \usepackage[utf8]{inputenc}
        \usepackage[italian]{babel}

        %— Pacchetti utili
        \usepackage{siunitx}

        %— TikZ e impostazioni
        \usepackage{tikz}
        \usetikzlibrary{shadings}

        % Spectrum-def
        \pgfdeclarehorizontalshading{rainbow}{100bp}{
        color(0bp)=(violet); color(25bp)=(violet);
        color(35bp)=(blue); color(45bp)=(cyan);
        color(55bp)=(green); color(65bp)=(yellow);
        color(75bp)=(red); color(100bp)=(red)}

        \tikzset{math mode/.style={
        execute at begin node=$,
        execute at end node=$,
        }
        }

        %— Inizio del documento:

        \begin{document}

        %%%%%%
        %%%%%%
        %%%%%%

        \begin{center}
        \begin{tikzpicture}[scale=0.88,font=\footnotesize,
        line cap=round,
        line join=round,
        x=1.0cm,y=1.0cm]
        % Spectrum
        \shade[shading=rainbow] (0,0) rectangle (9,1);

        \draw[very thin] (0,0) rectangle (9,1);
        \draw (0,0) — (9,0);
        \foreach \x in {0,0.5,…,9} \draw[thin] (\x,0) — (\x,-0.1);
        \foreach \x/\num in {0.5/400,3/500,5.5/600,8/700}{
        \draw[semithick] (\x,0) — (\x,-0.2)
        node[below,font=\tiny,math mode] {\SI{\num}{\nano\meter}};
        }
        %% Altro spettro
        \fill[black] (-2.5,3) — (12.5,3) — (13,3.5) — (12.5,4) — (-2.5,4) — (-3,3.5) — cycle;
        % Microvisibile
        \shade[shading=rainbow] (3,3)coordinate(x1) rectangle (3.35,4);
        % Linee di collegamento
        \draw[thin] (3,3) ..controls +(-90:1.5) and +(20:1).. (0,1)coordinate(z1);
        \draw[thin] (3.35,3)coordinate(x2) ..controls +(-90:1.5) and +(170:1.2).. (9,1)coordinate(z2);

        % Colorazione dello spazio bianco
        \shade[shading=rainbow,opacity=0.4] (3,3)..controls +(-90:1.5) and +(20:1).. (0,1) — (9,1) ..controls +(170:1.2) and +(-90:1.5)..(3.35,3)–cycle;

        \foreach \x in {-2,-1,…,12} \draw (\x,3) — (\x,2.9);

        \begin{scope}[font=\tiny, below, math mode]
        % Scala dello spettro
        \node at (-2,2.9) {\SI{0.001}{\nano\meter}};
        \node at (1,2.9) {\SI{1}{\nano\meter}};
        \node at (4,2.9) {\SI{1000}{\nano\meter}};
        \node at (7,2.9) {\SI{1}{\milli\meter}};
        \node at (8,2.9) {\SI{1}{\meter}};
        \node at (10,2.9) {\SI{1}{\kilo\meter}};
        \end{scope}
        \begin{scope}[right,font=\tiny,right,color=white, text width=1cm]
        % Nome delle onde
        \node at (-2.2,3.6)
        {raggi cosmici};
        \node at (-0.7,3.6)
        {raggi gamma};
        \node at (0.6,3.6)
        {raggi X \phantom{gamma}};
        \node at (2.1,3.6)
        {UV \phantom{gamma}};
        \node at (3.4,3.6)
        {\centering infrarosso (IR)};
        \node at (4.8,3.6)
        {microonde \phantom{gamma}};
        \node at (6.6,3.6)
        {radar \phantom{gamma}};
        \node at (7.6,3.6)
        {radio \phantom{gamma}};
        \node at (9.6,3.6)
        {banda larga};
        \end{scope}
        \end{tikzpicture}
        \end{center}

        \end{document}
        ` Il risultato:

        [attachment=680]Senzanome_2013-04-22.jpg[/attachment]

        Ciao
        Claudio

        Attachments:
        You must be logged in to view attached files.
      • #85174
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::


          Ciao,
          perché usi \phantom{gamma}?

          Sul disegno molto professionale come sempre, faccio alcune osserazioni.
          Forse la freccia nera con i testi bianchi indicanti i campi di frequenza della radiazione luminosa al di fuori della luce visibile, è un po’ troppo impegnativo, mentre eviterei il riempimento dell’area compresa tra le linee curve di esplosione dello spettro visibile.
          R.

        • #85175
          Up
          0
          Down
          ::


          Grazie a tutti dei commenti e degli aiuti.

          La striscia colorata mi sembrava bella per vedere lo zoom. Però così come l’hai costruita non funziona! Sarebbe bella se fosse sfumata dal violetto al rosso anche in cima. Invece, per come è fatta in questo momento, in altro è tutta azzurro-verdognola e non si vede la sfumatura di tutti i colori. Per spiegarmi meglio, provo a raccontare cosa vorrei vedere in maniera discreta (non sfumata): se nella freccia nera ci sono viola, blu, ciano, verde, arancione, giallo rosso, e sotto idem ma su un rettangolo più grosso, sarebbe bello vi fosse una specie di trapezio opaco al 50% che collega parte piccola viola a parte grande viola, parte piccola blu con parte grossa blu, ecc.

          Togliendo le curve di Bezier, e sostituendole con righe dritte, potrei farla con tanti trapezi monocromati, ma uno spettro è sfumato, non fatto di rettangoli monocromatici. Per questo speravo fosse possibile fare uno shading trapezioidale in maniera tale da vedere “aprirsi” la sfumatura.

          Non so se si potrà fare…

          Ciao e grazie,

          Andrea

        • #85176
          Up
          0
          Down
          ::


          Un po’ offtopic dal punto di vista TeXnico: da quando i raggi cosmici fanno parte dello spettro elettromagnetico?

        • #85177
          Up
          0
          Down
          ::


          Rispondo a Roberto ed Andrea e poi commento il codice del messaggio precedente.

          robitex” post=84587Ciao,
          perché usi \phantom{gamma}?

          Dunque, nel codice originale c’erano dei [tt]\null[/tt] che non conosco come comando, ma ho intuito che lo scopo era quello di “far occupare” spazio nella riga successiva i [tt]\\[/tt]: in questo modo tutti i testi erano “allineati” in alto e quelli corti non centralmente. Stesso fine del comando [tt]\phantom[/tt], ma occorre avere buon senso nel scegliere l’argomento: io ho scelto [tt]gamma[/tt] perché era l’unica parola con una [tt]g[/tt] e pertanto permette di “far occupare” il giusto spazio. Teoricamente però se si ri-usano [tt]\\ \null[/tt] dovrebbe andare bene comunque.

          logos” post=84592La striscia colorata mi sembrava bella per vedere lo zoom. Però così come l’hai costruita non funziona! Sarebbe bella se fosse sfumata dal violetto al rosso anche in cima. Invece, per come è fatta in questo momento, in altro è tutta azzurro-verdognola e non si vede la sfumatura di tutti i colori. Per spiegarmi meglio, provo a raccontare cosa vorrei vedere in maniera discreta (non sfumata): se nella freccia nera ci sono viola, blu, ciano, verde, arancione, giallo rosso, e sotto idem ma su un rettangolo più grosso, sarebbe bello vi fosse una specie di trapezio opaco al 50% che collega parte piccola viola a parte grande viola, parte piccola blu con parte grossa blu, ecc.

          Togliendo le curve di Bezier, e sostituendole con righe dritte, potrei farla con tanti trapezi monocromati, ma uno spettro è sfumato, non fatto di rettangoli monocromatici. Per questo speravo fosse possibile fare uno shading trapezioidale in maniera tale da vedere “aprirsi” la sfumatura.

          Direi che non avevo ben capito io cosa intendevi. In questo caso, per quanto ne so io non si riesce a fare, ma se a) trovi una funzione adatta, b) conosci il PostScript forse riesci a tirare fuori qualcosa dalla sotto sezione 83.2.3 General (Functional) Shadings del pgfmanual.

          Il “problema” è che al momento l’ombreggiatura è definita a partire da un rettangolo, quindi utilizzandola in una forma chiusa stretta in alto e ampia in basso, automaticamente la parte in basso viene usata come parametro di “normalizzazione”. Di conseguenza, nella parte stretta in alto vedi solo parte dell’ombreggiatura perché in realtà è come se in sfondo ci fosse un rettangolo in cui tutto è tagliato tranne la forma chiusa.

          Commenti al codice
          Per prima cosa, non era un vero esempio “minimo” (qualche pacchetto poteva essere levato). 😉

          In genere, preferisco tenere nel preambolo dichiarazioni di ombreggiature e stili. Attenzione anche a caricare [tt]xcolor[/tt]: è meglio passare le opzioni direttamente fra quelle di classe per evitare che copiando/spostando l’ordine di caricamento dei pacchetti si incappi nel classico [tt]option clash[/tt].

          Per evitare di impazzire a mettere i $ per la modalità matematica, è possibile definirsi un semplicissimo stile: `
          \tikzset{math mode/.style={
          execute at begin node=$,
          execute at end node=$,
          }
          }
          ` A questo punto, passare [tt]math mode[/tt] come opzione a [tt]scope[/tt]: `\begin{scope}[font=\tiny, below, math mode]
          % Scala dello spettro
          \node at (-2,2.9) {\SI{0.001}{\nano\meter}};
          \node at (1,2.9) {\SI{1}{\nano\meter}};
          \node at (4,2.9) {\SI{1000}{\nano\meter}};
          \node at (7,2.9) {\SI{1}{\milli\meter}};
          \node at (8,2.9) {\SI{1}{\meter}};
          \node at (10,2.9) {\SI{1}{\kilo\meter}};
          \end{scope}` permette di risparmiare un po’ di fatica. In quel caso, ho anche levato [tt]below[/tt] da tutti i nodi: passandolo a [tt]scope[/tt] è sempre valido.

          Discorso delle [tt]minipage[/tt]s: con TikZ se ne può fare a meno. Infatti, l’opzione [tt]text width[/tt] automaticamente manda a capo il testo. Pertanto ho sfoltito decisamente il codice, ma ho lasciato un errorino: infatti, per [tt]infrarosso (IR)[/tt] ho lasciato un [tt]\centering[/tt] che non produce effetti. Siccome nelle opzioni di [tt]scope[/tt] l’allineamento è a destra (default per tutti i nodi), per renderlo centrale ci sono due strade: [tt]align=center[/tt] oppure [tt]text centered[/tt] (mi pare sia una vecchia chiave, ma non so se deprecata o meno). Quindi: `
          \begin{scope}[right,font=\tiny,right,color=white, text width=1cm]
          % Nome delle onde
          \node at (-2.2,3.6)
          {raggi cosmici};
          \node at (-0.7,3.6)
          {raggi gamma};
          \node at (0.6,3.6)
          {raggi X \phantom{gamma}};
          \node at (2.1,3.6)
          {UV \phantom{gamma}};
          \node[align=center] at (3.4,3.6)
          {infrarosso (IR) };
          \node at (4.8,3.6)
          {microonde \phantom{gamma}};
          \node at (6.6,3.6)
          {radar \phantom{gamma}};
          \node at (7.6,3.6)
          {radio \phantom{gamma}};
          \node at (9.6,3.6)
          {banda larga};
          \end{scope}
          `
          Ciao
          Claudio

        • #85178
          Up
          0
          Down
          ::


          Caro Claudio,

          Grazie mille per i commenti al codice. Ho imparato molte cose dai tuoi aggiustamenti, anche se ancora mi sfugge qualcosa. Se non devo chiamare il pacchetto xcolor perché già caricato da TikZ, tu hai messo le opzioni all’inizio della classe: è un procedimento generale? Se un pacchetto viene caricato da un altro, le opzioni di quello caricato in automatico si mettono nelle opzioni della classe? O vale solo per xcolor?

          Per quanto riguarda lo shading che volevo fare, a me andrebbe bene anche con un trapezio anziché con una curva di Bezier: in quel caso si potrà fare facilmente, magari centrando lo spettro visibile ingrandito in modo che il trapezio sia equilatero? Anche in quel caso bisogna usare una funzione generale oppure è più semplice?

          Mi scuso per le domande forse un po’ ovvie leggendo attentamente la guida TikZ, ma io conosco pochissimo l’inglese e non riesco a decifrare la guida se la parte non ha un esempio simile a quello che voglio fare, visto che in quel caso, manipolando l’esempio, mi rendo conto empiricamente di cosa succede! È un po’ broccione fare così, ma non credo riuscirò mai ad imparare l’inglese… e questo, suo malgrado, @OldClaudio lo sa fin troppo bene 🙁

          Ciao e grazie,

          Andrea

        • #85179
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::

            cfiandra” post=84613Rispondo a Roberto ed Andrea e poi commento il codice del messaggio precedente.

            Ciao,
            perché usi \phantom{gamma}?

            Dunque, nel codice originale c’erano dei [tt]\null[/tt] che non conosco come comando, ma ho intuito che lo scopo era quello di “far occupare” spazio nella riga successiva i [tt]\\[/tt]: in questo modo tutti i testi erano “allineati” in alto e quelli corti non centralmente. Stesso fine del comando [tt]\phantom[/tt], ma occorre avere buon senso nel scegliere l’argomento: io ho scelto [tt]gamma[/tt] perché era l’unica parola con una [tt]g[/tt] e pertanto permette di “far occupare” il giusto spazio. Teoricamente però se si ri-usano [tt]\\ \null[/tt] dovrebbe andare bene comunque.

            Non basta l’opzione:
            `text depth=0pt`
            🙂
            R.

          • #85180
            Liverpool
            Partecipante
              Up
              0
              Down
              ::


              Scusate: il giallo a 670 nanometri? Ma che spettro è?! I colori dovrebbero rispettare i rapporti tra le frequenze/lunghezze d’onda.
              Perché poi, ad essere pignoli come un professore di Fisica degli anni 60, il colore è una caratteristica che dipende dalla frequenza e non dalla lunghezza d’onda.

              Ciao

              P.S. vado a bermi la mia camomilla!

            • #85181
              Up
              0
              Down
              ::

              Liverpool” post=84620Scusate: il giallo a 670 nanometri? Ma che spettro è?! I colori dovrebbero rispettare i rapporti tra le frequenze/lunghezze d’onda.
              Perché poi, ad essere pignoli come un professore di Fisica degli anni 60, il colore è una caratteristica che dipende dalla frequenza e non dalla lunghezza d’onda.

              Ciao

              P.S. vado a bermi la mia camomilla!

              Colpa mia: avevo messo le frequenze sopra e le lunghezze d’onda sotto, ma con gli aggiustamenti ho tolto le frequenze e non ho sostituito le lunghezze d’onda con le frequenze. Nella prima brocciona prova che avevo fatto ero stato attento al rapporto tra i colori e le lunghezze d’onda (nel vuoto), ma avevo fatto tanti rettangoli e gestivo meglio le distanze tra i punti ora lo spettro è un po’ dilatato rispetto a prima. Proverò a sistemarlo.

              Andrea

            • #85182
              Up
              0
              Down
              ::


              Questa configurazione dello shading dovrebbe fornire lo spettro più aderente alla realtà. L’ho fatto empiricamente, sicché probabilmente si può fare molto meglio!

              `
              % Spectrum-def
              \pgfdeclarehorizontalshading{rainbow}{100bp}{
              color(0bp)=(violet); color(25bp)=(violet);
              color(35bp)=(blue); color(40bp)=(cyan);
              color(50bp)=(green); color(53bp)=(yellow);
              color(63bp)=(red); color(100bp)=(DarkRed!40!black)}
              `

              Ciao,

              Andrea

            • #85183
              Liverpool
              Partecipante
                Up
                0
                Down
                ::

                logos” post=84622Colpa mia: avevo messo le frequenze sopra e le lunghezze d’onda sotto, ma con gli aggiustamenti ho tolto le frequenze e non ho sostituito le lunghezze d’onda con le frequenze.

                Tranquillo! Le lunghezze d’onda per i colori le usano tutti, anche i Fisici.
                Ma quanto ti serve essere preciso? Perché sul manuale di [tt]xcolor[/tt] nel paragrafo 6.3.12 ci sono le formule utilizzate per convertire i colori dalle lunghezze d’onda alle terne rgb che puoi usare nella lista di colori dell’ombreggiatura. Potresti costruirti una funzione definita a tratti utilizzando quelle formule e provare con un ciclo a riempire tutto lo spettro.
                Oppure, se hai fretta, potresti sceglierti poche lunghezze d’onda (diciamo una decina), ricavarti manualmente i corrispondenti valori rgb ed utilizzarli per lo spazio di colore, rispettando i rapporti tra le lunghezze d’onda.

                Ciao

              • #85184
                Up
                0
                Down
                ::

                Liverpool” post=84627

                Colpa mia: avevo messo le frequenze sopra e le lunghezze d’onda sotto, ma con gli aggiustamenti ho tolto le frequenze e non ho sostituito le lunghezze d’onda con le frequenze.

                Tranquillo! Le lunghezze d’onda per i colori le usano tutti, anche i Fisici.
                Ma quanto ti serve essere preciso? Perché sul manuale di [tt]xcolor[/tt] nel paragrafo 6.3.12 ci sono le formule utilizzate per convertire i colori dalle lunghezze d’onda alle terne rgb che puoi usare nella lista di colori dell’ombreggiatura. Potresti costruirti una funzione definita a tratti utilizzando quelle formule e provare con un ciclo a riempire tutto lo spettro.
                Oppure, se hai fretta, potresti sceglierti poche lunghezze d’onda (diciamo una decina), ricavarti manualmente i corrispondenti valori rgb ed utilizzarli per lo spazio di colore, rispettando i rapporti tra le lunghezze d’onda.

                Ciao

                Il metodo che hai appena citato era proprio quello che avrei voluto fare. Però non sono stato in grado di fare un ciclo perché non so come far collimare il comando [tt]\color[wave]{555}[/tt] con l’opzione fill all’interno di un rettangolo, oppure per fare uno shading ad hoc.

                Volendo rispondere alla tua domanda: fosse per me, sarei preciso fino al massimo dell’umanamente possibile!

                Ciao,

                Andrea

              • #85185
                Liverpool
                Partecipante
                  Up
                  0
                  Down
                  ::

                  logos” post=84628non so come far collimare il comando [tt]\color[wave]{555}[/tt] con l’opzione fill all’interno di un rettangolo, oppure per fare uno shading ad hoc.

                  Se vuoi usare il modello [tt]wave[/tt] in [tt]TikZ[/tt], devi caricare prima il pacchetto [tt]xcolor[/tt] con l’opzione [tt]rgb[/tt] in modo tale che i colori vengano convertiti direttamente nello spazio di colore rgb, che è supportato direttamente da [tt]TikZ[/tt] (al contrario di wave).
                  Se ho ben capito, tu avresti voluto fare una cosa del genere (puoi aumentare o ridurre a piacere il numero di colori):
                  `\documentclass{standalone}
                  \usepackage[rgb]{xcolor}
                  \usepackage{tikz}
                  \usetikzlibrary{arrows}
                  \usepackage{siunitx}
                  \def\n{400} % numero di colori
                  \def\x{10cm} % lunghezza dello spettro

                  \begin{document}
                  \begin{tikzpicture}
                  \foreach \i in {1,…,\n} {
                  \pgfmathsetmacro{\L}{380+400/(\n-1)*(\i-1)}
                  \definecolor{temp}{wave}{\L}
                  \fill ({(\i-1)/\n*\x},0) rectangle +({\x/\n},1cm);
                  }
                  \draw

                  node [below=1cm, font=\footnotesize] {$\frac{\nu}{\SI{1}{THz}}$}
                  (0,-1) — (\x,-1) node [above, font=\footnotesize] {$\frac{\lambda_0}{\SI{1}{nm}}$};
                  \foreach \i in {400,450,…,750}
                  \draw ({(\i-380)/400*\x},-0.95) — +(0,-0.05) node [above, font=\footnotesize] {\i};
                  \foreach \i in {750,700,…,400}
                  \draw ({(789.47-\i)/404.86*\x},-1.05) — +(0,0.05) node [below, font=\footnotesize] {\i};
                  \end{tikzpicture}
                  \end{document}`

                  [attachment=684]prova1.png[/attachment]
                  Occhio che, se provi a rasterizzare l’immagine, potresti avere l’effetto indesiderato “mille righe”, che puoi avere anche su alcuni visualizzatori rapidi ma meno accurati. Se hai questo problema, sostituisci il [tt]fill[/tt] con questa riga:
                  `\fill ({(\i-1)/\n*\x},0) rectangle +({\x/\n+0.2pt},1cm);`
                  nella quale il valore di 0.2 punti (7 centesimi di millimetro) è aggiunto proprio per coprire eventuali “buchi”. E per essere proprio pignoli, subito dopo il primo ciclo inserisci questa riga che serve a rimuovere l’ultima linea spuria di 0.2 punti:
                  `\draw [white, line width=0.2pt] ({\x+0.1pt},0) — +(0,1cm);`
                  Ciao

                  Osservazione: nei calcoli le divisioni precedono le moltiplicazioni per evitare di sforare la dimensione massima consentita da TikZ che, se non sbaglio, è intorno a 19 piedi.

                  Attachments:
                  You must be logged in to view attached files.
                • #85186
                  Up
                  0
                  Down
                  ::

                  robitex” post=84618

                  Rispondo a Roberto ed Andrea e poi commento il codice del messaggio precedente.

                  [quote=”robitex” post=84587]Ciao,
                  perché usi \phantom{gamma}?

                  Dunque, nel codice originale c’erano dei [tt]\null[/tt] che non conosco come comando, ma ho intuito che lo scopo era quello di “far occupare” spazio nella riga successiva i [tt]\\[/tt]: in questo modo tutti i testi erano “allineati” in alto e quelli corti non centralmente. Stesso fine del comando [tt]\phantom[/tt], ma occorre avere buon senso nel scegliere l’argomento: io ho scelto [tt]gamma[/tt] perché era l’unica parola con una [tt]g[/tt] e pertanto permette di “far occupare” il giusto spazio. Teoricamente però se si ri-usano [tt]\\ \null[/tt] dovrebbe andare bene comunque.

                  Non basta l’opzione:
                  `text depth=0pt`
                  🙂
                  R.[/quote] Ah… ecco un’opzione che non avevo ancora usato 🙂 Si, in effetti è notevolmente più comodo così: `
                  \begin{scope}[right,font=\tiny,right,color=white, text width=1cm,text depth=0pt]
                  % Nome delle onde
                  \node at (-2.2,3.6)
                  {raggi cosmici};
                  \node at (-0.7,3.6)
                  {raggi gamma};
                  \node at (0.6,3.6)
                  {raggi X};
                  \node at (2.1,3.6)
                  {UV};
                  \node[align=center] at (3.4,3.6)
                  {infrarosso (IR) };
                  \node at (4.8,3.6)
                  {microonde};
                  \node at (6.6,3.6)
                  {radar};
                  \node at (7.6,3.6)
                  {radio};
                  \node at (9.6,3.6)
                  {banda larga};
                  \end{scope}
                  `

                  Ciao
                  Claudio

                • #85187
                  Up
                  0
                  Down
                  ::


                  Torno a ripetere che i raggi cosmici non c’entrano niente con lo spettro elettromagnetico

                • #85188
                  Up
                  0
                  Down
                  ::

                  logos” post=84616Caro Claudio,

                  Grazie mille per i commenti al codice. Ho imparato molte cose dai tuoi aggiustamenti, anche se ancora mi sfugge qualcosa. Se non devo chiamare il pacchetto xcolor perché già caricato da TikZ, tu hai messo le opzioni all’inizio della classe: è un procedimento generale? Se un pacchetto viene caricato da un altro, le opzioni di quello caricato in automatico si mettono nelle opzioni della classe? O vale solo per xcolor?

                  Onestamente è un procedimento che ho visto solo con [tt]xcolor[/tt] e TikZ/pgfplots perciò ad intuizione direi che vale quando un pacchetto [tt]x[/tt] viene caricato da un altro senza opzioni particolari e nel documento si carica [tt]x[/tt] con opzioni diverse.

                  logos” post=84616
                  Per quanto riguarda lo shading che volevo fare, a me andrebbe bene anche con un trapezio anziché con una curva di Bezier: in quel caso si potrà fare facilmente, magari centrando lo spettro visibile ingrandito in modo che il trapezio sia equilatero? Anche in quel caso bisogna usare una funzione generale oppure è più semplice?

                  Purtroppo no, nel senso che PGF definisce solo 3 tipi di shading: orizzontale, verticale e radiale. Capisco che con il trapezio sembri più facile, ma non è così. La mia osservazione è sempre valida: l’ombreggiatura tiene come riferimento la parte più ampia della forma. Prova a compilare questo esempio e capirai cosa intendo:`
                  \documentclass[dvipsnames*,svgnames,border=10pt,tikz]{standalone}
                  \usepackage{tikz}
                  \usetikzlibrary{shapes.geometric}

                  % Spectrum-def
                  \pgfdeclarehorizontalshading{rainbow}{100bp}{
                  color(0bp)=(violet); color(25bp)=(violet);
                  color(35bp)=(blue); color(40bp)=(cyan);
                  color(50bp)=(green); color(53bp)=(yellow);
                  color(63bp)=(red); color(100bp)=(DarkRed!40!black)}

                  \begin{document}

                  \begin{tikzpicture}
                  \node[minimum width=8.65cm,minimum height=4cm,rectangle, shading=rainbow,draw,ultra thick](x){};
                  \node[minimum size=4cm,trapezium, shading=rainbow,draw,ultra thick]at (x.center){};
                  \end{tikzpicture}

                  \end{document}
                  ` Il trapezio viene disegnato sopra un rettangolo e i due hanno la stessa base.

                  Ciao
                  Claudio

                • #85189
                  Up
                  0
                  Down
                  ::


                  Grazie a tutti per i commenti e i codici che avete proposto e manipolato. Ho imparato molto con le vostre osservazioni, ed ora lo spettro è molto più bello!

                  Grazie di cuore,

                  Andrea

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

              Go to top