如何在另一条曲线的一部分上绘制一条曲线?

如何在另一条曲线的一部分上绘制一条曲线?

我想在另一条曲线上画一条箭头曲线。最简单、最准确的方法是什么?

\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

从我学到的东西中汲取灵感这个答案,你可以使用装饰来

  1. 在绘制路径上绘制
  2. 或者直接全部画在一起。

为了实现第一个策略,我定义了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}

相关内容