使用这个答案,我已经能够使用 tikz 绘制平滑的曲线 TikZ 中的简单曲线 但我还想让曲线上有箭头,经过一番调整,我想出了以下方法
\documentclass[a4paper,12pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows}
\input{arrowsnew}
\usetikzlibrary{decorations.pathreplacing,decorations.markings}
\tikzset{arrow data/.style 2 args={%
decoration={%
markings,
mark=at position #1 with \arrow{#2}},
postaction=decorate}
}%
\begin{document}
\begin{tikzpicture}
\begin{scope}[scale=2]
\node[label=below:$A$] (A) at (0,0) {};
\node[label=below:$B$] (B) at (2,0.25){};
\draw [red,arrow data={0.25}{stealth},
arrow data={0.5}{stealth},
arrow data={0.75}{stealth}] plot [smooth,tension=1] coordinates {(A) (1,0) (1.14,-0.6) (0.5,-0.5) (0.5,0.5) (1.5,0) (B)};
\draw [black] plot [smooth,tension=1] coordinates {(A) (1,0) (1.14,-0.6) (0.5,-0.5) (0.5,0.5) (1.5,0) (B)};
\end{scope}
\draw [fill=black] (A) circle (1pt);
\draw [fill=black] (B) circle (1pt);
\end{tikzpicture}
\end{document}
这看起来有点不靠谱,我正在寻找一个解决方案来改进代码的某些部分。最理想的情况是
- 箭头随着图形的缩放而缩放(或者指定大小,但不是真正想要的)。
- 曲线和箭头的颜色不同。
\draw[color = black,arrow color = red,...]
- 指定曲线上的箭头数量或使用点的数量。例如
\draw[arrow number=10]
和\draw[arrow number=points]
对于颜色,我使用了两次相同的绘图函数,呃。箭头最好位于图形的前面,而不是后面。例如,我看过一篇关于缩放箭头的帖子
是否可以更改 TikZ/PGF 中箭头的大小?
但我无法实施解决方案...在\draw
命令中添加 arrowhead=10mm 没有任何作用。我还发现了一个关于沿曲线的几个箭头取决于点数的问题,TikZ:如何在线中间画箭头?
但是,这是使用\path
tikz 中的选项,而不是\plot
我使用的选项。盲目实施解决方案 Latex 决定向我抛出几个dimensions to large
错误,所以我想必须使用更多的技巧来实现这一点。
任何有关实施项目符号的帮助或想法都将不胜感激。我确实尝试过自己解决这些问题,但我的 tikz 能力有些有限。
答案1
改编自此处的 Qrrbrbirlbels 答案:https://tex.stackexchange.com/a/131325/10995
你会想使用它
\draw plot ... [arrow inside={end=stealth,opt={scale=2}}{0.25,0.5,0.75}];
重要的是,后绘图部分,因为否则您将收到Dimension too large
错误,这些错误是由于smooth
和之间不兼容而产生的decorate
。 的第一个参数arrow inside
接受键end
和opt
;在 中end=...
放置箭头,在 中opt={...}
可以放置任何箭头选项。 的第二个参数是和之间要放置标记arrow inside
的位置列表。0
1
执行
\documentclass[tikz,border=5pt]{standalone}
\usetikzlibrary{decorations.markings}
\tikzset{
set arrow inside/.code={\pgfqkeys{/tikz/arrow inside}{#1}},
set arrow inside={end/.initial=>, opt/.initial=},
/pgf/decoration/Mark/.style={
mark/.expanded=at position #1 with
{
\noexpand\arrow[\pgfkeysvalueof{/tikz/arrow inside/opt}]{\pgfkeysvalueof{/tikz/arrow inside/end}}
}
},
arrow inside/.style 2 args={
set arrow inside={#1},
postaction={
decorate,decoration={
markings,Mark/.list={#2}
}
}
},
}
\begin{document}
\begin{tikzpicture}
\begin{scope}[scale=2]
\node[label=below:$A$] (A) at (0,0) {};
\node[label=below:$B$] (B) at (2,0.25){};
\draw[blue] plot [smooth,tension=1]
coordinates {(A) (1,0) (1.14,-0.6) (0.5,-0.5) (0.5,0.5) (1.5,0) (B)}
[arrow inside={end=stealth,opt={red,scale=2}}{0.25,0.5,0.75}];
\end{scope}
\draw [fill=black] (A) circle (1pt);
\draw [fill=black] (B) circle (1pt);
\end{tikzpicture}
\end{document}
输出
on each segment
或者,您可以使用此处定义的样式在每个线段的末尾绘制一个箭头:https://tex.stackexchange.com/a/69225/10995
您需要bending
库(来自 TikZ 3.0.0)才能使用[bend]
箭头选项,因为否则箭头将修改路径的张力,使得原始路径和重新绘制的路径on each segment
明显不同。当然,您仍将颜色等应用于箭头。但这似乎scale
是不可能的。
执行
\documentclass[tikz,border=5pt]{standalone}
\usetikzlibrary{decorations.pathreplacing,bending}
\makeatletter
\tikzset{
on each segment/.style={
decorate,
decoration={
show path construction,
moveto code={},
lineto code={
\path [#1]
(\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
},
curveto code={
\path [#1] (\tikzinputsegmentfirst)
.. controls
(\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
..
(\tikzinputsegmentlast);
},
closepath code={
\path [#1]
(\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
},
},
},
}
\makeatother
\begin{document}
\clearpage
\begin{tikzpicture}
\begin{scope}[scale=2]
\node[label=below:$A$] (A) at (0,0) {};
\node[label=below:$B$] (B) at (2,0.25){};
\draw[blue] plot [smooth,tension=1]
coordinates {(A) (1,0) (1.14,-0.6) (0.5,-0.5) (0.5,0.5) (1.5,0) (B)}
[postaction={on each segment={draw,-{stealth[red,bend]}}}];
\end{scope}
\draw [fill=black] (A) circle (1pt);
\draw [fill=black] (B) circle (1pt);
\end{tikzpicture}
\end{document}