Hallo liebe Community,
Wieder Mal ein kleines Tutorial von mir. Und zwar zu einem meiner Lieblings-Themen:
Genaugenommen geht es heute darum, wie man mit
Bilder erzeugen mit
Mit
Voraussetzungen:
Als Beispiel für dieses Tutorial nehme ich meine
TeX-Datei
Das ergibt nach der Kompilierung mit
Damit wirft die Klasse nach der Kompilation den Magick-Compiler an, welcher dann die gewünschte PNG-Datei ausgibt, die dann so aussieht:
GIFs erzeugen mt
Nun sind bewegte Bilder natürlich etwas anschaulicher. Dafür eigenen sich GIF-Dateien für Forumsbeiträge wohl am ehesten. Wieder nutzen wir den Beispielcode, geben uns aber für jedes Frame eine einzelne Seite aus, wofür wir den Hintergrund einfärben müssen, da sich sonst die einzelnen Frames überlappen. Dies lässt sich mit dem
TeX-Datei
Nach dem Kompilieren mit
Leider können wir hierfür nicht wieder die
Hiermit werden alle PDFs zu GIFs konvertiert. Und dies mit 5*10ms=50ms pro Frame => 20fps. Das Endresultat sieht so aus:
Hier noch ein paar Beispiele zur "Inspiration":
Drehung eines Kubus mit mehreren liegenden Quader.
TeX-Code
Sloppy Animation des Zusammenhanges einer Funktion und ihres Integrals.
TeX-Code
Runge-Kutta: Heun-Verfahren der dritten Ordnung. Zusammenhang zwischen Schrittweite und Fehler.
TeX-Code
So, ich denke, das sollte genügen.
Mit freundlichen Grüssen,
Higlav
Wieder Mal ein kleines Tutorial von mir. Und zwar zu einem meiner Lieblings-Themen:
$\LaTeX$
!Genaugenommen geht es heute darum, wie man mit
$\LaTeX$
Animationen erstellen kann, welche dann als GIF-Bildle hier ins Forum eingebunden werden können. Leider ist das ein etwas komplexerer und anspruchsvollerer Vorgang, als einfach Formeln darzustellen - ein gewisses Grundverständnis für $\LaTeX$
ist deshalb vorrausgesetzt. Aber vielleicht genügt es dem Einen oder Anderen die kommenden Beispiele etwas zu modifizieren.Bilder erzeugen mit
$\LaTeX$
Mit
$\LaTeX$
lassen sich angenehme und schöne PDF's erstellen. Diese sind im Idealfall zwar schön anzusehen, lassen sich aber nicht unbedingt schön in einem Forumspost einbinden. Dem sei nun Abhilfe geschaffen: Die Grafik lässt sich anhand eines Zusatztools(ebenso plattformunabhängig wie $\LaTeX$
selbst) zu einem angenehm handlichen PNG konvertieren.Voraussetzungen:
- $\TeX$-Distrubution(MikTeX(Windows), TeXLive(Linux), MacTeX(OSX), etc.)
- Nicht notwendig, aber höchst empfehlenswert: $\LaTeX$-Editor/-IDE(TexMaker(alle OS), TeXStudio(Alle OS), etc.)
- ImageMagick(alle OS)
- Ghostscript(Windows und Linux. Mac?)
- Grundkenntnisse in $\LaTeX$
Als Beispiel für dieses Tutorial nehme ich meine
$\TeX$
-Datei, die ich für diese Frage benötigt habe:TeX-Quellcode
- \documentclass[border=10pt]{standalone}
- \usepackage{tikz}
- \begin{document}
- \begin{tikzpicture}
- \def\Radius{3}
- \def\E{2}
- \def\Alpha{30}
- \draw[gray] ({-(\Radius+\E)}, {-(\Radius+\E)}) grid ({\Radius+\E}, {\Radius+\E});
- \draw[-stealth,thick] ({-(\Radius+\E)}, 0) -- ({\Radius+\E}, 0);
- \draw[-stealth,thick] (0, {-(\Radius+\E)}) -- (0, {\Radius+\E});
- \draw[green!60!black] (0, 0) --({\E*cos(\Alpha)},{\E*sin(\Alpha)}) coordinate (krmitte);
- \draw[yellow!50!red, thick] (krmitte) circle (\Radius);
- \draw[red!10!blue] (krmitte) -- (0, {\E*sin(\Alpha)+sqrt(\Radius^2-(\E*cos(\Alpha))^2)}) coordinate (yend);
- \draw[draw=red,very thick,-stealth] (0, 0) -- (yend) node[pos=0.5,anchor=west]{$\textcolor{red}{y}(\alpha)=\textcolor{green!60!black}{e}\sin(\alpha)+\sqrt{\textcolor{red!10!blue}{r}^2-(\textcolor{green!60!black}{e}\cos(\alpha))^2}$};
- \draw[variable=\x,smooth,samples=60,domain={-(\Radius+\E)}:{(\Radius+\E)}] plot ({\x},{\E*sin((\x+\Alpha/180*pi)/pi*180)+sqrt(\Radius^2-(\E*cos((\x+\Alpha/180*pi)/pi*180))^2)});
- \end{tikzpicture}
- \end{document}
Das ergibt nach der Kompilierung mit
PDFLaTeX
ein PDF mit dem Plot. Und zu einer PNG-Datei konvertieren wir es, indem wir bei der Dokumentenklasse ein weiteres optionales Argument übergeben:Damit wirft die Klasse nach der Kompilation den Magick-Compiler an, welcher dann die gewünschte PNG-Datei ausgibt, die dann so aussieht:
GIFs erzeugen mt
$\LaTeX$
Nun sind bewegte Bilder natürlich etwas anschaulicher. Dafür eigenen sich GIF-Dateien für Forumsbeiträge wohl am ehesten. Wieder nutzen wir den Beispielcode, geben uns aber für jedes Frame eine einzelne Seite aus, wofür wir den Hintergrund einfärben müssen, da sich sonst die einzelnen Frames überlappen. Dies lässt sich mit dem
pagecolor
-Paket erreichen, oder indem wir der Tikz-Umgebung einen Hintergrund verpassen. Weiter ist das Paket preview
vonnöten, welches verhindert, dass die einzelnen Tikz-Bilder auf eine Seite gelangen:TeX-Quellcode
- \documentclass{standalone}
- \usepackage{tikz}
- \usetikzlibrary{backgrounds}
- \usepackage[active,tightpage]{preview}\PreviewEnvironment{tikzpicture}
- \begin{document}
- \foreach \iteration in {1,...,90} {
- \begin{tikzpicture}[background rectangle/.style={fill=white}, show background rectangle]
- \def\Radius{3}
- \def\E{2}
- \def\Alpha{0}
- \def\Alpha{(4*\iteration)}
- \draw[gray] ({-(\Radius+\E)}, {-(\Radius+\E)}) grid ({\Radius+\E}, {\Radius+\E});
- \draw[-stealth,thick] ({-(\Radius+\E)}, 0) -- ({\Radius+\E}, 0);
- \draw[-stealth,thick] (0, {-(\Radius+\E)}) -- (0, {\Radius+\E});
- \draw[green!60!black] (0, 0) --({\E*cos(\Alpha)},{\E*sin(\Alpha)}) coordinate (krmitte);
- \draw[yellow!50!red, thick] (krmitte) circle (\Radius);
- \draw[red!10!blue] (krmitte) -- (0, {\E*sin(\Alpha)+sqrt(\Radius^2-(\E*cos(\Alpha))^2)}) coordinate (yend);
- \draw[draw=red,very thick,-stealth] (0, 0) -- (yend) node[pos=0.5,anchor=west]{$\textcolor{red}{y}(\alpha)=\textcolor{green!60!black}{e}\sin(\alpha)+\sqrt{\textcolor{red!10!blue}{r}^2-(\textcolor{green!60!black}{e}\cos(\alpha))^2}$};
- \draw[variable=\x,smooth,samples=60,domain={-(\Radius+\E)}:{(\Radius+\E)}] plot ({\x},{\E*sin((\x+\Alpha/180*pi)/pi*180)+sqrt(\Radius^2-(\E*cos((\x+\Alpha/180*pi)/pi*180))^2)});
- \end{tikzpicture}
- }
- \end{document}
Nach dem Kompilieren mit
PDFLaTeX
haben wir vorerst nur ein PDF mit vielen einzelnen Plots. Um daraus nun eine GIF-Datei zu erstellen, benötigen wir wieder etwas Magic... Ups. Magick.Leider können wir hierfür nicht wieder die
standalone
-Klasse bemühen, da die nur für Konvertierungen zu "statischen" Bildchen nutzbar ist. Das heisst, wir greifen zur Kommandozeile, bzw. Batch-Skripts:Hiermit werden alle PDFs zu GIFs konvertiert. Und dies mit 5*10ms=50ms pro Frame => 20fps. Das Endresultat sieht so aus:
Hier noch ein paar Beispiele zur "Inspiration":
Drehung eines Kubus mit mehreren liegenden Quader.
TeX-Quellcode
- % Original(ohne Rotation) von Jeam-Michel Papy
- \documentclass{standalone}
- \usepackage{tikz}
- \usepackage{pstricks}
- \usepackage{pst-vue3d}
- \usepackage{multido}
- \usetikzlibrary{backgrounds}
- \usepackage[active,tightpage]{preview}\PreviewEnvironment{pspicture}
- \begin{document}
- \foreach \iteration in {0,...,44} {
- \psset{unit=1.5cm}
- \begin{pspicture}[bgcolor=white](-3,-3)(3,3)
- %\psframe(-3.8,-3)(3,3)
- \pgfmathparse{4*\iteration}
- \psset{THETA=\pgfmathresult,PHI=30,Dobs=150,Decran=10}
- %\AxesThreeD[linecolor=red,linestyle=dashed](50,60,50)
- \pNodeThreeD(25,-25,25){A}
- \pNodeThreeD(25,25,25){B}
- \pNodeThreeD(25,25,-25){C}
- \pNodeThreeD(25,-25,-25){D}
- \pNodeThreeD(-25,-25,25){E}
- \pNodeThreeD(-25,25,25){F}
- \pNodeThreeD(-25,25,-25){G}
- \pNodeThreeD(-25,-25,-25){H}
- %%% hidden faces of the exterior cube
- \pspolygon(A)(E)(H)(D)
- \pspolygon(E)(F)(G)(H)
- %%% mode-3 vectors
- \multido{\iZ=-20+10}{5}{%
- \multido{\iY=-20+10}{5}{%
- \CubeThreeD[A=23,B=3,C=3](0,\iY,\iZ)%
- }%
- }%
- %%% front faces of the exterior cube
- \pspolygon(A)(B)(C)(D)
- \pspolygon(B)(F)(G)(C)
- \end{pspicture}
- }
- \end{document}
Sloppy Animation des Zusammenhanges einer Funktion und ihres Integrals.
TeX-Quellcode
- \documentclass{standalone}
- \usepackage{tikz}
- \usepackage{siunitx}
- \usetikzlibrary{backgrounds}
- \usepackage[active,tightpage]{preview}\PreviewEnvironment{tikzpicture}
- \begin{document}
- \foreach \iteration in {0,...,50} {
- \begin{tikzpicture}[background rectangle/.style={fill=white}, show background rectangle]
- \def\xtemp{0.1*\iteration}
- \draw[gray] (-1,-1) grid (5,5);
- \draw[-stealth,thick] (-1,0) -- (5,0) node[anchor=north west] {$x$};
- \draw[-stealth,thick] (0,-1) -- (0,5) node[anchor=south west] {$y$};
- \begin{scope}
- \clip(-1,-1) rectangle (5,5);
- \fill[opacity=0.1,fill=blue,variable=\x,smooth,domain=0:\xtemp] plot ({\x},{-0.5*abs(\x)^2+1.5*\x+0.5}) |- (0,0) -- cycle;
- \draw[blue,variable=\x,smooth,domain=-1:5] plot ({\x},{-0.5*abs(\x)^2+1.5*\x+0.5});
- \draw[red,variable=\x,smooth,domain=0:\xtemp] plot ({\x},{-0.5/3*abs(\x)^3+0.75*abs(\x)^2+0.5*\x});
- \end{scope}
- \pgfmathparse{\xtemp}%
- \edef\xtemp{\pgfmathresult}%
- \node at (2,4.5) {${\color{red}-\frac16x^3+\frac34x^2+\frac12x}=\int\limits_0^{\num[round-mode=places,round-precision=1]{\xtemp}}\left({\color{blue}-\frac12x^2+\frac32x+\frac12}\right)\mathrm dx$};
- \end{tikzpicture}
- }
- \end{document}
Runge-Kutta: Heun-Verfahren der dritten Ordnung. Zusammenhang zwischen Schrittweite und Fehler.
TeX-Quellcode
- \documentclass{standalone}
- \usepackage[utf8]{inputenc}
- \usepackage[german]{babel}
- \usepackage[T1]{fontenc}
- \usepackage{amsmath}
- \usepackage{amsfonts}
- \usepackage{amssymb}
- \usepackage{graphicx}
- \usepackage{lmodern}
- \usepackage{tikz}
- \usepackage{pgfplots}
- \usepackage{tkz-fct}
- \usepackage{printlen}
- \usepackage{numprint}
- \usepackage{etoolbox}
- \usetikzlibrary{decorations.pathreplacing}
- \usepackage{animate}
- \usepackage{ifthen}
- \usetkzobj{all}
- \usetikzlibrary{arrows,calc,intersections}
- \usetikzlibrary{backgrounds}
- \usepackage[active,tightpage]{preview}\PreviewEnvironment{tikzpicture}
- \author{Raphael Emberger}
- \title{Runge-Kutta}
- \newcommand{\f}[2] %f(#1, #2)=f(t, x)=f(x, y)
- {cos(3*#1*180/pi)}
- %=3((t3-6t)sin(t)+(3t2-6)cos(t))+x_0
- %{((#1-0.3)/0.3)^2+((#2-0.5)/0.3)^2-1}
- \newcommand{\newvec}[5][->]% [options], start point, vector
- { \xdef\mysum{0}
- \foreach \c in {#3}
- { \pgfmathsetmacro{\mysquare}{\mysum+pow(\c,2)}
- \xdef\mysum{\mysquare}
- }
- \pgfmathsetmacro{\myveclen}{sqrt(\mysum)}
- \coordinate (#4) at ($#5/\myveclen*(#3)$);
- \draw[#1] (#2) --+ (#4);
- }
- \newcommand{\newkvec}[5]{
- \newvec[k]{#1}{#2}{#3}{#4}
- \fill[fill=red!20] (#1) --+ (#3) --+ (#3 |- 0,0) -- cycle;
- \newvec[k]{#1}{#2}{#3}{#4}
- \path[k] (#1) --+ (#3 |- 0,0) node[anchor=west]{#5};
- }
- \newcommand{\calc}[2]{\pgfmathparse{#2}\let#1\pgfmathresult}
- \newcounter{xcount}
- \begin{document}
- \foreach \iteration in {0,...,90} {
- \begin{tikzpicture}[
- background rectangle/.style={fill=white}, show background rectangle,
- grid/.style={thin,black!20},
- coordsys/.style={thick,black},
- gradient/.style={thin,blue!40,-stealth},
- k/.style={red!90!black,-stealth},
- kstep/.style={dotted,thick,color=green!60!red,-stealth},
- bstep/.style={dashed,thick,color=blue!60!red,-stealth},
- x=8cm,
- y=8cm,
- yscale=0.8
- ]
- %\draw[grid] (-0.01, -0.01) grid (1.01, 1.01);
- \foreach \x in {0,0.1,...,1.1}{
- \draw[grid] (\x, -0.01) --+ (0, 1.02);
- }
- \foreach \y in {0,0.1,...,1.1}{
- \draw[grid] (-0.01, \y) --+ (1.02, 0);
- }
- \foreach \x in {0,0.05,...,1.05}{
- \foreach \y in {0,0.05,...,1.05}{
- \newvec[gradient]{\x,\y}{1,{\f{\x}{\y}}}{a}{0.04}
- }}
- \draw[coordsys,-stealth] (0, 0) -- (1.05, 0) node[anchor=north west]{$t$};
- \draw[coordsys,-stealth] (0, 0) -- (0, 1.05) node[anchor=north east]{$x$};
- \draw[coordsys] (0, 0.01) --+ (0, -0.02) node[anchor=north]{$0$};
- \setcounter{xcount}{1}
- \foreach \x in {0.1,0.2,...,0.9}{
- \draw[coordsys] (\x, 0.01) --+ (0, -0.02) node[anchor=north]{$0.\arabic{xcount}$};
- \stepcounter{xcount}
- }
- \draw[coordsys] (1, 0.01) --+ (0, -0.02) node[anchor=north]{$1$};
- \def\hstep{0}
- \calc{\hstep}{0.1+\iteration*0.01}
- \def\TZero{0}
- \def\XZero{0.1}
- \def\valX{\XZero}
- \def\valT{\TZero}
- \def\valC{1/3*\hstep}
- \def\valKStep{0.1}
- \def\valB{1/4*\hstep}
- \def\valTc{\TZero}
- \draw[domain=0:1,smooth,samples=100,variable=\x,blue!60!green] plot ({\x},{1/3*sin(3*\x*180/pi)+\XZero});
- \coordinate (xvec) at (\valT, \valX);
- \coordinate (Cvec) at (xvec);
- \calc{\valK}{\f{\valT}{(\valX)}}
- \newkvec{xvec}{1,\valK}{kvec}{\valKStep}{$k_1$}
- \draw[kstep] ($(xvec)+(kvec)$) -- (\valC, {\valX+\valK*(\valC-\valT)});
- \coordinate (cvec) at (\valB, {\valK*\valB});
- \draw[bstep] (Cvec) --+ (cvec) coordinate (Cvec);
- %Next K-Value
- \calc{\valX}{\valX + (\valC-\valT)*\valK}
- \calc{\valT}{\TZero + \valC}
- \def\valC{2/3*\hstep}
- \def\valTc{\valB}
- \def\valB{0}
- \coordinate (xvec) at (\valT, \valX);
- \calc{\valK}{\f{\valT}{(\valX)}}
- \newkvec{xvec}{1,\valK}{kvec}{\valKStep}{$k_2$}
- \draw[kstep] ($(xvec)+(kvec)$) -- (\valC, {\valX+\valK*(\valC-\valT)});
- \coordinate (cvec) at (\valB, {\valK*\valB});
- \draw[bstep] (Cvec) --+ (cvec) coordinate (Cvec);
- %Next K-Value
- \calc{\valX}{\valX + (\valC-\valT)*\valK}
- \calc{\valT}{\TZero + \valC}
- \def\valTc{\valB}
- \def\valB{3/4*\hstep}
- \coordinate (xvec) at (\valT, \valX);
- \calc{\valK}{\f{\valT}{(\valX)}}
- \newkvec{xvec}{1,\valK}{kvec}{\valKStep}{$k_3$}
- \coordinate (cvec) at (\valB, {\valK*\valB});
- \draw[bstep] (Cvec) --+ (cvec) coordinate (Cvec);
- \draw[red] ($(Cvec)+(0.05, 0)$) -- (Cvec) -- (\hstep,{1/3*sin(3*\hstep*180/pi)+\XZero}) --+ (0.05, 0);
- \end{tikzpicture}
- }
- \end{document}
So, ich denke, das sollte genügen.
Mit freundlichen Grüssen,
Higlav
Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Higlav“ ()