使用 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}

相關內容