TikZ 装饰画一条蜿蜒或扭曲的丝带

TikZ 装饰画一条蜿蜒或扭曲的丝带

我非常喜欢 TikZ 样式和装饰,但我仍然只是尝试一下。我知道如何用样式绘制丝带,如果它们不是扭曲的。但我想定义一种样式,让丝带沿途扭曲,丝带的正面和背面应该有不同的颜色。丝带应该能够沿着弯曲的路径弯曲。这可能吗?也许通过定义装饰?或者也许可以沿着路径插入贝塞尔曲线?

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\begin{document}
    \tikzset{
        ribbon/.style={
            preaction={
                preaction={
                    draw,
                    line width=0.25cm,
                    white
                },
                draw,
                line width=0.2cm,
                black!30!#1
            },
            line width=0.15cm,
            #1
        },
        ribbon/.default=gray
    }
    Ribbons are easy, just with my previously defined style:

    \begin{tikzpicture}
        \draw[ribbon=green] (0,0) to[out=0,in=90] (2,0) to[out=270,in=270] (4,2);
        \draw[ribbon]       (0,1) to[out=30,in=150] (2,1) to[out=-30,in=120] (4,-1);
    \end{tikzpicture}

    How can I make a twisted ribbon a style?

    \newcommand{\myangle}{20}
    \begin{tikzpicture}[looseness=0.5]
        \fill[green] (0,-0.1) to[out=  0,in=180+\myangle] (2,0) to[out=180-\myangle,in=  0] (0,0.1);
        \fill[red]   (4,-0.1) to[out=180,in=   -\myangle] (2,0) to[out=    \myangle,in=180] (4,0.1);
        \draw        (0,-0.1) to[out=  0,in=180+\myangle] (2,0) to[out=    \myangle,in=180] (4,0.1);
        \node[inner sep=1.5pt,fill,white] at (2,0) {};
        \draw        (4,-0.1) to[out=180,in=   -\myangle] (2,0) to[out=180-\myangle,in=  0] (0,0.1);
    \end{tikzpicture}

    Ideally, I'd like to use this like so:
    \begin{verbatim}
        \draw[twistedribbon={red,green}] (0,0) -- (4,0);
    \end{verbatim}

\end{document}

答案1

让我们修复这个元路径。

\documentclass[border=9,tikz]{standalone}
\usetikzlibrary{decorations.pathmorphing}
\begin{document}



\tikzset{
    demo decoration/.style={
        gray,
        postaction={draw=red,decorate,decoration=#1}
    }
}
\begin{tikzpicture}[remember picture]
    \path(0,0)coordinate(A){}(3.7,0)coordinate(B){}(3.8,0)coordinate(C){};
    \draw[demo decoration=snake](A)to[bend left](B);
\end{tikzpicture}

首先,我制作了一个装饰,画了一个平行线在元路径的左边。

\pgfdeclaredecoration{stay left}{initial}{
  \state{initial}[width=0,next state=stay above]
  {\pgfpathmoveto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}}
  \state{stay above}[width=\pgfdecorationsegmentlength,next state=stay above]
  {\pgfpathlineto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}}
  \state{final}
  {
    \pgfpathlineto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}
    \pgfpathlineto{\pgfqpoint{\pgfdecoratedremainingdistance}{\pgfdecorationsegmentamplitude}}
    \pgfpathmoveto{\pgfpointdecoratedpathlast}
  }
}
\begin{tikzpicture}
    \draw[demo decoration=stay left](A)to[bend left](B);
\end{tikzpicture}

接下来我创建了另一个从左到右交叉的。

\pgfdeclaredecoration{cross from left to right}{initial}{
  \state{initial}[width=0,next state=stay above]
  {\pgfpathmoveto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}}
  \state{stay above}[width=.5\pgfdecorationsegmentlength,next state=stay above,
                     switch if less than=.5*\pgfdecoratedpathlength+\pgfdecorationsegmentlength to snake down 1]
  {\pgfpathlineto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}}
  \state{snake down 1}[width=.5\pgfdecorationsegmentlength,next state=snake down 2]
  {\pgfpathlineto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}}
  \state{snake down 2}[width=.5\pgfdecorationsegmentlength,next state=snake down 3]
  {\pgfpathlineto{\pgfqpoint{0pt}{.7\pgfdecorationsegmentamplitude}}}
  \state{snake down 3}[width=.5\pgfdecorationsegmentlength,next state=snake down 4]
  {\pgfpathlineto{\pgfqpoint{0pt}{0pt}}}
  \state{snake down 4}[width=.5\pgfdecorationsegmentlength,next state=stay below]
  {\pgfpathlineto{\pgfqpoint{0pt}{-.7\pgfdecorationsegmentamplitude}}}
  \state{stay below}[width=.5\pgfdecorationsegmentlength,next state=stay below]
  {\pgfpathlineto{\pgfqpoint{0pt}{-\pgfdecorationsegmentamplitude}}}
  \state{final}
  {
    \pgfpathlineto{\pgfqpoint{0pt}{-\pgfdecorationsegmentamplitude}}
    \pgfpathlineto{\pgfqpoint{\pgfdecoratedremainingdistance}{-\pgfdecorationsegmentamplitude}}
    \pgfpathmoveto{\pgfpointdecoratedpathlast}
  }
}
\begin{tikzpicture}
    \draw[demo decoration=cross from left to right](A)to[bend left](B);
