使用 TikZ 和特殊样式的箭头绘制几辆汽车

使用 TikZ 和特殊样式的箭头绘制几辆汽车

你能指导我画这个图形吗?

在此处输入图片描述

我用这个代码画了几辆车:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}

\tikzset{
    pics/my car/.style={
        code={
            \tikzset{my car/.cd, #1}
            \shade[my car/car color, shading angle={135},
                draw=black, rounded corners=1.2ex, very thick] 
                (1.5,.5) -- ++(0,1) -- ++(1,0.3) --  ++(3,0) -- ++(1,0) 
                    -- ++(0,-1.3) -- (1.5,.5) -- cycle;
            \draw[very thick, rounded corners=0.5ex, fill=black!20!blue!20!white, thick]
                (2.5,1.8) -- ++(1,0.7) -- ++(1.6,0) -- ++(0.6,-0.7) -- (2.5,1.8);
            \draw[thick] (4.2,1.8) -- (4.2,2.5);
            \draw[fill=gray!50, thick] 
                (2.75,.5) circle[radius=.5cm]
                (5.5,.5) circle[radius=.5cm];
            \draw[fill=gray!80, semithick] 
                (2.75,.5) circle[radius=.4cm]
                (5.5,.5) circle[radius=.4cm];
            \coordinate (-front) at (1.5,1);
            \coordinate (-back) at (6.5,1);
            \coordinate (-top) at (4.25,2.5);
            \coordinate (-bottom) at (4.25,0);
        }
    },
    my car/car color/.style={
        top color=red, bottom color=white
    }
}

\begin{document}
\begin{tikzpicture}

\pic (car 1) at (0,0) {my car};    

\pic (car 2) at (10,0) {my car={car color/.append style={top color=blue}}};  

\pic (car 3) at (20,0) {my car={car color/.append style={top color=green}}};  

\pic (car 4) at (30,0) {my car={car color/.append style={top color=black}}};  

%\draw[<-, shorten <=5pt, shorten >=5pt, ultra thick] 
  %  (car 1-back) -- (car 2-front);

\draw[line width=5pt][<-, shorten <=5pt, shorten >=5pt] 
    (car 1-top) to[out=90, in=90] (car 2-top);
  \draw[line width=5pt][<-, shorten <=5pt, shorten >=5pt] 
  (car 2-top) to[out=90, in=90] (car 3-top);
   \draw[line width=5pt][<-, shorten <=5pt, shorten >=5pt] 
  (car 3-top) to[out=90, in=90] (car 4-top);

\end{tikzpicture}
\end{document}

答案1

更新

我使用了 tikz ducks 库,因为如你所见,它具有非常生动的各种结果和命令来随机获取它们;如果你查看它的文档,你会看到它的作者为生成所有这些所做的所有努力,也许有一天有人会对车辆和其他东西做类似的事情,只是出于对 TeX 的热爱或其他什么,但主要是为了制作 MWE,这意味着你复制代码,将其粘贴到你的编译器中,如果你拥有所有的包,是或是,它会给你一个结果,也许还有一些警告。

当然,正如 FZH 所建议的,简单的方法是包含外部文件,就像他引用的例子一样,但由于一切看起来不错都需要处理某些细节,首先它们将位于一个节点中,因此锚点很重要,然后所有图像都在相同的比例上,以便您可以用特定的宽度定义它们,为此建议在互联网上搜索免费的矢量文件在 inkscape 中编辑,分离您需要的内容,将画布剪切为最小矢量尺寸,导出为 pdf、png 或 jpg;pdf 更好,因为它保留了矢量。

为了编写以下内容,您必须从此处下载 4 个 PDF关联、CAR-1.pdf、CAR-2.pdf 等还有更多文件,但可以免费使用,因为它们是副本的副本,还有我从中获取它们的原始 svg...接下来将它们保存在与 tex 文件相同的目录中。如您所见,您可以用相应的文件名将它们替换为您想要的任何内容,以便编译器可以找到它们。

结果:

在此处输入图片描述

代码:(要编译它,您需要同一个 main.tex 目录中的 4 个外部文件)

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,arrows.meta,backgrounds,decorations.markings}

