File:InterferenceGrating.gif

Summary

Description
English: Spectroscopy with an optical grating
Deutsch: Optisches Gitter: Beugungsordnungen und Spektroskopie
Date
Source Own work
Author And1mu

Similar graphics

Source Code

created with LaTeX and PGF/TikZ

Script to create the animation:

#!/bin/bash

set -eu
DIR="animate"
FILE="Spektrum"

NUM=0
rm -f ${DIR}/frame???.png

for ANG in $(seq 400 10 700) ; do
#    POS=$(echo "30*c($ANG/45*a(1))" | bc -l)
    echo $ANG
    sed -i "s/\\\def\\\wavelength{.\+}/\\\def\\\wavelength{$ANG}/" $FILE.tex
#    echo "Creating frame $NUM for $ANG ..."
    pdflatex -shell-escape $FILE.tex 1> /dev/null
    echo "Convert to png ..."
    NUMSTR=$(printf "%03d" $NUM)
    convert -density 100 ${FILE}01.svg -shave 3 ${DIR}/frame${NUMSTR}.png
    NUM=$(($NUM+1))
done
cd $DIR
#convert -delay 40 -loop 1000 frame*.png  ${FILE}.gif
convert -set delay '%[fx:(t<n-1)?20:1000]' -loop 100 frame*.png  ${FILE}.gif
cd -

The code to create a single frame:

\documentclass[crop,border=5,tikz,convert={outext=,
  command=\unexpanded{pdf2svg \infile\space\outfile\%02d.svg
    all}},multi=false]{standalone}
\usetikzlibrary{math,calc,through,shapes,patterns,decorations.pathmorphing}
\usepackage{ifthen}
\usepackage{bm}

\def\static{1} % 1: for static graphic

\def\lpmm{625}
\def\wavelength{700}

