我想在另一条曲线上画一条箭头曲线。最简单、最准确的方法是什么?
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[ultra thick]
\coordinate (G) at (2.3,6.1);
\coordinate (B) at (2.1,1.7);
\node [fill=green,circle] at (G) {};
\node [fill=blue, circle] at (B) {};
\draw [violet] (B) to[out=120,in=150] (G);
\end{tikzpicture}
\end{document}
上述代码的结果是:
答案1
从我学到的东西中汲取灵感这个答案,你可以使用装饰来
- 在绘制路径上绘制
- 或者直接全部画在一起。
为了实现第一个策略,我定义了draw on top
样式,但这样不太方便,因为需要重复代码。第二个策略仅使用一个命令即可实现(这里我称之为bicolor
新定义的样式)。
两种样式都有第一个参数,该参数应介于 0 和 1 之间,表示箭头覆盖的路径部分,第二个参数是箭头颜色,第三个参数(仅限样式bicolor
)是路径的颜色在下面箭头。
笔记:我使用了来xshift=0.02\totallength
调整箭头的位置,如果有人知道更优雅的方式来实现相同的调整,我会很好奇。
\documentclass[tikz, border=3mm]{standalone}
\usetikzlibrary{decorations.markings}
\newlength\totallength
\tikzset{
draw on top/.style 2 args={
decoration={
markings,
mark=at position #1 with {
\node[draw=none,inner sep=0pt,fill=none,text width=0pt,minimum size=0pt] {\global\setlength\totallength{\pgfdecoratedpathlength}};
\arrow[#2, xshift=0.02\totallength]{stealth}
},
},
draw=#2,
dash pattern=on #1\totallength off \totallength-#1\totallength,
preaction={decorate},
},
bicolor/.style n args={3}{
decoration={
markings,
mark=at position #1 with {
\node[draw=none,inner sep=0pt,fill=none,text width=0pt,minimum size=0pt] {\global\setlength\totallength{\pgfdecoratedpathlength}};
},
},
draw=#3,
preaction={decorate},
postaction={
draw=#2,
dash pattern=on #1\totallength off \totallength-#1\totallength,
},
postaction={
decorate, decoration={markings,mark=at position #1 with {\arrow[#2, xshift=0.02\totallength]{stealth}}}
}
}
}
\begin{document}
\begin{tikzpicture}[ultra thick]
\coordinate (G) at (2.3,6.1);
\coordinate (B) at (2.1,1.7);
\node [fill=green,circle] at (G) {};
\node [fill=blue, circle] at (B) {};
%Strategy 1
\draw [violet] (B) to[out=120,in=150] (G);
\draw [draw on top={0.4}{orange}] (B) to[out=120,in=150] (G);
%Strategy 2 (one command only)
\draw [bicolor={0.2}{orange}{violet}] (G) to[out=320,in=30] (B);
\end{tikzpicture}
\end{document}