\begin{document}
    \begin{tikzpicture}[%Here you can define some tikz picture enviroment options
        font=\sf\scriptsize,%set al fonts of this environment \sf=serif family, and size of text
        Arrow/.style 2 args= {%Custom style arrow named Arrow, that has 2 arguments
            draw=#1,%Option draw=color, #1 is the first argument
            >={Triangle[angle=120:.5cm 0.3,scale length=0.5*#2,scale width=0.3*#2]},%It uses arrows meta arrow personalization, check visual tikz normal definition is ->
            line width=#2*1.2mm
            },
        ArrowColor/.store in=\ArrowColor,ArrowColor=black,%Some variable to use in other styles below
        ArCorr/.store in=\ArCorr,ArCorr=1.5, %Some variable to use in other styles below
        Thickness/.store in=\Thickness,Thickness=4pt,%Some variable to use in other styles below
        W/.store in=\W,W=5mm,%Some variable to use in other styles below
        Arrow2/.style={%custom style arrow using decoratins markings.
            draw=none,
            postaction={
                decorate,
                decoration={
                    markings,
                    mark= at position 0 %this draw will be the first mark at the start of the path
                    with {%Mark drawing definition
                        \begin{scope}[yscale=#1]%All is in scope to mirror it using the default argument #1, using as Arrow2=-1 or 1
                            \pgfmathparse{int(\pgfdecoratedpathlength/4)}%Obtain the leght of the path
                            \edef\H{\pgfmathresult/15}%Then adjuts to mach the size of coordinates to the lenght of the path.
                            \fill[fill=\ArrowColor]
                            (0,0)
                            to [out=90-15, in=180] (\H,\W/1.5) coordinate (b)
                            -- ++(\Thickness,0) -- ++(0,-1pt) 
                            to [out=180, in=90-15] (\Thickness,0)
                            -- (0,0);
                        \end{scope}
                    }
                }
            },
            postaction={
                decorate,
                decoration={
                    markings,
                    mark=at position 1 %this draw will be the last mark at the end of the path
                    with {
                        \begin{scope}[yscale=#1]%idem
                            \pgfmathparse{int(\pgfdecoratedpathlength/4)}%idem
                            \edef\H{\pgfmathresult/15}%idem
                            \fill[fill=\ArrowColor]
                            (b) %uses previos coodinate to draw in the marck
                            to [out=0, in=90+20] (\Thickness/2,\Thickness*\ArCorr/1.5)
                            -- (\Thickness*\ArCorr,\Thickness*\ArCorr/1.5)
                            -- (0,0)
                            -- (-\Thickness*\ArCorr,\Thickness*\ArCorr/1.5)
                            -- (-\Thickness/2,\Thickness*\ArCorr/1.5)
                            to [out=90+20, in=0] ($(b)+(0,-1pt)$)
                            -- (b);
                        \end{scope}
                    }
                }
            }
        }
        ]
        
        %Creating a weel for all cars
        \def\Weel#1{%\Weel{position}
            \draw[fill=white,shift={(#1)}](0,0)circle (0.3);
            \draw[fill=black!80, even odd rule,shift={(#1)}](0,0) circle (.3) circle (0.2);
            \draw[fill,shift={(#1)}](0,0) circle (0.08);
            \foreach \i in {1,...,12}{\draw[fill,shift={(#1)}](30*\i:0.1)--(30*\i:0.2)--+(90+30*\i:0.02);}        
        }
        
        % drawing the Cars from external archives, you may include vectors (svg for example) if you convert them to pdf format.
        \draw(0,0) node[anchor=-90](CAR-1){\includegraphics[width=3cm]{CAR-1.pdf}}; %\draw(position) node [node options](node_name){\includegraphics[graphic options]{imagefile}}
        \draw($(CAR-1.-90)+(4.5,0)$) node[anchor=-90](CAR-2){\includegraphics[width=3cm]{CAR-2.pdf}};
        \draw($(CAR-2.-90)+(4.5,0)$) node[anchor=-90](CAR-3){\includegraphics[width=3cm]{CAR-3.pdf}};
        \draw($(CAR-3.-90)+(4.5,0)$) node[anchor=-90](CAR-4){\includegraphics[width=3cm]{CAR-4.pdf}};
        \draw($(CAR-4.-90)+(3,0)$) node[scale=3]{$\dots$};
        \draw($(CAR-4.-90)+(6,1)$) node[scale=2.5, draw, thick](L){\scriptsize Leader};
        \Weel{$(L)+(-0.8,-0.7)$}
        \Weel{$(L)+(0.8,-0.7)$} 
        \draw($(CAR-2)+(0,4)$) node[scale=2.5, draw, thick](C){\scriptsize Controller l};
        
        %Drawing some Arrows
        \draw[Arrow={cyan!40!blue}{1.2},->](CAR-1.120) |- ($(C)+(-1,2)$) -| (C.150);% |:vertical -:horizontal
        \draw[Arrow={cyan!40!blue}{1.2},->](CAR-2.120) coordinate (temp) -- (C.-90-|temp);% node_coord intersectión perpendicular tipe (-| or |-)
        \draw[Arrow={cyan!40!blue}{1.2},->]($(L.90)+(0,0.5em)$) |- ($(C)+(1,2)$) -| (C.120);
        \draw[Arrow={cyan!40!blue}{1.2},->](CAR-4.120) |- ($(C)+(1,1.5)$) -| (C.60);
        \draw[Arrow={cyan!40!blue}{1.2},->](CAR-3.120) |- ($(C)+(1,1)$) -| (C.30);
        %Drawing some repetitive things
        \foreach \txbehind/\Car [count=\j from 1]in {
            i+1/CAR-1,
            node\quad i/CAR-2,
            i-1/CAR-3,
            i-2/CAR-4,
            0/L%<-necessary
        }{
            \path($(CAR-1.-90)+(0,-0.2)$)coordinate (temp) -- (temp-|\Car.-90) node []{$\txbehind$};
            \ifnum\j<5\draw[Arrow={cyan!40!blue}{1},->]($(\Car.90)+(0,1)$) -- ++(0,-1)node [pos=0.1, anchor=-180]{$U_{\txbehind}$};\fi
            \ifnum\j<4{}\draw[Arrow={red}{1},->](\Car.15) -- ++(0.75,0)node [midway, anchor=90]{$V_{\txbehind}$};\fi
        }
        
        \draw[Arrow2=-1,ArrowColor=black,Thickness=2mm,W=1.5cm,ArCorr=1.5] (CAR-2.140) -- (CAR-1.40);
        \draw(b)++(0,0.7em) node {$\tilde{U}_{i+1}$}; %notice that b node is defined in the marking style
        \draw[Arrow2=-1,ArrowColor=black,Thickness=2mm,W=1.5cm,ArCorr=1.5] (CAR-3.140) -- (CAR-2.40);
        \draw(b)++(0,0.7em) node {$\tilde{U}_i$}; %the b position is rewritten by the previous instruction
        \draw[Arrow2=-1,ArrowColor=black,Thickness=2mm,W=1.5cm,ArCorr=1.5] (CAR-4.140) -- (CAR-3.40);
        \draw(b)++(0,0.7em) node {$\tilde{U}_{i-1}$};%ditto
        \draw[dashed,green!50!black](CAR-2.south east)--++(0,-1) coordinate (temp1);
        \draw[dashed,green!50!black](CAR-3.south west)--++(0,-1) coordinate (temp2);%
        \draw[Arrow={green!50!black}{1},<->]($(temp1)+(0,1.5em)$)coordinate (temp) -- (temp -| temp2) node [midway, anchor=90]{$d_{i}$};
        
    \end{tikzpicture}
\end{document}

原来的

嗯,有时在社交方面,你必须更有效地打动人们,这样他们才不会认为这是一个典型的“为我做”的案例,这就是为什么你应该把问题集中在特定案例上,并试图将它们隔离开来。所以即使你搜索,你也会找到可以改编的代码片段,如果你仍然不太明白的话,那就没那么容易了,但是好吧……,因为我有代码可以做到这一点,所以我在这里提出了一个解决方案,至少可以完成箭头问题。

蓝色箭头来自:如何绘制漂亮而复杂的流程图(结合表格和流程图)

黑色弯曲箭头来自:将箭头添加到 Helix 代码

结果:

在此处输入图片描述

梅威瑟:

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,arrows.meta,ducks,decorations.markings}

\begin{document}
    \begin{tikzpicture}[
        >=Triangle,
        font=\sf\scriptsize,
        Arrow/.style 2 args= {draw=#1,-{Triangle[angle=120:.5cm 0.3,scale length=0.5*#2,scale width=0.3*#2]},line width=#2*1.2mm},
        CoilColor/.store in=\coilcolor,CoilColor=black,
        ArCorr/.store in=\ArCorr,ArCorr=1.5,
        Thickness/.store in=\Thickness,Thickness=4pt,
        W/.store in=\W,W=5mm,
        Arrow2/.style={
            draw=none,
            postaction={
                decorate,
                decoration={
                    markings,
                    mark= at position 0
                    with {
                        \begin{scope}[yscale=#1]
                            \pgfmathparse{int(\pgfdecoratedpathlength/4)}
                            \edef\H{\pgfmathresult/15}
                            \fill[fill=\coilcolor!50!black]
                            (0,0)
                            to [out=90-15, in=180] (\H,\W/1.5) coordinate (b)
                            -- ++(\Thickness,0) -- ++(0,-1pt) coordinate (c)
                            to [out=180, in=90-15] (\Thickness,0)
                            -- (0,0);
                        \end{scope}
                    }
                }
            },
            postaction={
                decorate,
                decoration={
                    markings,
                    mark=at position 1
                    with {
                        \begin{scope}[yscale=#1]
                            \pgfmathparse{int(\pgfdecoratedpathlength/4)}
                            \edef\H{\pgfmathresult/15}
                            \fill[fill=\coilcolor]
                            (b)
                            to [out=0, in=90+20] (\Thickness/2,\Thickness*\ArCorr/1.5)
                            -- (\Thickness*\ArCorr,\Thickness*\ArCorr/1.5)
                            -- (0,0)
                            -- (-\Thickness*\ArCorr,\Thickness*\ArCorr/1.5)
                            -- (-\Thickness/2,\Thickness*\ArCorr/1.5)
                            to [out=90+20, in=0] ($(b)+(0,-1pt)$)
                            -- (b);
                        \end{scope}
                    }
                }
            }
        }
        ]
        %Creating a weel for all cars
        \def\Weel#1{%\Weel{position}
            \draw[fill=white,shift={(#1)}](0,0)circle (0.3);
            \draw[fill=black!80, even odd rule,shift={(#1)}](0,0) circle (.3) circle (0.2);
            \draw[fill,shift={(#1)}](0,0) circle (0.08);
            \foreach \i in {1,...,12}{\draw[fill,shift={(#1)}](30*\i:0.1)--(30*\i:0.2)--+(90+30*\i:0.02);}        
        }
        
        \def\DuckCar#1#2#3#4[#5]{ %\OrigCAr{position}{orientation~restrcited~values~1~or~-1}{rotation}{color}[ID]
            \begin{scope}[shift={(#1)},xscale=#2,rotate=#3]
                \draw(0,0) coordinate (#5);
                \draw(0,2.2) node[minimum width=5em](#5-top){};%<--Added a point on top named nodename-top
                \shuffleducks\duck[\randomhead,scale=0.8,xshift=-3em,yshift=0.5em];
                \Weel{0.6,0.3}
                \Weel{-0.6,0.3}
                \ifnum#2=-1{\draw(0,0)++(0,2em)node[draw, rounded corners, rotate=-#3, font=\sf\tiny]{#5};}\fi
                \ifnum#2=1{\draw(0,0)++(0,2em)node[draw, rounded corners, rotate=#3, font=\sf\tiny]{#5};}\fi               
            \end{scope}
        }
        
        % drawing the Cars 
        \DuckCar{0,0}{-1}{0}{}[CAR-1]
        \DuckCar{$(CAR-1)+(4,0)$}{-1}{0}{}[CAR-2]
        \DuckCar{$(CAR-2)+(4,0)$}{-1}{0}{}[CAR-3]
        \DuckCar{$(CAR-3)+(4,0)$}{-1}{0}{}[CAR-4]
        \draw($(CAR-4)+(3,0)$) node[scale=3]{$\dots$};
        \draw($(CAR-4)+(6,1)$) node[scale=2.5, draw, thick](L){\scriptsize Leader};
        \Weel{$(L)+(-0.8,-0.7)$}
        \Weel{$(L)+(0.8,-0.7)$}
        
        \draw($(CAR-2)+(0,4)$) node[scale=2.5, draw, thick](C){\scriptsize Controller l};
        
        %Drawing some Arrows
        \draw[Arrow={cyan!40!blue}{1.2}](CAR-1-top.150) |- ($(C)+(-1,2)$) -| (C.150);
        \draw[Arrow={cyan!40!blue}{1.2}](CAR-2-top.150) coordinate (temp) -- (C.-90-|temp);
        \draw[Arrow={cyan!40!blue}{1.2}]($(L.90)+(0,0.5em)$) |- ($(C)+(1,2)$) -| (C.120);
        \draw[Arrow={cyan!40!blue}{1.2}](CAR-4-top.150) |- ($(C)+(1,1.5)$) -| (C.60);
        \draw[Arrow={cyan!40!blue}{1.2}](CAR-3-top.150) |- ($(C)+(1,1)$) -| (C.30);
        %Drawing some repetitive things
        \foreach \txbehind/\Car [count=\j from 1]in {
            i+1/CAR-1,
            node\quad i/CAR-2,
            i-1/CAR-3,
            i-2/CAR-4,
            0/L%
        }{
            \path($(CAR-1)+(0,-0.5)$)coordinate (temp) -- (temp-|\Car.-90) node []{$\txbehind$};
            \ifnum\j<5\draw[Arrow={cyan!40!blue}{1}]($(\Car-top.30)+(0,1)$) -- ++(0,-1)node [midway, anchor=-180]{$U_{\txbehind}$};\fi
            \ifnum\j<4{}\draw[Arrow={red}{1}]($(\Car)+(1.25,0.5)$) -- ++(0.75,0)node [midway, anchor=90]{$V_{\txbehind}$};\fi
        }
    
        \draw[Arrow2=-1,CoilColor=black,Thickness=2mm,W=1.5cm,ArCorr=1.5] ($(CAR-2)+(-0.4,1.5)$) -- ($(CAR-1)+(0.8,1.5)$);
        \draw(b)++(0,0.7em) node {$\tilde{U}_{i+1}$};
        \draw[Arrow2=-1,CoilColor=black,Thickness=2mm,W=1.5cm,ArCorr=1.5] ($(CAR-3)+(-0.4,1.5)$) -- ($(CAR-2)+(0.8,1.5)$);
        \draw(b)++(0,0.7em) node {$\tilde{U}_i$};
        \draw[Arrow2=-1,CoilColor=black,Thickness=2mm,W=1.5cm,ArCorr=1.5] ($(CAR-4)+(-0.4,1.5)$) -- ($(CAR-3)+(0.8,1.5)$);
        \draw(b)++(0,0.7em) node {$\tilde{U}_{i-1}$};
                
    \end{tikzpicture}
\end{document}

相关内容