Периодическая модуляция цилиндра

Периодическая модуляция цилиндра

Мне нужно реализовать массив, состоящий из цилиндрических элементов. Однако, код ниже может предоставить только прямой цилиндр (Код кредита идет по этой ссылке), вместо этого я хотел бы, чтобы цилиндр модулировался периодически, например, синусоидально.аналогично случаю этой ссылки. Но мне это не удалось. Мне даже не удалось увеличить количество цилиндров с одного на большее. (этот вопрос является продолжением моего предыдущего вопроса, гдеКот Шредингера дал очень хороший ответ). В этом вопросе вывод в некоторой степени отличается.

\documentclass[border=2mm]{standalone}
\usepackage{xcolor}
\definecolor{mycolor}{RGB}{8,108,131}
\usepackage{tikz} 
\usetikzlibrary{positioning}
\usetikzlibrary{backgrounds}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{calc}
\tikzset{cylinder end fill/.style={path picture={
            \pgftransformshift{\centerpoint}%
            \pgftransformrotate{\rotate}%  
            \pgfpathmoveto{\beforetop}%
            \pgfpatharc{90}{-270}{\xradius and \yradius}%
            \pgfpathclose
            \pgfsetfillcolor{#1}%
            \pgfusepath{fill}}
}}
\begin{document}
    \begin{tikzpicture}
    \begin{scope}[on background layer]
    \path let \p1=(0.2,8.4),
    \n1={atan2(\y1,\x1)},\n2={veclen(\y1,\x1)} in
    node[cylinder, rotate=270,
    minimum height=0.85*\n2,minimum width=1cm,aspect=1.0,
    cylinder end fill=red,
    left color=red!30,right color=black,middle color=red!80, opacity=0.7,
    draw] at (0.8,4.7) {1};
    \end{scope}
    \end{tikzpicture}
\end{document} 

введите описание изображения здесь

решение1

Это может быть (а может и нет) шагом в правильном направлении.

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{decorations} 
\newcounter{icoord}
\pgfkeys{/tikz/.cd,
    curved cylinder/.cd,
    radius/.store in=\CurvedCylinderRadius,
    radius=10pt,
    step/.store in=\CurvedCylinderStep,
    step=1pt,
    shade/.style={left color=red!30,right color=black,middle color=red!80}
}

\pgfdeclaredecoration{curved cylinder}{initial}
{% 
\state{initial}[width=\CurvedCylinderStep,next state=cont] {%
    \pgfmoveto{\pgfpoint{\CurvedCylinderStep}{\CurvedCylinderRadius}}%
    \pgfpathlineto{\pgfpoint{0.3\pgflinewidth}{\CurvedCylinderRadius}}%
    \setcounter{icoord}{0}%
    \pgfcoordinate{lastup-\number\value{icoord}}{\pgfpoint{1pt}{\CurvedCylinderRadius}}%
    \pgfcoordinate{lastdown-\number\value{icoord}}{\pgfpoint{1pt}{-1*\CurvedCylinderRadius}}%
  }
  \state{cont}[width=\CurvedCylinderStep]{%
     \stepcounter{icoord}%
     \pgfcoordinate{lastup-\number\value{icoord}}{\pgfpoint{\CurvedCylinderStep}{\CurvedCylinderRadius}}
     \pgfcoordinate{lastdown-\number\value{icoord}}{\pgfpoint{\CurvedCylinderStep}{-1*\CurvedCylinderRadius}}
     \pgfcoordinate{tmpup}{\pgfpoint{\CurvedCylinderStep+0.3pt}{\CurvedCylinderRadius}}
     \pgfcoordinate{tmpdown}{\pgfpoint{\CurvedCylinderStep+0.3pt}{-1*\CurvedCylinderRadius}}
     \pgfmathanglebetweenlines{\pgfpointanchor{lastup-\the\numexpr\value{icoord}-1}{center}}%
      {\pgfpointanchor{lastup-\number\value{icoord}}{center}}%
      {\pgfpointanchor{Y}{center}}%
      {\pgfpointanchor{O}{center}}%
     \pgfmathsetmacro\myshadingangle{\pgfmathresult}%
     \path[curved cylinder/shade,shading angle=\myshadingangle] 
        (lastup-\the\numexpr\value{icoord}-1) 
     -- (tmpup) to[out=180,in=180] (tmpdown) -- (lastdown-\the\numexpr\value{icoord}-1)
     to[out=180,in=180] cycle;%
     \pgfmoveto{\pgfpointanchor{lastup-\the\numexpr\value{icoord}-1}{center}}%
     \pgfpathlineto{\pgfpointanchor{lastup-\number\value{icoord}}{center}}%
     \pgfmoveto{\pgfpointanchor{lastdown-\the\numexpr\value{icoord}-1}{center}}%
     \pgfpathlineto{\pgfpointanchor{lastdown-\number\value{icoord}}{center}}%
  }
  \state{final}[width=\CurvedCylinderStep]
  { % perhaps unnecessary but doesn't hurt either
    \pgfmoveto{\pgfpointdecoratedpathlast}
    \fill (tmpup) to[out=0,in=0] (tmpdown) to[out=-180,in=-180] cycle;
  }
}

\begin{document}
  \begin{tikzpicture}[scale=1]
   \path (0,0) coordinate (O) (0,1) coordinate (Y);
    \draw[decorate,decoration=curved cylinder,curved cylinder/radius=1cm] 
     (0,0) to[out=90,in=-90] (1,4)  to[out=90,in=-90] (0,8);
    \draw[decorate,decoration=curved cylinder,
        curved cylinder/radius=1cm,
        curved cylinder/shade/.style={left color=blue!30,right
        color=black,middle color=blue!80},looseness=0.7] 
     (4,0) to[out=90,in=-90] (5,4)  to[out=90,in=-90] (4,8);
  \end{tikzpicture}
\end{document}

введите описание изображения здесь

Или

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{decorations} 
\newcounter{icoord}
\pgfkeys{/tikz/.cd,
    curved cylinder/.cd,
    radius/.store in=\CurvedCylinderRadius,
    radius=10pt,
    step/.store in=\CurvedCylinderStep,
    step=1pt,
    shade/.style={left color=red!30,right color=black,middle color=red!80}
}

\pgfdeclaredecoration{curved cylinder}{initial}
{% 
\state{initial}[width=\CurvedCylinderStep,next state=cont] {%
    \pgfmoveto{\pgfpoint{\CurvedCylinderStep}{\CurvedCylinderRadius}}%
    \pgfpathlineto{\pgfpoint{0.3\pgflinewidth}{\CurvedCylinderRadius}}%
    \setcounter{icoord}{0}%
    \pgfcoordinate{lastup-\number\value{icoord}}{\pgfpoint{1pt}{\CurvedCylinderRadius}}%
    \pgfcoordinate{lastdown-\number\value{icoord}}{\pgfpoint{1pt}{-1*\CurvedCylinderRadius}}%
  }
  \state{cont}[width=\CurvedCylinderStep]{%
     \stepcounter{icoord}%
     \pgfcoordinate{lastup-\number\value{icoord}}{\pgfpoint{\CurvedCylinderStep}{\CurvedCylinderRadius}}
     \pgfcoordinate{lastdown-\number\value{icoord}}{\pgfpoint{\CurvedCylinderStep}{-1*\CurvedCylinderRadius}}
     \pgfcoordinate{tmpup}{\pgfpoint{\CurvedCylinderStep+0.3pt}{\CurvedCylinderRadius}}
     \pgfcoordinate{tmpdown}{\pgfpoint{\CurvedCylinderStep+0.3pt}{-1*\CurvedCylinderRadius}}
     \pgfmathanglebetweenlines{\pgfpointanchor{lastup-\the\numexpr\value{icoord}-1}{center}}%
      {\pgfpointanchor{lastup-\number\value{icoord}}{center}}%
      {\pgfpointanchor{Y}{center}}%
      {\pgfpointanchor{O}{center}}%
     \pgfmathsetmacro\myshadingangle{\pgfmathresult}%
     \path[curved cylinder/shade,shading angle=\myshadingangle] 
        (lastup-\the\numexpr\value{icoord}-1) 
     -- (tmpup) to[out=180,in=180] (tmpdown) -- (lastdown-\the\numexpr\value{icoord}-1)
     to[out=180,in=180] cycle;%
     \pgfmoveto{\pgfpointanchor{lastup-\the\numexpr\value{icoord}-1}{center}}%
     \pgfpathlineto{\pgfpointanchor{lastup-\number\value{icoord}}{center}}%
     \pgfmoveto{\pgfpointanchor{lastdown-\the\numexpr\value{icoord}-1}{center}}%
     \pgfpathlineto{\pgfpointanchor{lastdown-\number\value{icoord}}{center}}%
  }
  \state{final}[width=\CurvedCylinderStep]
  { % perhaps unnecessary but doesn't hurt either
    \pgfmoveto{\pgfpointdecoratedpathlast}
    \fill (tmpup) to[out=0,in=0] (tmpdown) to[out=-180,in=-180] cycle;
  }
}

\begin{document}
  \begin{tikzpicture}[scale=1]
   \path (0,0) coordinate (O) (0,1) coordinate (Y);
    \draw[decorate,decoration=curved cylinder,curved cylinder/radius=1cm
    ,looseness=0.7] 
     (0,0) foreach \X in {1,2,3} 
     {to[out=90,in=-90] ++ (1,4)  to[out=90,in=-90] ++(-1,4)};
    \draw[decorate,decoration=curved cylinder,
        curved cylinder/radius=1cm,
        curved cylinder/shade/.style={left color=blue!30,right
        color=black,middle color=blue!80},looseness=0.7] 
     (6,0) foreach \X in {1,2,3} 
     {to[out=90,in=-90] ++ (-1,4)  to[out=90,in=-90] ++(1,4)};
  \end{tikzpicture}
\end{document}

введите описание изображения здесь

Хоть это и не полноценное украшение, dimension too largeошибки в нем все равно легко обнаружить.

Связанный контент