执行

执行

使用这个答案,我已经能够使用 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:如何在线中间画箭头? 但是,这是使用\pathtikz 中的选项,而不是\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接受键endopt;在 中end=...放置箭头,在 中opt={...}可以放置任何箭头选项。 的第二个参数是和之间要放置标记arrow inside的位置列表。01

执行

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

输出

在此处输入图片描述

相关内容