Tikz – calcolo delle coordinate

  • Creatore
    Topic
  • #112762
    Up
    0
    Down
    ::


    Dovendo trattare dell’ottica legata all’arcobaleno, mi trovo a riprodurre con Tikz una figura simile a questa:
    https://it.wikipedia.org/wiki/Arcobaleno#/media/File:Rainbowrays.png

    Con ricerche e (poca) fantasia ho tirato fuori il seguente codice:
    `\documentclass{article}
    \usepackage{tikz}

    \usepackage[active,tightpage]{preview}
    \PreviewEnvironment{tikzpicture}
    \setlength\PreviewBorder{10pt}

    \usetikzlibrary{calc,decorations.markings}

    \begin{document}

    \begin{tikzpicture}[xscale=-1]

    % raggio della goccia
    \pgfmathsetlengthmacro{\r}{3cm}

    %\pgfmathsetlengthmacro{\f}{.7}

    % per ogni raggio incidente a varie altezze si disegna il percorso interno e in uscita
    \foreach \f in {0.01, 0.02, …, 1} {

    % calcolo del raggio di incidenza
    \pgfmathsetmacro{\incidentangle}{asin(\f)};

    % coordinate dell'origine e del punto di ingresso
    \coordinate (O) at (0,0);
    \coordinate (A) at (\incidentangle:\r);

    % disegno della goccia e del raggio incidente
    \draw (O) circle (\r);
    \draw (A -| \r*2, 0) — (A);

    % calcolo dell'angolo di rifrazione
    \pgfmathsetmacro{\refractedangle}{asin(sin(\incidentangle) / 1.33)}

    % calcola l'angolo al vertice (in O) del triangolo formato da O, dal punto di entrata e da quello di riflessione interna
    \pgfmathsetmacro{\angleindrop}{180 – 2*\refractedangle}

    % coordinate del punto di riflessione
    \coordinate (A') at (\incidentangle+\angleindrop:\r);
    % coordinate del punto di uscita
    \coordinate (A'') at (\incidentangle+2*\angleindrop:\r);

    \begin{scope}[opacity=.5]
    % disegno dei raggi luminosi
    \draw (A) — (A');
    \draw (A') — (A'');
    \draw (A'') — ($(A'')+(2*\incidentangle+2*\angleindrop:\r)$);
    \end{scope}
    }

    \end{tikzpicture}

    \end{document}`

    il quale compila e rende bene l’idea.
    L’unica cosa, vorrei che i raggi in uscita siano limitati in una zona rettangolare come nel link. Per farlo dovrei modificare in qualche modo `\draw (A'') — ($(A'')+(2*\incidentangle+2*\angleindrop:\r)$);`, ma non ho idea di come si faccia…

    Vi ringrazio in anticipo

