Tengo que implementar una matriz formada por elementos cilíndricos. Sin embargo, el siguiente código solo puede proporcionar un cilindro recto (El crédito del código va a este enlace.), en su lugar me gustaría que el cilindro se module de forma periódica, por ejemplo, de forma sinusoidalsimilar al caso de este enlace. Pero parecía que no podía lograrlo. Parece que ni siquiera pude aumentar la cantidad de cilindros de uno a más (esta pregunta es una continuación de mi pregunta anterior dondeEl gato de Schrödinger dio una respuesta muy simpática). En esta pregunta el resultado difiere hasta cierto punto.
\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}
Respuesta1
Esto puede (o no) ser un paso en la dirección correcta.
\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}
O
\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}
Aunque no se trata de una decoración completa, aún puede detectar dimension too large
errores fácilmente.