\end{tikzpicture}

因此,如果我们用不同的方式多次绘制这样的线条,我们就会得到一条丝带。

\tikzset{
    monochromatic ribbon/.style={
        repeat decoration CFLTR/.list={-5,-4,-3,-2,-1,0,1,2,3,4,5}
    },
    repeat decoration CFLTR/.style={
        preaction={draw,decorate,decoration={cross from left to right,amplitude=#1*.5\pgflinewidth}}
    }
}
\begin{tikzpicture}
    \draw[monochromatic ribbon](A)to[bend left](B);
\end{tikzpicture}

为了使正面和背面的颜色不同,我们需要两个半丝带见面。

\pgfdeclaredecoration{cross from left to middle}{initial}{
  \state{initial}[width=0,next state=stay above]
  {\pgfpathmoveto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}}
  \state{stay above}[width=.5\pgfdecorationsegmentlength,
                     switch if less than=.5*\pgfdecoratedpathlength+\pgfdecorationsegmentlength to snake down 1]
  {\pgfpathlineto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}}
  \state{snake down 1}[width=.5\pgfdecorationsegmentlength,next state=snake down 2]
  {\pgfpathlineto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}}
  \state{snake down 2}[width=.5\pgfdecorationsegmentlength,next state=snake down 3]
  {\pgfpathlineto{\pgfqpoint{0pt}{.6\pgfdecorationsegmentamplitude}}}
  \state{snake down 3}[width=.5\pgfdecorationsegmentlength,next state=final]
  {\pgfpathlineto{\pgfqpoint{0pt}{0pt}}}
  \state{final}
  {
    \pgfpathmoveto{\pgfpointdecoratedpathlast}
  }
}
\pgfdeclaredecoration{cross from middle to right}{initial}{
  \state{initial}[width=0,next state=stay above]
  {}
  \state{stay above}[width=.5\pgfdecorationsegmentlength,
                     switch if less than=.5*\pgfdecoratedpathlength+\pgfdecorationsegmentlength to snake down 1]
  {}
  \state{snake down 1}[width=.5\pgfdecorationsegmentlength,next state=snake down 2]
  {}
  \state{snake down 2}[width=.5\pgfdecorationsegmentlength,next state=snake down 3]
  {}
  \state{snake down 3}[width=.5\pgfdecorationsegmentlength,next state=snake down 4]
  {\pgfpathmoveto{\pgfqpoint{0pt}{0pt}}}
  \state{snake down 4}[width=.5\pgfdecorationsegmentlength,next state=stay below]
  {\pgfpathlineto{\pgfqpoint{0pt}{-.7\pgfdecorationsegmentamplitude}}}
  \state{stay below}[width=.5\pgfdecorationsegmentlength,next state=stay below]
  {\pgfpathlineto{\pgfqpoint{0pt}{-\pgfdecorationsegmentamplitude}}}
  \state{final}
  {
    \pgfpathlineto{\pgfqpoint{0pt}{-\pgfdecorationsegmentamplitude}}
    \pgfpathlineto{\pgfqpoint{\pgfdecoratedremainingdistance}{-\pgfdecorationsegmentamplitude}}
    \pgfpathmoveto{\pgfpointdecoratedpathlast}
  }
}
    \begin{tikzpicture}
        \draw[demo decoration=cross from left to middle](A)to[bend left](B);
        \draw[brown,decorate,decoration=cross from middle to right](A)to[bend left](B);
    \end{tikzpicture}

用不同的颜色重复它,我们就完成了。

\tikzset{
    bichromatic ribbon/.style={
        preaction={draw,decorate,decoration={cross from left to right,amplitude=-6*.5\pgflinewidth}},
        repeat decoration CFLTM/.list={-5,-4,-3,-2,-1,0,1,2,3,4,5},
        repeat decoration CFMTR/.list={-5,-4,-3,-2,-1,0,1,2,3,4,5},
        preaction={draw,decorate,decoration={cross from left to right,amplitude=6*.5\pgflinewidth}},
    },
    repeat decoration CFLTM/.style={
        preaction={draw=blue!50,decorate,decoration={cross from left to middle,amplitude=#1*.5\pgflinewidth}}
    },
    repeat decoration CFMTR/.style={
        preaction={draw=teal!50,decorate,decoration={cross from middle to right,amplitude=#1*.5\pgflinewidth}}
    }
}
    \begin{tikzpicture}
        \path[bichromatic ribbon](A)to[bend left](B);
    \end{tikzpicture}



\end{document}

相关内容