Visualizzazione 3 filoni di risposte
  • Autore
    Risposte
    • #112763
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::


        Ciao.
        Opzione clip?
        R.

      • #112764
        Up
        0
        Down
        ::


        Ciao robitex, è proprio quello che serve! Grazie.

        Per completezza allego il codice con l’aggiunta
        `\documentclass{article}
        \usepackage{tikz}

        \usepackage[active,tightpage]{preview}
        \PreviewEnvironment{tikzpicture}
        \setlength\PreviewBorder{10pt}

        \usetikzlibrary{calc,decorations.markings}

        \begin{document}

        \begin{tikzpicture}[xscale=-1]

        % raggio della goccia
        \pgfmathsetlengthmacro{\r}{3cm}

        % OPZIONE CLIP!!!
        %%%%%%%%%%%%%%%%%%%%%%
        \clip (-1*\r,\r) rectangle (3*\r,-3*\r);
        %%%%%%%%%%%%%%%%%%%%%%

        % per ogni raggio incidente a varie altezze si disegna il percorso interno e in uscita
        \foreach \f in {0.01, 0.02, …, 1} {

        % calcolo del raggio di incidenza
        \pgfmathsetmacro{\incidentangle}{asin(\f)};

        % coordinate dell'origine e del punto di ingresso
        \coordinate (O) at (0,0);
        \coordinate (A) at (\incidentangle:\r);

        % disegno della goccia e del raggio incidente
        \draw (O) circle (\r);
        \draw (A -| \r*3, 0) — (A);

        % calcolo dell'angolo di rifrazione
        \pgfmathsetmacro{\refractedangle}{asin(sin(\incidentangle) / 1.33)}

        % calcola l'angolo al vertice (in O) del triangolo formato da O, dal punto di entrata e da quello di riflessione interna
        \pgfmathsetmacro{\angleindrop}{180 – 2*\refractedangle}

        % coordinate del punto di riflessione
        \coordinate (A') at (\incidentangle+\angleindrop:\r);
        % coordinate del punto di uscita
        \coordinate (A'') at (\incidentangle+2*\angleindrop:\r);

        \begin{scope}[opacity=.7]
        % disegno dei raggi luminosi
        \draw (A) — (A');
        \draw (A') — (A'');
        \draw (A'') — ($(A'')+(2*\incidentangle+2*\angleindrop:\r*4)$);
        \end{scope}
        }

        \end{tikzpicture}

        \end{document}`

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

          MarcoRiggirello” post=113102Ciao robitex, è proprio quello che serve! Grazie.

          Per completezza allego il codice con l’aggiunta
          `\documentclass{article}
          \usepackage{tikz}

          \usepackage[active,tightpage]{preview}
          \PreviewEnvironment{tikzpicture}
          \setlength\PreviewBorder{10pt}

          \usetikzlibrary{calc,decorations.markings}

          \begin{document}

          \begin{tikzpicture}[xscale=-1]

          % raggio della goccia
          \pgfmathsetlengthmacro{\r}{3cm}

          % OPZIONE CLIP!!!
          %%%%%%%%%%%%%%%%%%%%%%
          \clip (-1*\r,\r) rectangle (3*\r,-3*\r);
          %%%%%%%%%%%%%%%%%%%%%%

          % per ogni raggio incidente a varie altezze si disegna il percorso interno e in uscita
          \foreach \f in {0.01, 0.02, …, 1} {

          % calcolo del raggio di incidenza
          \pgfmathsetmacro{\incidentangle}{asin(\f)};

          % coordinate dell'origine e del punto di ingresso
          \coordinate (O) at (0,0);
          \coordinate (A) at (\incidentangle:\r);

          % disegno della goccia e del raggio incidente
          \draw (O) circle (\r);
          \draw (A -| \r*3, 0) — (A);

          % calcolo dell'angolo di rifrazione
          \pgfmathsetmacro{\refractedangle}{asin(sin(\incidentangle) / 1.33)}

          % calcola l'angolo al vertice (in O) del triangolo formato da O, dal punto di entrata e da quello di riflessione interna
          \pgfmathsetmacro{\angleindrop}{180 – 2*\refractedangle}

          % coordinate del punto di riflessione
          \coordinate (A') at (\incidentangle+\angleindrop:\r);
          % coordinate del punto di uscita
          \coordinate (A'') at (\incidentangle+2*\angleindrop:\r);

          \begin{scope}[opacity=.7]
          % disegno dei raggi luminosi
          \draw (A) — (A');
          \draw (A') — (A'');
          \draw (A'') — ($(A'')+(2*\incidentangle+2*\angleindrop:\r*4)$);
          \end{scope}
          }

          \end{tikzpicture}

          \end{document}`

          Ciao.
          Non sono un po’ troppo fitte le linee?
          R.

        • #112766
          Up
          0
          Down
          ::


          Si, hai ragione, per le dimensioni specificate sono un po’ troppo fitte. In realtà l’effetto era un po’ voluto: vorrei che rimanesse una forte densità di linee proprio per evidenziare l’angolo in cui si concentra maggiormente la deflessione (questo è lo scopo della figura).

          A questo punto mi sembra giusto chiedere qual è la minima distanza tra le linee che non compromette la chiarezza del risultato…

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

      Go to top