I am trying to draw an helicoid and to fill the area below the curve. Since the aim of the figure is just to "give an idea", I would prefer to keep it simple and to avoid using PGFplots and GNUplot -- with which I am not familiar.

Referring to the MWE below, I drew the curve and the shading, but the latter does not seem right for negative values of x, i.e. the horizontal direction. Thus I am asking how to make it right.

Moreover, I would like to draw lines starting from the axis of the helicoid, i.e. the z axis in TikZ coordinate system, to the corresponding point on the helicoid itself. The piece of code I commented out should serve this purpose, but it does not work as it is now.

Can someone help me?

  \draw [name path=E-wave] [red,thick,->] plot [domain=0:13,samples=100] ({sin(\x r)},{cos(\x r)},\x);
  \fill [red,fill opacity=0.2] (0,0,0) -- plot [domain=0:13,samples=100] ({sin(\x r)},{cos(\x r)},\x) -- (0,0,13) -- cycle;
  %\foreach [evaluate={\xpos=1.1*sin(\zpos*180/pi);\ypos=1.1*cos(\zpos*180/pi);}] \zpos in {0,0.25*pi,...,4*pi} {
  %  \path [name path=mgntd] (0,0,\zpos) --  (\xpos,\ypos,\zpos);
  %  \draw [name intersections={of=E-wave and mgntd,by={isect\zpos}}] (0,0,\zpos) -- (isect\zpos);
  \draw [->] (0,0,0) -- (0,0,14.5);

enter image description here

2 Answers 2


The main problem was that step was too small to be recognized by the intersections library (some ideas are written in the comment section). We also needed to correct a coefficient of 1.1 to get arrowheads back on the curve. The presented layout is in a way similar to this one, http://i.stack.imgur.com/mcmob.png.

%! *latex mal-helicoid.tex

\tikzset{malstyle/.style={->,>=stealth, line width=0.2pt},
  malarrow/.style={->, >=stealth}}

% The curve drawing and filling...
\draw [name path=Ewave] [red, thick, ->, fill, fill opacity=0.2] (0,0,0) -- plot [domain=0:12.5664, samples=100] ({sin(\x r)}, {cos(\x r)}, \x) -- (0,0,12.5664) --cycle;
%\fill [red, fill opacity=0.2] (0,0,0) -- plot [domain=0:12.5664, samples=100] ({sin(\x r)},{cos(\x r)},\x) -- (0,0,12.5664) -- cycle;

% Adding all kind of arrows...
\foreach [ evaluate={\xpos=sin(\zpos*180/pi); \ypos=cos(\zpos*180/pi);} ]
   \zpos in {0, 0.2618, ..., 12.5664} 
  {% Beginning of \foreach...
  \draw[malstyle, black] (0,0,\zpos) -- (\xpos, \ypos, \zpos);
  \draw[malstyle, black!40] (0,0,0) --  (\xpos, \ypos, 0);
  \draw[malstyle, green] (0,0,\zpos) --  (\xpos, 0, \zpos);
  \draw[malstyle, blue] (0,0,\zpos) --  (0, \ypos, \zpos);
  }% End of \foreach...

% Drawing the axis... (positive and negative values)
% positive
\draw [malarrow] (0,0,0) -- (0,0,14.5) node[xshift=5, yshift=15] {$z$};
\draw [malarrow] (0,0,0) -- (0,2,0) node[xshift=-5, yshift=-10] {$y$};
\draw [malarrow] (0,0,0) -- (2,0,0) node[xshift=-10, yshift=-5] {$x$};
% negative
\draw[dashed] (0,0,0)--(-2,0,0)  (0,0,0)--(0,-2,0)  (0,0,0)--(0,0,-4);


mwe, my fifth and hopefully the last attempt :-)

  • This is what I was trying to accomplish, thanks. Just two questions: 1) what do you mean by "The step was too small"? My step was 0.25*pi which is something like 0.789. 2) Why do the arrows do not have their arrowhead on the curve?
    – Pier Paolo
    Mar 29, 2014 at 17:43
  • 1
    I think you tried to reach isect\zpos, specifically e.g. isect0.78539, that's an item which is not in the set of intersection points. I would need a little more digging on this but I think you can reach isect0, isect1, isect2 if it is in the list, ... So your 0*pi was fine in theory (there could be a problem of 0 as an integer value versus 0.0 as a real value), but not the other steps. To 2) It is still a surprise to me too, I am on it.
    – Malipivo
    Mar 29, 2014 at 18:03
  • 1
    If you \let, it points to the memory address not to the actual value. You can use \pgfmathsetmacro to get the value assigned to the macro.
    – percusse
    Mar 29, 2014 at 18:06
  • @percusse Thank you for letting me know. It is good to know.
    – Malipivo
    Mar 29, 2014 at 18:07
  • 1
    You used a coefficient of 1.1 for the arrows (probably on purpose to get arrow heads more visible), but not for the curve and fill, this must be corrected somehow, e.g. by {1.1*sin(\x r)}, {1.1*cos(\x r)} (twice) or by deleting 1.1 in the main \foreach cycle (twice).
    – Malipivo
    Mar 29, 2014 at 18:22

If you want to keep it simple use a 2d representation (cycloide). Run the example with xelatex


\def\rA{1} \def\rB{2} \def\Fr{1.25 }

     {0.25 ACOS \Fr div}{0.25 ACOS \Fr div Pi 4.13 mul add}%
     {\rA*t-\rB*sin(t*\Fr) | -\rA+\rB*cos(t*\Fr)+0.5}
     {0.5}{14.5}{\rA*t-\rB*sin(t*\Fr) | -\rA+\rB*cos(t*\Fr)+0.5}

enter image description here

  • Thanks for your answer, someday I'm surely going to learn PSTricks :). Could it be possible to draw arrows from points along the axis at coordinates (0,0,a) to points on the curve at corresponding coordinates (sin a,cos a,a) for values of a given by a=pi/3+k*p/3 and k=0,1,2... ?
    – Pier Paolo
    Mar 25, 2014 at 10:20
  • Arrows are possible at the end of the curve, see my edited answer.
    – user2478
    Mar 25, 2014 at 10:29
  • I was referring to something like this.
    – Pier Paolo
    Mar 25, 2014 at 10:47
  • 1
    See tug.org/PSTricks/main.cgi?file=pst-plot/3D/examples#wave
    – user2478
    Mar 25, 2014 at 10:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.