
方向のリストからパスを生成しようとしています (テンキーに表示される)。座標は正しく生成されますが、\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]
direction
distance
to[/tikz/turtle/how] ++ (<direction>:<distance>)
およびStart
は、End
単にmove to
to(Start)
と (最後の?) line to
to (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
。)
キーを1
、2
、 …9
ではなく1 step
、2 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を使用して複数のノード間のパスを描画する別の解決策については、そこに記載されている回答を参照してください。