TikZ: foreach 内外の複数のパスを組み合わせる

TikZ: foreach 内外の複数のパスを組み合わせる

方向のリストからパスを生成しようとしています (テンキーに表示される)。座標は正しく生成されますが、\path を複数回呼び出しているため、各セグメントに矢印が描画されます。このコードを変更して、最初のセグメントに開始矢印のみを描画し、最後のセグメントに終了矢印のみを描画するにはどうすればよいでしょうか。\foreach の外側に 1 つの \path を配置し、内側に座標のみを配置しようとしましたが、失敗しました。

編集: オプションの引数で渡される任意の矢印の形状に対して機能するはずです。

ここに画像の説明を入力してください

\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}

答え1

これを 1 つのパスで実行する必要があることに疑問の余地はありませんが、ライブラリを使用すると非常に簡単に実行できますturtle

各桁の方向 (および係数) を定義するだけです。

directionキーは「タートル」を回転させるだけなので、と指定されたの相対座標へのパスforwardを含むキーも含めます。つまり、to[/tikz/turtle/how]directiondistance

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

およびStartは、End単にmove toto(Start)と (最後の?) line toto (End)(またはhow現在のスタイル) を挿入するだけです。

もちろん、数字スタイルの設定で質問の計算を使用することもできますが、これはより高速です (TikZ と書き込み用)。

sqrt(2)私は、対角方向の係数を必要とするグリッドのような出力を選択しました。この係数を に設定すると1、質問と同じ距離が得られます。(対称的な結果を得るために、例を少し変更しました。)

私はセットアップ用に補助スタイルを作成して使用しており、 でマークされています@。このスタイルは/aux再度使用したり、パスで実際に必要になったりすることはないため、パスで定義する方が望ましい場合もあります/tikz

1これにより、キーの値を省略することですべての要素を簡単に設定できます(値が指定されていない場合は、forwardデフォルトはいずれにせよです)。つまり、/tikz/turtle/distance

@setup turtle digits/.style n args={3}{
  /tikz/turtle/#1/.style={
    /tikz/turtle/direction=#2,
    /tikz/turtle/forward}}

(キーの値をforward固定距離に設定する本当の理由はありません。値を変更する方が一貫性があるからですdistance。)

キーを12、 …9ではなく1 step2 step、 …と呼ぶべきだと突然感じた場合は、の後に9 stepを追加するだけです。 step#1

コード

\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}

出力

要因とともに

ここに画像の説明を入力してください

要因がなければ

ここに画像の説明を入力してください

答え2

単一パスバージョンは次のとおりです。

\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}

2つのforeachループがあるのは、パスがゼロでないサイズのノードで始まり、終わるが、変位はノードの中心に対して相対的であるためです。2番目のパスでは、(c1)で提起された問題のために余分なものが必要です。foreachを使用して複数のノード間のパスを描画する別の解決策については、そこに記載されている回答を参照してください。

foreach による単一パス

関連情報