# How to fit the filling pattern to the z axis in tikz?

Hello as you can see in the following image on the right is the outputted image and my desired image is hand drawn on the left. How do I make the fill pattern of the sine/cosine curve on the yz plane (horizontal) go vertical in the yz plane rather than vertical in the xy plane

Here is the code for you to have a look at

\documentclass[tikz,margin=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{patterns}

\begin{document}
\begin{tikzpicture}[xscale=1]
\draw[->] (0,0,0) -- (10.5,0,0);
\draw[->] (0,0,0) -- (0,1.5,0);
\draw[->] (0,0,0) -- (0,0,1.5);
\draw[pattern=vertical lines] (0,0,0) -- (0,1,0) cos (2,0,0) sin (3,-1,0) cos (4,0,0) sin (5,1,0) cos (6,0,0) sin (7,-1,0) cos (8,0,0) sin (9,1,0) cos (10,0,0);
\draw[pattern=vertical lines] (0,0,0) -- (0,0,1) cos (2,0,0) sin (3,0,-1) cos (4,0,0) sin (5,0,1) cos (6,0,0) sin (7,0,-1) cos (8,0,0) sin (9,0,1) cos (10,0,0);
\end{tikzpicture}
\end{document}


EDIT: something other than use north east lines, so that if I decide to rotate the view it will still appear correctly

Here is an alternative to Zarko's nice answer with shorter code and a more wave-like wave, i.e. the first maximum as wide as the other ones.

\documentclass[tikz,margin=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{patterns}

\begin{document}
\begin{tikzpicture}
\draw[->] (0,0,0) -- (10.5,0,0);
\draw[->] (0,0,0) -- (0,1.5,0);
\draw[->] (0,0,0) -- (0,0,1.5);
\draw[pattern=vertical lines] (0,0,0) -- plot[variable=\x,domain=0:10,samples=72] (\x,{cos(72*\x)},0)
-- (10,0,0) -- cycle;
\draw[pattern=north east lines] (0,0,0) -- plot[variable=\x,domain=0:10,samples=72] (\x,0,{cos(72*\x)}) -- (10,0,0) -- cycle;
\end{tikzpicture}
\end{document}


EDIT: Just saw your comment under Zarko's nice answer. Probably Zarko means the tikz-3dplot package, the link is correct, and here is an animation illustrating his point.

\documentclass[tikz,margin=3.14mm]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{patterns}

\begin{document}
\foreach \X in {0,5,...,355}{
\tdplotsetmaincoords{70}{\X}
\begin{tikzpicture}
\path[use as bounding box] (-5.5,-3) rectangle (5.5,3);
\begin{scope}[tdplot_main_coords,scale=0.5]
\draw[->] (0,0,0) -- (10.5,0,0);
\draw[->] (0,0,0) -- (0,1.5,0);
\draw[->] (0,0,0) -- (0,0,1.5);
\draw[pattern=vertical lines] (0,0,0) -- plot[variable=\x,domain=0:10,samples=72] (\x,{cos(72*\x)},0)
-- (10,0,0) -- cycle;
\draw[pattern=north east lines] (0,0,0) -- plot[variable=\x,domain=0:10,samples=72] (\x,0,{cos(72*\x)}) -- (10,0,0) -- cycle;
\end{scope}
\end{tikzpicture}%
}
\end{document}


In order to have more flexible rotations, you may want to look at both answers to this question.

2ND EDIT: Without patterns it might be look a bit better even.

\documentclass[tikz,margin=3.14mm]{standalone}
\usepackage{tikz-3dplot}

\begin{document}
\foreach \X in {0,5,...,355}{
\tdplotsetmaincoords{70}{\X}
\begin{tikzpicture}
\path[use as bounding box] (-5.5,-3) rectangle (5.5,3);
\begin{scope}[tdplot_main_coords,scale=0.5]
\draw[->] (0,0,0) -- (10.5,0,0);
\draw[->] (0,0,0) -- (0,1.5,0);
\draw[->] (0,0,0) -- (0,0,1.5);
\draw (0,0,0) -- plot[variable=\x,domain=0:10,samples=72,smooth] (\x,{cos(72*\x)},0)
-- (10,0,0) -- cycle;
\draw (0,0,0) -- plot[variable=\x,domain=0:10,samples=72,smooth] (\x,0,{cos(72*\x)}) -- (10,0,0) -- cycle;
\foreach \Y in {0,0.2,...,10}
{\draw[thin] (\Y,0,0) -- (\Y,{cos(72*\Y)},0);
\draw[thin] (\Y,0,0) -- (\Y,0,{cos(72*\Y)});}
\end{scope}
\end{tikzpicture}%
}
\end{document}


• I did not want to post spoilers in the chat room, but here a preview: i.stack.imgur.com/rimNv.png – user36296 Jul 21 '18 at 14:40
• @samcarter Soo nice of you!! (Perhaps add whiskers and teeth ? ;-) – marmot Jul 21 '18 at 14:42
• I'll save all the advanced options for the tikzmarmots talk at TUG19 :) – user36296 Jul 21 '18 at 14:45
• @samcarter Oh my god, this means that I should not have given away my crystal ball, otherwise I'd have known that... ;-) – marmot Jul 21 '18 at 14:46
• @marmot, yes, i meant tikz-3dplot (link has correct name) :-). very good animations! (+1) ! – Zarko Jul 21 '18 at 18:16

is close enough?

for available patterns see "TikZ & PGF manual, 3.0.1a", page 666: there is also listed <north east lines which is closed to what you looking for:

\documentclass[tikz,margin=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{patterns}

\begin{document}
\begin{tikzpicture}
\draw[->] (0,0,0) -- (10.5,0,0);
\draw[->] (0,0,0) -- (0,1.5,0);
\draw[->] (0,0,0) -- (0,0,1.5);
\draw[pattern=vertical lines] (0,0,0) -- (0,1,0) cos (2,0,0) sin (3,-1,0) cos (4,0,0) sin (5,1,0) cos (6,0,0) sin (7,-1,0) cos (8,0,0) sin (9,1,0) cos (10,0,0);
\draw[pattern=north east lines] (0,0,0) -- (0,0,1) cos (2,0,0) sin (3,0,-1) cos (4,0,0) sin (5,0,1) cos (6,0,0) sin (7,0,-1) cos (8,0,0) sin (9,0,1) cos (10,0,0);
\end{tikzpicture}
\end{document}

• Is there something that does it in the plane so that even if I rotate the image in 3D it still works? – sab hoque Jul 21 '18 at 11:37
• @sabhoque, check tikz-3D (ctan.org/pkg/tikz-3dplot?lang=en). – Zarko Jul 21 '18 at 14:01

I defined three new patterns, x lines, y lines, and z lines that work well with the tikz-3dplot package (actually, the tikz-3dplot with at least the \tdplotsetmaincoords command is needed for these patterns to function well).

You can check the code to see how it works, but don't hesitate to ask me :)

PS. I also used @marmot's method of plotting the sine waves such that they remain good looking when rotated in 3D.

\documentclass[tikz,margin=2mm]{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usetikzlibrary{patterns}

\makeatletter
\newlength\zlines@x
\newlength\zlines@y
\newlength\ylines@x
\newlength\ylines@y
\newlength\xlines@x
\newlength\xlines@y

\pgfmathsetmacro\linesep{5}

\tikzset{
x lines vector/.code={
\pgfextractx\xlines@x{#1}
\pgfextracty\xlines@y{#1}
\pgfmathparse{ifthenelse(\xlines@x == 0 || abs(\xlines@x) < abs(\xlines@y) || \xlines@y == 0,"\linesep pt","\linesep*\xlines@x/\xlines@y")}
\pgfmathsetlengthmacro\xlines@width{\pgfmathresult}
\pgfmathparse{ifthenelse(\xlines@x == 0 || abs(\xlines@x) > abs(\xlines@y) || \xlines@y == 0,"\linesep pt","\linesep*\xlines@y/\xlines@x")}
\pgfmathsetlengthmacro\xlines@height{\pgfmathresult}
\pgfmathsetlengthmacro\xlines@vector@x{10*\xlines@x}
\pgfmathsetlengthmacro\xlines@vector@y{10*\xlines@y}
},
y lines vector/.code={
\pgfextractx\ylines@x{#1}
\pgfextracty\ylines@y{#1}
\pgfmathparse{ifthenelse(\ylines@x == 0 || abs(\ylines@x) < abs(\ylines@y) || \ylines@y == 0,"\linesep pt","\linesep*\ylines@x/\ylines@y")}
\pgfmathsetlengthmacro\ylines@width{\pgfmathresult}
\pgfmathparse{ifthenelse(\ylines@x == 0 || abs(\ylines@x) > abs(\ylines@y) || \ylines@y == 0,"\linesep pt","\linesep*\ylines@y/\ylines@x")}
\pgfmathsetlengthmacro\ylines@height{\pgfmathresult}
\pgfmathsetlengthmacro\ylines@vector@x{10*\ylines@x}
\pgfmathsetlengthmacro\ylines@vector@y{10*\ylines@y}
},
z lines vector/.code={
\pgfextractx\zlines@x{#1}
\pgfextracty\zlines@y{#1}
\pgfmathparse{ifthenelse(\zlines@x == 0 || abs(\zlines@x) < abs(\zlines@y) || \zlines@y == 0,"\linesep pt","\linesep*\zlines@x/\zlines@y")}
\pgfmathsetlengthmacro\zlines@width{\pgfmathresult}
\pgfmathparse{ifthenelse(\zlines@x == 0 || abs(\zlines@x) > abs(\zlines@y) || \zlines@y == 0,"\linesep pt","\linesep*\zlines@y/\zlines@x")}
\pgfmathsetlengthmacro\zlines@height{\pgfmathresult}
\pgfmathsetlengthmacro\zlines@vector@x{10*\zlines@x}
\pgfmathsetlengthmacro\zlines@vector@y{10*\zlines@y}
},
x/.forward to=/tikz/x lines vector,
y/.forward to=/tikz/y lines vector,
z/.forward to=/tikz/z lines vector,
}

\pgfdeclarepatternformonly[\xlines@vector@x,\xlines@vector@y,\xlines@width,\xlines@height]{x lines}
{\pgfpoint{-0.6*\xlines@width}{-0.6*\xlines@height}}
{\pgfpoint{0.6*\xlines@width}{0.6*\xlines@height}}
{\pgfpoint{\xlines@width}{\xlines@height}}
{
\pgfpathmoveto{\pgfpoint{-\xlines@vector@x}{-\xlines@vector@y}}
\pgfpathlineto{\pgfpoint{\xlines@vector@x}{\xlines@vector@y}}
\pgfsetlinewidth{0.3pt}
\pgfusepath{stroke}
}
\pgfdeclarepatternformonly[\ylines@vector@x,\ylines@vector@y,\ylines@width,\ylines@height]{y lines}
{\pgfpoint{-0.6*\ylines@width}{-0.6*\ylines@height}}
{\pgfpoint{0.6*\ylines@width}{0.6*\ylines@height}}
{\pgfpoint{\ylines@width}{\ylines@height}}
{
\pgfpathmoveto{\pgfpoint{-\ylines@vector@x}{-\ylines@vector@y}}
\pgfpathlineto{\pgfpoint{\ylines@vector@x}{\ylines@vector@y}}
\pgfsetlinewidth{0.3pt}
\pgfusepath{stroke}
}
\pgfdeclarepatternformonly[\zlines@vector@x,\zlines@vector@y,\zlines@width,\zlines@height]{z lines}
{\pgfpoint{-0.6*\zlines@width}{-0.6*\zlines@height}}
{\pgfpoint{0.6*\zlines@width}{0.6*\zlines@height}}
{\pgfpoint{\zlines@width}{\zlines@height}}
{
\pgfpathmoveto{\pgfpoint{-\zlines@vector@x}{-\zlines@vector@y}}
\pgfpathlineto{\pgfpoint{\zlines@vector@x}{\zlines@vector@y}}
\pgfsetlinewidth{0.3pt}
\pgfusepath{stroke}
}
\makeatother

\begin{document}
\foreach \rotation in {30,50,...,360}{
\tdplotsetmaincoords{70}{\rotation}
\begin{tikzpicture}
\clip (-11,-4) rectangle (11,4);
\tdplotsetrotatedcoords{0}{0}{0}
\begin{scope}[xscale=1,tdplot_main_coords,tdplot_rotated_coords]
\draw[->,red]   (0,0,0) -- (10.5,0,0);
\draw[->,green] (0,0,0) -- (0,1.5,0);
\draw[->,blue]  (0,0,0) -- (0,0,1.5);

\draw[pattern=y lines] (0,0,0) -- (0,1,0)  --plot[domain=0:2.25*360,samples=30,smooth] ({10*\x/(2.25*360)},{cos(\x)},{0}) -- cycle;
\draw[pattern=z lines] (0,0,0) -- (0,0,1)  --plot[domain=0:2.25*360,samples=30,smooth] ({10*\x/(2.25*360)},{0},{cos(\x)}) -- cycle;
\end{scope}
\end{tikzpicture}
}
\end{document}