\newcommand{\markangle}[6][0.25]{
  \begin{scope}
    \clip (#2)--(#3)--(#4);
    \node (ANG) [draw, circle, minimum size=#5] at (#3){};
  \end{scope}
  \coordinate (E1) at (intersection 0 of ANG and #3--#2);
  \coordinate (E2) at (intersection 0 of ANG and #3--#4);
  %\draw[thick] (E1) to [bend right=50] (E2);
  \coordinate (EM) at ($ (E1)!0.5!(E2) $);
  \coordinate (EM) at ($ (EM)!#1!(#3) $);
  \node[fill=white, inner sep=2] at (EM) {#6};
}

\newcommand{\rainbow}[1]{
  %% #1 = 0: circle, #1 = 1: rectangle
  \foreach \n in {1,...,10}{
    \foreach \swl in {400,403,...,\wavelength}{
      \pgfmathsetmacro{\myarg}{ \n*\swl/1000.*\lpmm/1000 }
      \pgfmathsetmacro{\myarg}{ \myarg < 0.98 ? \myarg : 0}
      \ifthenelse{\lengthtest{ \myarg pt = 0 pt}}{}{
        \LAMBDAtoRGB{\swl}
        \tikzmath{ \myalpha = asin(\myarg);}
        \tikzmath{ \mx = 7*tan(\myalpha);}
        \tikzmath{ \mn = \n*\n;}
        \ifthenelse{ #1 = 0 }{
          \coordinate (A+) at (90-\myalpha:6+0.075*\mn);
          \coordinate (B+) at (90-\myalpha:8-0.075*\mn);
          \coordinate (A-) at (90+\myalpha:6+0.075*\mn);
          \coordinate (B-) at (90+\myalpha:8-0.075*\mn);
          \pgfmathsetmacro{\mywidth}%
          {0.14*\n*\lpmm/100/sqrt(1-\myarg*\myarg)}
        }{
          \coordinate (A+) at (-\mx,6.05+0.05*\mn);
          \coordinate (B+) at (-\mx,7.95-0.05*\mn);
          \coordinate (A-) at (\mx,6.05+0.05*\mn);
          \coordinate (B-) at (\mx,7.95-0.05*\mn);
          \pgfmathsetmacro{\mywidth}{\myarg < 0.92 ?%
            0.4*\n*3/10*\lpmm/100/(1-\myarg*\myarg)^(3/2)%
            : 0}
        }
        \draw[beamcolor,line width=\mywidth] (A+)--(B+);
        \draw[beamcolor,line width=\mywidth] (A-)--(B-);
        \ifthenelse{ \static = 1 }{
          \ifthenelse{ \swl = 502 }{
            \ifthenelse{ #1 = 0 }{
              \node[] at (90+\myalpha:8.3){$+\n$};
              \node[] at (90-\myalpha:8.3){$-\n$};
            }{
              \pgfmathsetmacro{\mxm}{\mx > 12 ? 11 : \mx}
              \node[] at (-\mxm,8.3){$+\n$};
              \node[] at (\mxm,8.3){$-\n$};
            }
          }{}
        }{}
      }{}
    }
  }
}

\newcommand{\drawbeam}[2]{
  \pgfmathsetmacro{\myarg}{ \n*#1/1000.*\lpmm/1000 }
  \pgfmathsetmacro{\myarg}{ \myarg < 0.98 ? \myarg : 0 }
  \ifthenelse{\lengthtest{\myarg pt = 0 pt}}{}{
    \tikzmath{ \myalpha = asin(\myarg); }
    \LAMBDAtoRGB{#1}
    \ifthenelse{ #2 = 0 }{
      \coordinate (A+) at (90+\myalpha:8);
      \coordinate (A-) at (90-\myalpha:8);
    }{
      \tikzmath{ \mx = 7*tan(\myalpha); }
      \coordinate (A+) at (-\mx,7);
      \coordinate (A-) at (\mx,7);
      \draw[beamcolor,thick] (\mx,6)--(\mx,8);
      \draw[beamcolor,thick] (-\mx,6)--(-\mx,8);
    }
    \draw[beamcolor,thick] (A+) -- (0,0) -- (A-);
    \ifthenelse{ \static = 0 }{
      \node[beamcolor,fill=white] at (90+\myalpha:5) {$+\n$};
      \node[beamcolor,fill=white] at (90-\myalpha:5) {$-\n$};
      \node[anchor=west,beamcolor] at (0.7,-1.2){
        \Large $\bm{\lambda=#1\;\mathrm{nm}}$};
      \ifthenelse{\n < 3}{
        \markangle[0.1]{A+}{0,0}{0,6}{220-50*\n}{$\alpha_\n$}
        \pgfmathprintnumberto[precision=2]{\myalpha}{\roundedalpha}
        \node[anchor=west,beamcolor] at (4,-0.3-0.6*\n){
          $\bm{\alpha_\n=\roundedalpha^\circ}$};
      }{}
    }{
      \ifthenelse{ \n = 1 \AND #1 = 430 }{
        \markangle[0.1]{A+}{0,0}{0,6}{220-50*\n}{$\alpha_\n$}
      }{}
    }
  }
}

\newcommand{\info}[2]{
  \LAMBDAtoRGB{#1}
  \node[anchor=west,beamcolor,fill=white] at (0.7,-0.3-#2*0.5){
    \Large $\bm{\lambda=#1\;\mathrm{nm}}$};
  \draw[beamcolor,fill=beamcolor]
  (-0.4,-0.1-0.5*#2)rectangle(0.4,-0.6-0.5*#2);
}

\newcommand{\laser}{
  \LAMBDAtoRGB{\wavelength}
  \draw[white,line width=1.4mm] (0,6.2)--(0,7.8);
  \draw[beamcolor,thick] (0,0) -- (0,8);
  \ifthenelse{ \static = 0 }{
    \fill[beamcolor] (-0.4,-2)rectangle(0.4,-0.6);
    \node[beamcolor,fill=white] at (0,5){$0$};
  }{
    \node[] at (0,8.3){$0$};
  }
  \draw[beamcolor,ultra thick] (0,-0.6) -- (0,0);
  \draw[black,ultra thick,opacity=0.6] (-1,0)--(1,0)
  node[right]{\LARGE $g=\frac{1}{\lpmm}\;\mathrm{mm}$};
  \node[anchor=east,draw,text width=3.5cm,text centered] at
  (-1.5,-0.4){
    \LARGE $\sin\alpha_n=\frac{n\cdot\lambda}{g}$\\
    \normalsize $n=0,\pm 1,\pm 2,\dots$};
}

\begin{document}

\include{LaserColor}

\begin{tikzpicture}[>=latex,scale=1]
  \clip(-8.4,-2.4)rectangle(8.4,8.5);
  \begin{scope}
    \clip (168.8:8)arc(168.8:11.2:8)--(11.2:6)arc(11.2:168.8:6)--cycle;
    \fill[black] (0,0) circle (8);
    \fill[white] (0,0) circle (6.0);
  \end{scope}
  \foreach \n in {1,...,10}{
    \ifthenelse{ \static = 0 }{
      \drawbeam{\wavelength}{0}
    }{
      \foreach \wl/\s in {430/1,532/2,633/3}{
        \drawbeam{\wl}{0}
        \info{\wl}{\s}
      }
    }
  }
  \rainbow{0}
  \laser
\end{tikzpicture}

\begin{tikzpicture}[>=latex,scale=1]
  \clip(-12.4,-2.4)rectangle(12.4,8.5);
  \fill[black](-12.4,6)rectangle(12.4,8);
  \rainbow{1}
  \foreach \n in {1,...,10}{
    \ifthenelse{ \static = 0 }{
      \drawbeam{\wavelength}{1}
    }{
      \foreach \wl/\s in {430/1,532/2,633/3}{
        \drawbeam{\wl}{1}
        \info{\wl}{\s}
      }
    }
  }
  \laser
\end{tikzpicture}

\end{document}

The code to find RGB from wavelenght (slightly modified) LaserColor.tex:

\newcommand{\LAMBDAtoRGB}[1]{
  \def\locallambda{#1}

  \def\red{0.0}
  \def\green{0.0}
  \def\blue{0.0}

  \def\t{0.0}

  \tikzmath{
    if ( \locallambda >= 400.0 && \locallambda < 410.0 ) then {
      \t = (\locallambda-400.0)/(410.0-400.0);
      \red = (0.345*\t)-(0.20*\t*\t);
    } else {
      if ( \locallambda >= 410.0 && \locallambda < 475.0) then {
        \t = (\locallambda-410.0)/(475.0-410.0);
        \red = 0.15-(0.15*\t*\t);
      } else {
        if ( \locallambda >= 545.0 && \locallambda < 595.0 ) then {
          \t = (\locallambda-545.0)/(595.0-545.0);
          \red = +(1.98*\t)-(\t*\t);
        } else {
          if ( \locallambda >= 595.0 && \locallambda < 650.0 ) then {
            \t = (\locallambda-595.0)/(650.0-595.0);
            \red = 0.98+(0.06*\t)-(0.40*\t*\t);
          } else {
            if ( \locallambda >= 650.0 && \locallambda < 700.0 ) then {
              \t = (\locallambda-650.0)/(700.0-650.0);
              \red = 0.64-(0.84*\t)+(0.20*\t*\t);
            };
          };
        };
      };
    };
  }

  \tikzmath{
    if ( \locallambda >= 415.0 && \locallambda < 475.0 ) then {
      \t = (\locallambda-415.0)/(475.0-415.0);
      \green = +(0.80*\t*\t);
    } else {
      if ( \locallambda >= 475.0 && \locallambda < 590.0 ) then {
        \t = (\locallambda-475.0)/(590.0-475.0);
        \green = 0.8 +(0.76*\t)-(0.80*\t*\t);
      } else {
        if ( \locallambda >= 590.0 && \locallambda < 639.0 ) then {
          \t = (\locallambda-590.0)/(639.0-590.0);
          \green = 0.76-(0.76*\t);
        };
      };
    };
  }

  \tikzmath{
    if ( \locallambda >= 400.0 && \locallambda < 475.0 ) then {
      \t = (\locallambda-400.0)/(475.0-400.0);
      \blue = +(2.20*\t)-(1.50*\t*\t);
    } else {
      if ( \locallambda >= 475.0 && \locallambda < 560.0 ) then {
        \t = (\locallambda-475.0)/(560.0-475.0);
        \blue = 0.7 -(\t)+(0.30*\t*\t);
      };
    };
  }
  \definecolor{beamcolor}{rgb}{\red,\green,\blue}
}

Licensing

I, the copyright holder of this work, hereby publish it under the following license:
w:en:Creative Commons
attribution share alike
This file is licensed under the Creative Commons Attribution-Share Alike 4.0 International license.
You are free:
  • to share – to copy, distribute and transmit the work
  • to remix – to adapt the work
Under the following conditions:
  • attribution – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
  • share alike – If you remix, transform, or build upon the material, you must distribute your contributions under the same or compatible license as the original.
Category:CC-BY-SA-4.0#InterferenceGrating.gif
Category:Self-published work Category:Interferometry Category:Gratings Category:Spectroscopy Category:Physics diagrams Category:Animated GIF files
Category:Animated GIF files Category:CC-BY-SA-4.0 Category:Gratings Category:Interferometry Category:Physics diagrams Category:Self-published work Category:Spectroscopy