Periodische Modulation eines Zylinders

Periodische Modulation eines Zylinders

Ich muss ein Array implementieren, das aus zylinderförmigen Elementen besteht. Der folgende Code kann jedoch nur einen geraden Zylinder liefern (Der Code-Guthaben geht an diesen Link), stattdessen möchte ich, dass der Zylinder periodisch moduliert wird, zum Beispiel sinusförmigähnlich wie bei diesem Link. Aber ich hatte scheinbar keinen Erfolg. Ich konnte nicht einmal die Anzahl der Zylinder von einem auf mehr erhöhen. (Diese Frage ist eine Fortsetzung meiner vorherigen Frage, in derSchrödingers Katze gab eine sehr nette Antwort). Bei dieser Frage weicht die Ausgabe etwas ab.

\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} 

Bildbeschreibung hier eingeben

Antwort1

Dies kann ein Schritt in die richtige Richtung sein (oder auch nicht).

\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}

Bildbeschreibung hier eingeben

Oder

\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}

Bildbeschreibung hier eingeben

Obwohl es sich hierbei nicht um eine vollwertige Dekoration handelt, können dennoch dimension too largeleicht Fehler auftreten.

verwandte Informationen