
Ich versuche, einen Pfad aus einer Liste von Richtungen zu generieren (wie auf dem Ziffernblock angezeigt). Die Koordinaten werden korrekt generiert, aber da ich \path mehrfach aufrufe, werden die Pfeilspitzen auf jedem Segment gezeichnet. Wie ändere ich diesen Code, um nur die Startpfeilspitze auf dem ersten Segment und die Endpfeilspitze auf dem letzten Segment zu zeichnen? Ich habe erfolglos versucht, einen \path außerhalb von \foreach und nur Koordinaten darin zu haben.
Bearbeiten: Es sollte für jede Pfeilform funktionieren, die im optionalen Argument übergeben wird.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\directedPath}[5][]
{
\edef\start{#2}
\edef\stop{#3}
\edef\step{#4}
\edef\directions{#5}
\coordinate (c0) at (\start);
\foreach [var=\dir, count=\cur] in \directions
{
% current coordinate dx
\pgfmathparse{(1-(1-1/sqrt(2))*mod(\dir, 2))*\step*(mod(\dir-1, 3)-1)}
\edef\dx{\pgfmathresult}
% current coordinate dy
\pgfmathparse{(1-(1-1/sqrt(2))*mod(\dir, 2))*\step*(div(\dir-1, 3)-1)}
\edef\dy{\pgfmathresult}
% previous coordinate index
\pgfmathparse{int(\cur - 1)}
\xdef\prev{\pgfmathresult}
% current coordinate
\coordinate (c\cur) at ($(c\prev) + (\dx, \dy)$);
% draw partial path
\ifnum \cur>1
\path [#1] (c\prev) -- (c\cur);
\fi
}
\path [#1] (\start) -- (c1);
\path [#1] (c\cur) -- (\stop);
}
\begin{document}
\begin{tikzpicture}
\node [draw=green] (Start) at (0, 0) {Start};
\node [draw=red] (End) at (5, 2) {End};
\directedPath[draw=black, >->]{Start}{End}{1.0}{3,6,9,8,7,8,9,6,3}
\end{tikzpicture}
\end{document}
Antwort1
Es besteht kein Zweifel, dass dies in einem einzigen Pfad erfolgen muss, aber mit der turtle
Bibliothek können Sie dies ganz einfach tun.
Definieren Sie einfach für jede Ziffer eine Richtung (und einen Faktor).
Da der direction
Schlüssel nur die „Schildkröte“ dreht, schließen Sie auch den Schlüssel ein , der einen Pfad zu den relativen Koordinaten in und dem angegebenen forward
enthält , d. h.to[/tikz/turtle/how]
direction
distance
to[/tikz/turtle/how] ++ (<direction>:<distance>)
Das Start
„und“ End
fügt einfach ein „ move to
zu“ (Start)
und ein (letztes?) „ line to
zu “ (End)
(oder was auch immer der how
Stil gerade ist) ein.
Natürlich können Sie die Mathematik aus Ihrer Frage beim Einrichten der Ziffernstile verwenden, aber das ist einfach schneller (für TikZ und zum Aufschreiben).
Ich habe mich für eine gitterartige Ausgabe entschieden, die den Faktor sqrt(2)
für die diagonalen Richtungen benötigt. Stellen Sie diesen Faktor so ein, 1
dass Sie den gleichen Abstand wie in Ihrer Frage erhalten. (Ich habe das Beispiel auch ein wenig geändert, um ein symmetrisches Ergebnis zu erhalten.)
Ich habe einen Hilfsstil für das Setup erstellt und verwendet, der durch ein gekennzeichnet ist @
. Es kann auch vorzuziehen sein, diesen Stil einfach in einem /aux
Pfad zu definieren, da wir ihn nicht wieder verwenden oder ihn im /tikz
Pfad nicht wirklich benötigen.
1
Dies macht es auch einfach, alle Faktoren durch Weglassen des Schlüsselwertes auf einzustellen forward
(der Standardwert ist /tikz/turtle/distance
sowieso, wenn kein Wert angegeben ist), d.h.
@setup turtle digits/.style n args={3}{
/tikz/turtle/#1/.style={
/tikz/turtle/direction=#2,
/tikz/turtle/forward}}
(Es gibt keinen wirklichen Grund, den Wert des Schlüssels auf eine feste Entfernung festzulegen, forward
da es konsistenter wäre, den distance
Wert zu ändern.)
1
Wenn Sie plötzlich das Gefühl haben, dass die Schlüssel nicht , 2
, …, 9
sondern 1 step
, 2 step
, … heißen sollten, 9 step
fügen Sie einfach step
nach hinzu #1
.
Code
\documentclass[tikz,convert]{standalone}
\usetikzlibrary{turtle}
\tikzset{
@setup turtle digits/.style n args={3}{
/tikz/turtle/#1/.style={
/tikz/turtle/direction=#2,
/tikz/turtle/forward={#3*\pgfkeysvalueof{/tikz/turtle/distance}}}},
@setup turtle digits={1}{south west}{1.41421},
@setup turtle digits={2}{south} {1},
@setup turtle digits={3}{south east}{1.41421},
@setup turtle digits={4}{left} {1},
@setup turtle digits={6}{right} {1},
@setup turtle digits={7}{north west}{1.41421},
@setup turtle digits={8}{north} {1},
@setup turtle digits={9}{north east}{1.41421},
turtle/.cd,
Start/.style={/tikz/insert path={(#1)}},
End/.style={/tikz/insert path={to[/tikz/turtle/how] (#1)}},
Start/.default=Start,
End/.default=End,
}
\begin{document}
\begin{tikzpicture}
\node [draw=green] (Start) at (0, 1) {Start};
\node [draw=red] (End) at (5, 2) {End};
\draw [draw=black, >->] [turtle={Start, 2, 3, 6, 9, 8, 7, 8, 9, 6, 3, End}];
\end{tikzpicture}
\end{document}
Ausgabe
mit den Faktoren
ohne die Faktoren
Antwort2
Hier ist eine Version mit einem einzigen Pfad:
\documentclass{article}
%\url{https://tex.stackexchange.com/q/123997/86}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\directedPath}[5][]
{
\coordinate (c0) at (#2);
\path (c0)
\foreach [var=\dir,count=\cur] in {#5}
{
++({(1-(1-1/sqrt(2))*mod(\dir, 2))*#4*(mod(\dir-1, 3)-1)},{(1-(1-1/sqrt(2))*mod(\dir, 2))*#4*(div(\dir-1, 3)-1)}) coordinate (c\cur)
};
\path[#1] (#2) -- (c1) \foreach [var=\dir,count=\cur] in {#5}
{
-- (c\cur)
} -- (#3);
}
\begin{document}
\begin{tikzpicture}
\node [draw=green] (Start) at (0, 0) {Start};
\node [draw=red] (End) at (5, 2) {End};
\directedPath[draw=black, >->]{Start}{End}{1.0}{3,6,9,8,7,8,9,6,3}
\end{tikzpicture}
\end{document}
Die beiden foreach-Schleifen sind darauf zurückzuführen, dass der Pfad an Knoten mit einer Größe ungleich Null beginnt und endet, die Verschiebungen jedoch relativ zu den Knotenzentren sind. Im zweiten Pfad gibt es eine zusätzliche (c1)
Schleife, die aufgrund des unterZeichnen Sie mit foreach einen Pfad zwischen mehreren Knoten. Eine alternative Lösung finden Sie in den dortigen Antworten.