Animierte Grafikfärbung
Ich versuche, die Ergebnisse meiner Arbeit mithilfe einer Animation zu demonstrieren. Ich habe eine MWE für das konstruiert, was ich versuche zu tun. Im Wesentlichen habe ich eine Reihe von Scheitelpunkten, deren Füllfarbe durch abgetastete RGB-Werte für jeden Zeitpunkt angegeben wird, den ich in einer CSV-Tabelle aufgezeichnet habe. Ich möchte die Farbentwicklung der Diagrammscheitelpunkte über die Zeit durch eine Animation zeigen. Ich bin mir jedoch nicht sicher, wie ich am besten vorgehen soll. Deshalb würde ich gerne Ihre Meinungen / Vorschläge zu diesem Thema hören. Der folgende Code generiert ein Diagramm mit drei Eckpunkten.
\documentclass{standalone}
\usepackage{tikz,calc}
\begin{document}
\begin{tikzpicture}[align=center,node distance=5cm]
\tikzset{
vertex/.style={draw,circle, line width=3pt,minimum size=1cm,text width=1cm, align=center, font=\Large},
arc/.style={draw, line width = 3pt,-}}
% outer shell
\node[vertex] (V1) at (0,0) {1};
\node[vertex] (V2) [below right of = V1] {2};
\node[vertex] (V3) [above of = V2] {3};
% adjacency
\draw[arc] (V1) -- (V2);
\draw[arc] (V3) -- (V2);
\draw[arc] (V3) -- (V1);
\end{tikzpicture}
\end{document}
Außerdem habe ich eine Tabelle CSV-Tabelle mit folgenden Einträgen:
r1,g1,b1,r2,g2,b2,r3,g3,b3
0.8147,0.1576,0.6557,0.7060,0.4387,0.2760,0.7513,0.8407,0.3517
0.9058,0.9706,0.0357,0.0318,0.3816,0.6797,0.2551,0.2543,0.8308
0.1270,0.9572,0.8491,0.2769,0.7655,0.6551,0.5060,0.8143,0.5853
0.9134,0.4854,0.9340,0.0462,0.7952,0.1626,0.6991,0.2435,0.5497
0.6324,0.8003,0.6787,0.0971,0.1869,0.1190,0.8909,0.9293,0.9172
0.0975,0.1419,0.7577,0.8235,0.4898,0.4984,0.9593,0.3500,0.2858
0.2785,0.4218,0.7431,0.6948,0.4456,0.9597,0.5472,0.1966,0.7572
0.5469,0.9157,0.3922,0.3171,0.6463,0.3404,0.1386,0.2511,0.7537
0.9575,0.7922,0.6555,0.9502,0.7094,0.5853,0.1493,0.6160,0.3804
0.9649,0.9595,0.1712,0.0344,0.7547,0.2238,0.2575,0.4733,0.5678
r1, g1, b1 sind die rgb-Werte von Knoten 1 und so weiter.
Vielen Dank für all die Hilfe!
Bearbeiten: Ich möchte wenn möglich die RGB-Fülloption verwenden:
\node[...,fill={rgb:red,4;green,2;blue,1}]
Antworten
Diese Lösung liest mit LaTeX3-Funktionen Linien mit Farben aus der Datei. Darüber hinaus wird der neue Befehl verwendet, \multiframebreakum \multiframevorzeitig aus einer Schleife auszubrechen . ( animate[ 2020/08/29])
\documentclass{standalone}
\usepackage[T1]{fontenc}
\usepackage{tikz,calc,animate}
\begin{filecontents}[overwrite,noheader]{vertexcolours.dat}
r1,g1,b1,r2,g2,b2,r3,g3,b3
0.8147,0.1576,0.6557,0.7060,0.4387,0.2760,0.7513,0.8407,0.3517
0.9058,0.9706,0.0357,0.0318,0.3816,0.6797,0.2551,0.2543,0.8308
0.1270,0.9572,0.8491,0.2769,0.7655,0.6551,0.5060,0.8143,0.5853
0.9134,0.4854,0.9340,0.0462,0.7952,0.1626,0.6991,0.2435,0.5497
0.6324,0.8003,0.6787,0.0971,0.1869,0.1190,0.8909,0.9293,0.9172
0.0975,0.1419,0.7577,0.8235,0.4898,0.4984,0.9593,0.3500,0.2858
0.2785,0.4218,0.7431,0.6948,0.4456,0.9597,0.5472,0.1966,0.7572
0.5469,0.9157,0.3922,0.3171,0.6463,0.3404,0.1386,0.2511,0.7537
0.9575,0.7922,0.6555,0.9502,0.7094,0.5853,0.1493,0.6160,0.3804
0.9649,0.9595,0.1712,0.0344,0.7547,0.2238,0.2575,0.4733,0.5678
\end{filecontents}
\usepackage{expl3}
\ExplSyntaxOn
\ior_new:N \l_colours_stream % file descriptor
\seq_new:N \g_colours_seq % sequence var taking colours at a given time
\ior_open:Nn \l_colours_stream {vertexcolours.dat} % open file for reading
\ior_str_get:NN \l_colours_stream \l_tempa_tl % read table header and throw away
\cs_new:Npn\readColours{
\seq_gclear:N \g_colours_seq
\ior_str_get:NNT \l_colours_stream \l_tempa_tl{
\seq_gset_split:NnV \g_colours_seq {,} \l_tempa_tl
}
}
\cs_new:Npn\getColourByIndex#1{
\seq_item:Nn \g_colours_seq {#1}
}
\ExplSyntaxOff
%\makeatletter
%\def\multiframebreak{\global\@anim@mulframecnt=1000}
%\makeatother
\begin{document}
\begin{animateinline}[controls,autoplay,loop]{1}
\readColours%
\multiframe{100}{}{
\begin{tikzpicture}[align=center,node distance=5cm]
\tikzset{
vertex/.style={draw,fill=temp,circle, line width=3pt,minimum size=1cm,text width=1cm, align=center, font=\Large},
arc/.style={draw, line width = 3pt,-}}
% outer shell
\definecolor{temp}{rgb}{\getColourByIndex{1},\getColourByIndex{2},\getColourByIndex{3}}
\node[vertex] (V1) at (0,0) {1};
\definecolor{temp}{rgb}{\getColourByIndex{4},\getColourByIndex{5},\getColourByIndex{6}}
\node[vertex] (V2) [below right of = V1] {2};
\definecolor{temp}{rgb}{\getColourByIndex{7},\getColourByIndex{8},\getColourByIndex{9}}
\node[vertex] (V3) [above of = V2] {3};
% adjacency
\draw[arc] (V1) -- (V2);
\draw[arc] (V3) -- (V2);
\draw[arc] (V3) -- (V1);
\end{tikzpicture}%
\readColours%
\ifthenelse{\equal{\getColourByIndex{1}}{}}{%
\multiframebreak% % no more colours -> break
}{}%
}
\end{animateinline}
\end{document}