20

I need to make a very simple cone with h and r (like the picture I've uploaded as example) and I can't find it in previous questions.

Simple cone

2

5 Answers 5

22

With arc

 \documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{calc}
\begin{document}
  \begin{tikzpicture}
    \draw[dashed] (0,0) arc (170:10:2cm and 0.4cm)coordinate[pos=0] (a);
    \draw (0,0) arc (-170:-10:2cm and 0.4cm)coordinate (b);
    \draw[densely dashed] ([yshift=4cm]$(a)!0.5!(b)$) -- node[right,font=\footnotesize] {$h$}coordinate[pos=0.95] (aa)($(a)!0.5!(b)$)
                            -- node[above,font=\footnotesize] {$r$}coordinate[pos=0.1] (bb) (b);
    \draw (aa) -| (bb);
    \draw (a) -- ([yshift=4cm]$(a)!0.5!(b)$) -- (b);
  \end{tikzpicture}
\end{document}

enter image description here

With ellipse

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{calc}
\begin{document}
  \begin{tikzpicture}
    \begin{scope}
     \clip (-2,0) rectangle (2,1cm);
    \draw[dashed] (0,0) circle(2cm and 0.35cm);
    \end{scope}
    \begin{scope}
     \clip (-2,0) rectangle (2,-1cm);
    \draw (0,0) circle(2cm and 0.35cm);
    \end{scope}
    \draw[densely dashed] (0,4) -- node[right,font=\footnotesize] {$h$}coordinate[pos=0.95] (aa)(0,0)
                            -- node[above,font=\footnotesize] {$r$}coordinate[pos=0.1] (bb) (2,0);
    \draw (aa) -| (bb);
    \draw (-2,0) -- (0,4) -- (2,0);
  \end{tikzpicture}
\end{document}

enter image description here

Gonzalo has kindly provided the shadings to the cylinder and I am reproducing his code (with thanks):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shadings}

\begin{document}

\begin{tikzpicture}
\fill[
  top color=gray!50,
  bottom color=gray!10,
  shading=axis,
  opacity=0.25
  ] 
  (0,0) circle (2cm and 0.5cm);
\fill[
  left color=gray!50!black,
  right color=gray!50!black,
  middle color=gray!50,
  shading=axis,
  opacity=0.25
  ] 
  (2,0) -- (0,6) -- (-2,0) arc (180:360:2cm and 0.5cm);
\draw 
  (-2,0) arc (180:360:2cm and 0.5cm) -- (0,6) -- cycle;
\draw[dashed]
  (-2,0) arc (180:0:2cm and 0.5cm);
\draw[dashed]
  (2,0) -- node[below] {$r$} (0,0) -- node[left] {h} (0,6) ;
\draw 
  (0,8pt) -- ++(8pt,0) -- (8pt,0);   
\end{tikzpicture}

\end{document}

enter image description here

3
  • Since you answered providing two options, perhaps you could add a new option with shadings as in my answer? I see no point in giving almost the same code in two different answers. Apr 13, 2014 at 1:47
  • @GonzaloMedina Thanks and I used your code as such as I felt that it is good. thank you.
    – user11232
    Apr 13, 2014 at 15:12
  • There is an unpleasant mistake at the base since the sides should be tangent to the bottom ellipse and in this case they are not. Drawing a larger the problem gets bigger. Sep 29, 2016 at 16:31
11

This requires a mathematician. You need to calculate the points of tangency and then connect the vertex of the cone to those points, not to the ends of the major axis. If the ellipse has its major axis from (-a,0) to (a,0), its minor axis from (0,-b) to (b,0), and its vertex at (0,h) (with h>b), then one point of tangency is (a*sqrt(1-(b/h)^2), b*(b/h)) and the other is the same but with its x-coordinate negated.

Here is MetaPost code to draw the cone correctly:

beginfig(1)
a:=2in; b:=.5in; h:= 3in; % for example
draw fullcircle xscaled 2a yscaled 2b; % a x b ellipse
pair Z[];
Z2 := (0,h); % vertex
Z1 := (a*sqrt(1 - (b/h)*(b/h)),b*(b/h)); % right tangency
Z3 := (-xpart Z1, ypart Z1); % left tangency
draw Z1--Z2--Z3;
endfig;
end

I don't use TikZ, so I will let others provide a translation if necessary. (And provide for the dashed portions.)

0
10

Dan's solution translated to TikZ:

\documentclass[tikz,border=2mm]{standalone} 
\usetikzlibrary{positioning, calc}

\begin{document}

\begin{tikzpicture}

\newcommand{\radiusx}{2}
\newcommand{\radiusy}{.5}
\newcommand{\height}{6}

\coordinate (a) at (-{\radiusx*sqrt(1-(\radiusy/\height)*(\radiusy/\height))},{\radiusy*(\radiusy/\height)});

\coordinate (b) at ({\radiusx*sqrt(1-(\radiusy/\height)*(\radiusy/\height))},{\radiusy*(\radiusy/\height)});

\draw[fill=gray!30] (a)--(0,\height)--(b)--cycle;

\fill[gray!50] circle (\radiusx{} and \radiusy);

\begin{scope}
\clip ([xshift=-2mm]a) rectangle ($(b)+(1mm,-2*\radiusy)$);
\draw circle (\radiusx{} and \radiusy);
\end{scope}

\begin{scope}
\clip ([xshift=-2mm]a) rectangle ($(b)+(1mm,2*\radiusy)$);
\draw[dashed] circle (\radiusx{} and \radiusy);
\end{scope}

\draw[dashed] (0,\height)|-(\radiusx,0) node[right, pos=.25]{$h$} node[above,pos=.75]{$r$};

\draw (0,.15)-|(.15,0);
\end{tikzpicture}
\end{document}

enter image description here

0
5

Just for fun with PSTricks.

\documentclass[pstricks,border=12pt,12pt]{standalone}
\usepackage{pst-node}
\begin{document}
\begin{pspicture}[dimen=m](8,10)
    \psellipticarc[linestyle=dashed](4,1)(4,.65){0}{180}
    \psellipticarcn(4,1)(4,.65){0}{180}
    \psline[linecap=0](0,1)(4,10)(8,1)
    \pcline[linestyle=dashed](4,10)(4,1)\naput{$h$}
    \pcline[linestyle=dashed](4,1)(8,1)\naput{$r$}
    \rput(4,1){\psline(0,9pt)(9pt,9pt)(9pt,0)}
\end{pspicture}
\end{document}

enter image description here

1
  • There is an unpleasant mistake at the basis since the sides should be tangent to the bottom ellipse and in this case they are not. Drawing a larger the problem gets bigger. Sep 29, 2016 at 16:30
1

I arrived here looking for a way to draw a light cone in TikZ, so here's the one I made using Dan's answer:

\documentclass[tikz]{standalone}

\begin{document}

\begin{tikzpicture}
  \def\b{0.2} % semi-minor axis
  \pgfmathsetmacro{\h}{(1 + sqrt(1 + 4*\b^2)) / 2}
  \pgfmathsetmacro{\a}{sqrt(\h)}
  \draw (-1, -1) -- (1,  1);
  \draw (-1,  1) -- (1, -1);
  \draw (0,  \h) ellipse [x radius = \a, y radius = \b];
  \draw (0, -\h) ellipse [x radius = \a, y radius = \b];
\end{tikzpicture}

\end{document}

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .