PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : variable Anzahl an Tikz-Nodes über Draw verbinden



MC3330
07-04-2021, 08:19
Hallo,

ich berechne gerade in Lua verschiedene Koordinaten, aus denen ich dann per Schleife verschiedene Nodes erstelle. Die erstellten Nodes will ich dann per Draw miteinander verbinden. Soweit klappt das auch alles so, wie ich es haben will.

In meinem MB ist es so, dass es nur klappt, wenn es genau sechs Nodes sind. Ich würde es gerne irgendwie hinbekommen, dass es auch mit einer variablen Anzahl an Nodes klappt.

Gibt es irgendwie eine Möglichkeit die Nodes per Schleife zu verbinden und dabei trotzdem cycle zu verwenden, damit es an den Knoten nicht zu unschönen Kanten kommt?

Viele Grüße
MC


MB


\documentclass{scrartcl}
\usepackage{tikz}
\usepackage{luacode}

\begin{document}
\directlua{%//
step=0.5
cx={0,1,1,0,-1,-1}
cy={0,1,3,2,3,1}
cxa={}
cya={}
nn={}
le=6
for i = 1,le,1 do
table.insert(cxa,cx[i]*step)
table.insert(cya,cy[i]*step)
table.insert(nn,i)
end
}%\\
\begin{tikzpicture}
\foreach \n in {1,...,\directlua{tex.print(le)}}{
\node (\directlua{tex.print(nn[\n])}) at (\directlua{tex.print(cxa[\n])},\directlua{tex.print(cya[\n])}){};
}
\draw (\directlua{tex.print(nn[1])}.center)
--(\directlua{tex.print(nn[2])}.center)
--(\directlua{tex.print(nn[3])}.center)
--(\directlua{tex.print(nn[4])}.center)
--(\directlua{tex.print(nn[5])}.center)
--(\directlua{tex.print(nn[6])}.center)
--cycle;
\end{tikzpicture}

\end{document}

rais
07-04-2021, 19:49
Eine direkte Umsetzung will mir derzeit nicht in den Kopf, aber wenn die Anzahl an Nodes überschaubar bleibt, kannst Du Dir mit \ifcase behelfen:


\documentclass{scrartcl}
\usepackage{tikz}
\usepackage{luacode}

\begin{document}
\directlua{%//
step=0.5
cx={0,1,1,0,-1,-1}
cy={0,1,3,2,3,1}
cxa={}
cya={}
nn={}
le=4
for i = 1,le,1 do
table.insert(cxa,cx[i]*step)
table.insert(cya,cy[i]*step)
table.insert(nn,i)
end
}%\\
\begin{tikzpicture}
\foreach \n in {1,...,\directlua{tex.print(le)}}{
\node (\directlua{tex.print(nn[\n])}) at (\directlua{tex.print(cxa[\n])},\directlua{tex.print(cya[\n])}){};
}
\ifcase \directlua{tex.print(le)}
% gar kein Knoten (le = 0)
\or% einzelner Knoten, nix zu verbinden
\or\draw (1.center) -- (2.center);
\or\draw (1.center) -- (2.center) -- (3.center) -- cycle;
\or\draw (1.center) -- (2.center) -- (3.center) -- (4.center) -- cycle;
\or\draw (1.center) -- (2.center) -- (3.center) -- (4.center)
-- (5.center) -- cycle;
\or\draw (1.center) -- (2.center) -- (3.center) -- (4.center)
-- (5.center) -- (6.center) -- cycle;
\or\draw (1.center) -- (2.center) -- (3.center) -- (4.center)
-- (5.center) -- (6.center) -- (7.center) -- cycle;
\or\draw (1.center) -- (2.center) -- (3.center) -- (4.center)
-- (5.center) -- (6.center) -- (7.center) (8.center) -- cycle;
\or\draw (1.center) -- (2.center) -- (3.center) -- (4.center)
-- (5.center) -- (6.center) -- (7.center) (8.center)
-- (9.center) -- cycle;
\else
\typeout{Too many nodes for now (\directlua{tex.print(le)})}%
\fi
\end{tikzpicture}

\end{document}

VG

esdd
07-04-2021, 21:42
Du kannst eine foreach-Schleife verwenden:



\documentclass{scrartcl}
\usepackage{tikz}
\usepackage{luacode}

\begin{document}
\directlua{%//
step=0.5
cx={0,1,1,0,-1,-1}
cy={0,1,3,2,3,1}
cxa={}
cya={}
nn={}
le=6
for i = 1,le,1 do
table.insert(cxa,cx[i]*step)
table.insert(cya,cy[i]*step)
table.insert(nn,i)
end
}%
\begin{tikzpicture}
\foreach \n in {1,...,\directlua{tex.print(le)}}{
\coordinate (\directlua{tex.print(nn[\n])}) at (\directlua{tex.print(cxa[\n])},\directlua{tex.print(cya[\n])});
}
\draw
(\directlua{tex.print(nn[1])})
foreach \n in {2,...,\directlua{tex.print(le)}} {--(\directlua{tex.print(nn[\n])})}
--cycle;
\end{tikzpicture}

\end{document}

MC3330
08-04-2021, 09:24
Vielen Dank euch beiden.
@esdd Ich verstehe zwar nicht genau, wie deine Syntax funktioniert, aber das, was du da gemacht hast ist exakt das, was ich gesucht habe :).