TikZ: Kombinieren mehrerer Pfade in und außerhalb von foreach

TikZ: Kombinieren mehrerer Pfade in und außerhalb von foreach

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.

Bildbeschreibung hier eingeben

\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 turtleBibliothek können Sie dies ganz einfach tun.

Definieren Sie einfach für jede Ziffer eine Richtung (und einen Faktor).

Da der directionSchlü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 forwardenthält , d. h.to[/tikz/turtle/how]directiondistance

to[/tikz/turtle/how] ++ (<direction>:<distance>)

Das Start„und“ Endfügt einfach ein „ move tozu“ (Start)und ein (letztes?) „ line tozu “ (End)(oder was auch immer der howStil 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, 1dass 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 /auxPfad zu definieren, da wir ihn nicht wieder verwenden oder ihn im /tikzPfad nicht wirklich benötigen.

1Dies macht es auch einfach, alle Faktoren durch Weglassen des Schlüsselwertes auf einzustellen forward(der Standardwert ist /tikz/turtle/distancesowieso, 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, forwardda es konsistenter wäre, den distanceWert zu ändern.)

1Wenn Sie plötzlich das Gefühl haben, dass die Schlüssel nicht , 2, …, 9sondern 1 step, 2 step, … heißen sollten, 9 stepfügen Sie einfach  stepnach 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

Bildbeschreibung hier eingeben

ohne die Faktoren

Bildbeschreibung hier eingeben

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.

Einzelner Pfad mit foreach

verwandte Informationen